Estou tentando gravar áudio que está sendo reproduzido em canais separados usando o arquivo arecord
. Faço isso executando o seguinte comando em threads separados em um script python:
arecord -D plug:"+str(in_id)+" -c 1 -d "+str(duration)+" -f S16_LE -r "+str(rate)+" "+rec_filename
onde in_id
está a variável do canal de entrada que passo para cada um dos threads. Mas então, o seguinte erro é gerado:
ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open) unable to open slave
arecord: main:722: audio open error: Device or resource busy
Quando executo lsof /dev/snd/pcm*
logo antes de começar a gravar usando arecord
minha função de gravação no programa, vejo o seguinte:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
aplay 12236 user4 mem CHR 116,3 493 /dev/snd/pcmC1D0p
aplay 12236 user4 4u CHR 116,3 0t0 493 /dev/snd/pcmC1D0p
Minha definição de dispositivo para canais de entrada .asoundrc
é a seguinte:
pcm.!default {
type plug
slave {
pcm "hw:1,0"
}
}
ctl.!default {
type hw
card 1
}
pcm_slave.usb_audio_1 {
pcm "hw:1,0"
channels 8
rate 44100
buffer_size 4096
period_size 1024
}
pcm.outch<num> {
type dshare
ipc_key <id>
slave usb_audio_1
bindings [ <ch_num> ]
hint.description "USB output/playback channel <num> (from output port <num>)"
}
pcm.inch<num> {
type dsnoop
ipc_key <id>
slave usb_audio_1
bindings [ <ch_num> ]
hint.description "USB input/capture channel <num> (from input port <num>)"
}
onde <num>
pega todos os valores entre 1 e 8 e <ch_num>
pega todos os valores entre 0 e 7.
Visto que o erro diz claramente que há um problema definido com dsnoop
, isso significa que ele não se destina à gravação simultânea/multicanal? Quero dizer, há um conflito entre dsnoop
e dshare
ou se dsnoop
é possível gravar/capturar apenas um canal por vez? Existe outra maneira de conseguir isso?
Responder1
O ipc_key
é usado para comunicação entre os programas que compartilham o mesmo dispositivo. Isso significa que você deve usar valores diferentes para dispositivos de hardware diferentes, mas todos os dispositivos virtuais que acessam o mesmo dispositivo de hardware (ou seja, o mesmo escravo usb_audio_1
) devem usar o mesmo ID.
Responder2
No meu caso, o dispositivo está sendo bloqueado para arecord
uso se eu tiver o VLC aberto (mesmo que esteja inativo e com a playlist vazia).
Da mesma forma, ele também será bloqueado se eu tiver apenas as configurações (menu do canto superior direito) abertas – provavelmente por causa de seu painel de teste de som/microfone.