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_drainsnd_pcm_drop,但它们阻止了 PCM,我宁愿让它保持打开状态。

建议?

【问题讨论】:

为什么要保持 PCM 设备运行?您是否测量到 snd_pcm_start 的延迟太高? 嗯 - 这是一个很好的问题。也许我可以通过简单地忽略它..好吧..忽略它.. 【参考方案1】:

要忽略缓冲区溢出,请更改 PCM 设备的软件参数:将停止阈值设置为与边界相同的值。 使用该配置,溢出不会导致设备停止,而是让它继续填充缓冲区。 (其他错误仍会停止设备;拔下 USB 设备后将很难继续...)

发生溢出时,缓冲区将包含比实际容量更多的数据,即snd_pcm_avail 将报告比缓冲区大小更多的可用帧。

当你想真正开始录制时,你应该调用snd_pcm_forward来丢弃所有那些无效帧。

【讨论】:

以上是关于alsa - 管理非阻塞流的主要内容,如果未能解决你的问题,请参考以下文章

干货|精读Netty源码---NIO之Channel

进程之并行并发同步异步与阻塞非阻塞

node - 非阻塞的异步 IO

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

Java NIO

阻塞赋值和非阻塞赋值有何区别