Criando vários dispositivos a partir de um dispositivo?

4

Especificamente, usando um dispositivo USB, que normalmente permite que apenas um processo abra-o para leitura e o duplique / duplique / replique para que vários processos possam abrir e ler a entrada. Algo ao longo destas linhas:

# 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 &

Com /dev/[#1] e /dev/[#2] sendo os dispositivos a serem abertos para leitura. Eu pensei que poderia usar os dispositivos /dev/loop# . Eu tentei brincar com estes, mas sem sorte.

    
por Yimin Rong 03.06.2013 / 22:58

1 resposta

1

Não há um conceito geral de duplicar um dispositivo. Mesmo restringindo-se ao caso de um dispositivo somente de entrada, ele ainda retorna valores diferentes em momentos diferentes. Se dois programas acessam o mesmo dispositivo em momentos diferentes (mesmo que seja uma questão de microssegundos), eles podem obter dados completamente diferentes.

Os dispositivos de loop dão acesso a dispositivos de bloco. Os dispositivos de bloco se comportam de maneira diferente: se você ler na mesma posição duas vezes sem escrever no meio, obterá os mesmos dados. Isso não se aplica a outros tipos de dispositivos, portanto, não há conceito de dispositivos de loop para dispositivos de caracteres.

Você está considerando um tipo específico de dispositivo que retorna um fluxo. Você está assumindo que os dados lidos pelo programa dependem exclusivamente de quando ele é iniciado e pára de ser lido. O kernel não vai te ajudar, não tem suporte especial para este caso especial.

O que você pode fazer é ler o dispositivo uma vez e replicar os dados na área de usuário. Por que você está tentando alimentar os dados de volta para um dispositivo? Você entendeu, então leia. Você precisará passar a saída de tee para vários programas, portanto, use um canal nomeado ou substituição de processos .

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

ou

arecord -D [mic] | tee >(apply-live-effects -filter lo-pass >output1.raw) >(apply-live-effects -filter hi-pass >output2.raw)

Tenha em atenção que, se os filtros forem demasiado lentos, tee poderá não conseguir ler a saída de arecord tão rapidamente como deveria, o que poderá resultar em arecord a não conseguir ler do dispositivo o mais rapidamente como deveria, causando quadros perdidos. Isso pode ser resolvido com multitee , que faz o possível para não bloquear.

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)
    
por 04.06.2013 / 02:43