如何及时填写ALSA缓冲区

时间:2016-08-29 20:47:38

标签: audio synchronization real-time alsa

ALSA使用写入功能填充循环缓冲区,然后声卡播放样本并排空缓冲区。应用程序负责使用流的下一个片段重新填充缓冲区。如果应用程序应用程序填充缓冲区减慢音乐中存在空白。如果应用程序将其填充为快速尚未播放的样本,则会被新的样本覆盖,因为缓冲区是循环的。

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

1 个答案:

答案 0 :(得分:2)

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

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