【问题标题】:How to fill ALSA buffer in timely manner如何及时填充 ALSA 缓冲区
【发布时间】:2017-01-05 23:55:36
【问题描述】:

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

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

【问题讨论】:

    标签: audio synchronization real-time alsa


    【解决方案1】:

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

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

    【讨论】:

    • 轮询会占用大量处理器时间。 alsa 有基于回调的解决方案吗?
    • poll() 没有轮询。
    • 实际上 poll 会在给定超时 0 时进行轮询。当超时大于 0 时它会阻塞。
    猜你喜欢
    • 2013-09-02
    • 2021-12-22
    • 2012-02-04
    • 2011-02-20
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多