当缓冲区较小(1920帧)时,获取声音输出时出现问题。如果我在48kHz
处采样并使缓冲区大小为480000
,则正弦波将正确播放1秒钟。我想做的只是播放40ms
的正弦波。
我已经计算出它是48000 samples/sec * 1sec/1000ms * 40ms = 1920 frames
。但是,当我尝试仅以1920帧调用snd_pcm_writei
时,什么都不会发出!
这是有问题的代码:
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
。怎么了?
最佳答案
如果存在任何长度大于等于1920帧的过滤器的后处理,这是合理的。例如,这种过滤可以丢弃任何喀哒声。使用ALSA而不是仅与D / A转换器通信的全部原因是要进行音频特定的处理。