alsa - 管理非阻塞流
Posted
技术标签:
【中文标题】alsa - 管理非阻塞流【英文标题】:alsa - managing non-blocking stream 【发布时间】:2013-02-14 16:14:22 【问题描述】:使用不断输出数据的 USB 音频设备(它是具有多个通道的 HID)。
我希望实现的是在设备发出信号之前忽略音频。那时我会开始监控提要。来自设备的第二个信号表明我可以重新忽略数据。我已经在非阻塞模式下打开了该设备,因此它不会干扰其他 USB 信号进入。
除了当我开始读取数据(通过snd_pcm_readi
)时,我得到一个 EPIPE 错误,表明缓冲区溢出。这可以通过每次调用snd_pcm_prepare
来解决,但我希望有一种方法可以让缓冲区清空而我忽略它。
我查看了snd_pcm_drain
和snd_pcm_drop
,但它们阻止了 PCM,我宁愿让它保持打开状态。
建议?
【问题讨论】:
为什么要保持 PCM 设备运行?您是否测量到snd_pcm_start
的延迟太高?
嗯 - 这是一个很好的问题。也许我可以通过简单地忽略它..好吧..忽略它..
【参考方案1】:
要忽略缓冲区溢出,请更改 PCM 设备的软件参数:将停止阈值设置为与边界相同的值。 使用该配置,溢出不会导致设备停止,而是让它继续填充缓冲区。 (其他错误仍会停止设备;拔下 USB 设备后将很难继续...)
发生溢出时,缓冲区将包含比实际容量更多的数据,即snd_pcm_avail
将报告比缓冲区大小更多的可用帧。
当你想真正开始录制时,你应该调用snd_pcm_forward
来丢弃所有那些无效帧。
【讨论】:
以上是关于alsa - 管理非阻塞流的主要内容,如果未能解决你的问题,请参考以下文章