特にUSBデバイスの例では、通常、1つのプロセスのみを読み取り用に開き、複製/コピー/コピーして複数のプロセスで開いて入力を読み取ることができます。次のように:
# 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
デバイスの複製に関する一般的な概念はありません。入力デバイスのみに制限しても、別の時刻に別の値を返します。両方のプログラムが異なる時間(わずか数マイクロ秒)で同じデバイスにアクセスしている場合は、まったく異なるデータを取得できます。
ループ装置はブロック装置へのアクセスを可能にする。ブロックデバイスは異なる動作をします。同じ場所で途中で書かずに2回読み取ると、同じデータが得られます。これは他のタイプのデバイスには適用されないため、文字デバイスにはループデバイスの概念はありません。
ストリームを返す特定の種類のデバイスを検討しています。プログラムが読み取るデータは、読み出しの開始と停止の時点にのみ依存すると仮定します。カーネルは役に立ちません。この特別なケースに対する特別なサポートはありません。
あなたができることは、デバイスから一度読み込み、データをユーザースペースにコピーすることです。なぜデバイスにデータを再供給しようとするのですか?既に受け取ったので読んでください。出力を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)