ALSA 使用写函数填充循环缓冲区,然后声卡播放样本并清空缓冲区。应用程序负责用流的下一个片段重新填充缓冲区。如果应用程序填充缓冲区以减慢音乐中的间隙。如果应用程序将其填充到快速但尚未播放的样本将被新样本覆盖,因为缓冲区是循环的。
我的问题是我怎么知道什么时候应该重新填充缓冲区以及填充多少。是否有一些事件是由 alsa 或其他技术定义的?
最佳答案
当 PCM 设备处于阻塞模式(默认)时,snd_pcm_write*()
将等待所有字节实际写入缓冲区。未播放的样本永远不会被覆盖。
当 PCM 设备处于非阻塞模式时,snd_pcm_write*()
将返回实际写入了多少帧(如果缓冲区已满,则返回 -EAGAIN)。要等待一些空间变得可用,请使用 poll()
,它允许使用等待多种类型事件的事件循环。 (有关详细信息,请参阅 that answer。)
关于audio - 如何及时填充ALSA缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39214927/