2016-05-18 16 views
2

小さなバッファサイズ(1920フレーム)を使用するとサウンド出力に問題があります。 48kHzでサンプリングし、バッファサイズを480000にすると、正弦波が1秒間正しく再生されます。私がしたいのは40msの正弦波だけです。大きなバッファサイズが再生され、小さいサイズがありません

私はこれを48000 samples/sec * 1sec/1000ms * 40ms = 1920 framesと計算しました。しかし、私はsnd_pcm_writeiに1920フレームだけを呼び出すと何も出てこない!ここで

は、問題のコードです:

void PCM::playSound(float freqHz, uint16_t durationMs) 
{ 
    int FRAMES_LEN=48000; 

    //Send the sine_buffer to sound card, with correct buffer length 
    snd_pcm_sframes_t frames = snd_pcm_writei(handle, sine_buffer, FRAMES_LEN); 

    if (frames < 0){ 
     HW_INFO() << "PCM::playSound-- snd_pcm_writei failed,trying to recover:" 
        << snd_strerror(frames); 
     frames = snd_pcm_recover(handle, frames, 0); 
    } 
    if (frames < 0) { 
     HW_INFO() << "PCM::playSound-- snd_pcm_writei recovery failed: " 
        << snd_strerror(frames); 
    } 
    HW_INFO() << "Wrote " << frames << " frames"; 

    return; 
} 

FRAMES_LEN48000であれば、このコードは正常に動作し、1秒続く正弦波を生成します。

FRAMES_LEN1920の場合、正弦波はまったく聞こえませんが、ログにはWrote 1920 framesと表示されます。

何が起こっていますか?

+3

40ミリ秒は非常に短い時間であり、あなたは、ほとんどのポップを聞いたり、クリックします。 – Jason

+0

まだ250msの時間がないので、12,000フレームの音が聞こえません。 – kburbach

+3

FRAMES_LENを48,000から2,000に減らしてみてください。 –

答えて

0

これは、長さ> 1920フレームのフィルタで後処理が行われている場合には合理的です。そのようなフィルタリングは、例えば、あらゆるクリック音を落とすことができる。 D/Aコンバータとの対話だけでなく、ALSAを使用する理由は、オーディオ固有の処理を行うことです。

0

あなたのログはあなたに嘘をついていません。あなたはデバイスに1920サンプルを書き込むよう依頼しました。 48000サンプルの実験で1秒間持続するサウンドが再生されたため、ハードウェアは48 kHzで動作している必要があります。つまり、1920フレームは1秒間に4分の1の時間を過ごすと仮定します。あなたの正弦波バッファーのサインの周波数に応じて、あなたはそれを聞かないかもしれません。ここで

は、より深い議論です:https://sound.stackexchange.com/q/28163