使用不断输出数据的USB音频设备(具有多个通道的HID)。
我希望实现的是忽略音频,直到信号从设备进入。那时我会开始监控饲料。来自设备的第二个信号表明我可以返回忽略数据。我已经在非阻塞模式下打开了所述设备,因此它不会干扰其他USB信号。
这很好用,除了当我开始读取数据(通过snd_pcm_readi
)时,我得到一个EPIPE错误,指示缓冲区溢出。这可以通过每次调用snd_pcm_prepare
来解决,但我希望有一种方法可以让缓冲区为空而我忽略它。
我看过snd_pcm_drain
和snd_pcm_drop
,但是这些会停止PCM而我宁愿保持打开状态。
建议?
答案 0 :(得分:3)
要忽略缓冲区溢出,请更改PCM设备的软件参数:将停止阈值设置为与边界相同的值。 使用该配置,溢出不会导致设备停止,但会让它继续填充缓冲区。 (其他错误仍然会停止设备;当拔下USB设备时很难继续...)
当发生溢出时,缓冲区将包含的数据超出实际可容纳的数据,即snd_pcm_avail
将报告比缓冲区大小更多的可用帧。
当你想实际开始录制时,你应该拨打snd_pcm_forward
以丢弃所有这些无效的帧。