当缓冲区较小(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_LEN48000,则此代码可以正常工作并产生持续1秒的正弦波。

如果FRAMES_LEN1920,我根本听不到正弦波,但是日志显示为Wrote 1920 frames

怎么了?

最佳答案

如果存在任何长度大于等于1920帧的过滤器的后处理,这是合理的。例如,这种过滤可以丢弃任何喀哒声。使用ALSA而不是仅与D / A转换器通信的全部原因是要进行音频特定的处理。

08-16 21:11