具体以 USB 设备为例,该设备通常只允许一个进程打开它进行读取,然后对其进行克隆/复制/复制,以便多个进程可以打开并读取输入。沿着这些思路:
# Duplicate two streams from microphone
arecord -D [mic] | tee /dev/[#1] > /dev/[#2] &
# Set up process 1
apply-live-effects -filter lo-pass < /dev/[#1] > output1.raw &
# Set up process 2
apply-live-effects -filter hi-pass < /dev/[#2] > output2.raw &
with/dev/[#1]
和/dev/[#2]
are 是打开阅读的设备。我想我也许能够使用这些/dev/loop#
设备。我尝试玩弄这些,但没有运气。
答案1
没有复制设备的一般概念。即使限制于仅输入设备的情况,它仍然在不同时间返回不同的值。如果两个程序在不同时间访问同一设备(即使只是几微秒),它们可能会获得完全不同的数据。
循环设备允许访问块设备。块设备的行为有所不同:如果您从同一位置读取两次而中间没有写入,则会获得相同的数据。这不适用于其他类型的设备,因此字符设备没有循环设备的概念。
您正在考虑一种返回流的特定类型的设备 - 您假设程序读取的数据仅取决于它何时开始和停止读取。内核不会为您提供帮助,它对这种特殊情况没有特殊支持。
您可以做的就是从设备读取一次,然后将数据复制到用户空间中。您为什么尝试将数据反馈回设备?你已经明白了,所以请阅读它。您需要将 的输出传递tee
给多个程序,因此要么使用命名管道或者流程替代。
mkfifo low high
apply-live-effects -filter lo-pass <low >output1.raw
apply-live-effects -filter ho-pass <high >output2.raw
arecord -D [mic] | tee low >high
或者
arecord -D [mic] | tee >(apply-live-effects -filter lo-pass >output1.raw) >(apply-live-effects -filter hi-pass >output2.raw)
请注意,如果过滤器太慢,可能无法以应有的速度tee
读取输出,这可能会导致无法以应有的速度从设备读取数据,从而导致帧丢失。这可以解决arecord
arecord
多通道,它会尽力不阻塞。
arecord -D [mic] | multitee 0-3,4 3> >(apply-live-effects -filter lo-pass >output1.raw) 4> >(apply-live-effects -filter hi-pass >output2.raw)