Audio 如何及时填充ALSA缓冲区

Audio 如何及时填充ALSA缓冲区,audio,synchronization,real-time,alsa,Audio,Synchronization,Real Time,Alsa,ALSA使用写入功能填充循环缓冲区,然后声卡播放样本并排空缓冲区。应用程序负责用流的下一个片段重新填充缓冲区。如果应用程序填充缓冲区以降低速度,则音乐中会出现间隙。若应用程序将其填充到快速尚未播放的样本,则会被新样本覆盖,因为缓冲区是循环的 我的问题是如何知道何时应该重新填充缓冲区以及填充多少。是否存在alsa定义的某些事件或其他技术?当PCM设备处于阻塞模式(默认设置)时,snd_PCM_write*()将等待所有字节实际写入缓冲区。未打印的样本永远不会被覆盖 当PCM设备处于非阻塞模式时,s

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


我的问题是如何知道何时应该重新填充缓冲区以及填充多少。是否存在alsa定义的某些事件或其他技术?

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


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

轮询占用大量处理器时间。alsa是否有基于回调的解决方案?
poll()
不是轮询。实际上,在给定超时0时,轮询将轮询。但当超时大于0时,它将阻塞。