alsa - 管理非阻塞流

时间:2013-02-28 12:54:20

标签: usb centos alsa

使用不断输出数据的USB音频设备(具有多个通道的HID)。

我希望实现的是忽略音频,直到信号从设备进入。那时我会开始监控饲料。来自设备的第二个信号表明我可以返回忽略数据。我已经在非阻塞模式下打开了所述设备,因此它不会干扰其他USB信号。

这很好用,除了当我开始读取数据(通过snd_pcm_readi)时,我得到一个EPIPE错误,指示缓冲区溢出。这可以通过每次调用snd_pcm_prepare来解决,但我希望有一种方法可以让缓冲区为空而我忽略它。

我看过snd_pcm_drainsnd_pcm_drop,但是这些会停止PCM而我宁愿保持打开状态。

建议?

1 个答案:

答案 0 :(得分:3)

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

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

当你想实际开始录制时,你应该拨打snd_pcm_forward以丢弃所有这些无效的帧。