小さなバッファサイズ(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_LEN
が48000
であれば、このコードは正常に動作し、1秒続く正弦波を生成します。
FRAMES_LEN
が1920
の場合、正弦波はまったく聞こえませんが、ログにはWrote 1920 frames
と表示されます。
何が起こっていますか?
40ミリ秒は非常に短い時間であり、あなたは、ほとんどのポップを聞いたり、クリックします。 – Jason
まだ250msの時間がないので、12,000フレームの音が聞こえません。 – kburbach
FRAMES_LENを48,000から2,000に減らしてみてください。 –