如何及时填充ALSA缓冲区

How to fill ALSA buffer in timely manner

ALSA 使用写函数填充循环缓冲区,然后声卡播放样本并清空缓冲区。应用程序负责用流的下一个片段重新填充缓冲区。如果应用程序填充缓冲区以减慢音乐中的间隙。如果应用程序将其填充到快速但尚未播放的样本会被新样本覆盖,因为缓冲区是循环的。

我的问题是我怎么知道什么时候应该重新填充缓冲区以及填充多少。是否有一些事件是由 alsa 或其他技术定义的?

当 PCM 设备处于阻塞模式(默认)时,snd_pcm_write*() 将等待所有字节实际写入缓冲区。未播放的样本永远不会被覆盖。

当 PCM 设备处于非阻塞模式时,snd_pcm_write*() 将 return 实际写入了多少帧(或者 return -EAGAIN 如果缓冲区已满) .要等待某些 space 可用,请使用 poll(),它允许使用等待多种类型事件的事件循环。 (有关详细信息,请参阅 that answer。)