Estoy intentando grabar audio que se reproduce en canales separados usando arecord
. Hago esto ejecutando el siguiente comando en subprocesos separados en un script de Python:
arecord -D plug:"+str(in_id)+" -c 1 -d "+str(duration)+" -f S16_LE -r "+str(rate)+" "+rec_filename
¿Dónde in_id
está la variable del canal de entrada que paso a cada uno de los hilos? Pero luego, se arroja el siguiente error:
ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open) unable to open slave
arecord: main:722: audio open error: Device or resource busy
Cuando ejecuto lsof /dev/snd/pcm*
justo antes de comenzar a grabar usando arecord
mi función de grabación en el programa, veo lo siguiente:
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
La definición de mi dispositivo para canales de entrada .asoundrc
es la siguiente:
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>)"
}
donde <num>
toma todos los valores entre 1 y 8 y <ch_num>
toma todos los valores entre 0 y 7.
Dado que el error dice claramente que hay un problema definitivo con dsnoop
, ¿eso significa que no está diseñado para grabación simultánea/multicanal? Quiero decir, ¿hay algún conflicto entre dsnoop
y dshare
o si dsnoop
se puede grabar/capturar desde un solo canal a la vez? ¿Hay otra manera de lograr esto?
Respuesta1
Se ipc_key
utiliza para la comunicación entre los programas que comparten el mismo dispositivo. Esto significa que debe usar valores diferentes para diferentes dispositivos de hardware, pero que todos los dispositivos virtuales que acceden al mismo dispositivo de hardware (es decir, el mismo esclavo usb_audio_1
) deben usar la misma ID.
Respuesta2
En mi caso, el dispositivo está bloqueado para arecord
su uso si tengo VLC abierto (incluso si está inactivo y con una lista de reproducción vacía).
De manera similar, también está bloqueado si solo tengo abierta la configuración (menú de la esquina superior derecha), presumiblemente debido a su panel de prueba de sonido/micrófono.