Ich versuche, Audio aufzunehmen, das auf verschiedenen Kanälen abgespielt wird arecord
. Dazu führe ich den folgenden Befehl in separaten Threads in einem Python-Skript aus:
arecord -D plug:"+str(in_id)+" -c 1 -d "+str(duration)+" -f S16_LE -r "+str(rate)+" "+rec_filename
wobei in_id
die Eingangskanalvariable ist, die ich an jeden der Threads übergebe. Dann wird jedoch folgender Fehler ausgegeben:
ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open) unable to open slave
arecord: main:722: audio open error: Device or resource busy
Wenn ich lsof /dev/snd/pcm*
direkt vor dem Start der Aufnahme die arecord
Aufnahmefunktion im Programm ausführe, sehe ich Folgendes:
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
Meine Gerätedefinition für Eingangskanäle .asoundrc
lautet wie folgt:
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>)"
}
wobei <num>
alle Werte zwischen 1 und 8 und <ch_num>
alle Werte zwischen 0 und 7 akzeptiert werden.
Da der Fehler eindeutig besagt, dass ein bestimmtes Problem mit vorliegt dsnoop
, bedeutet das, dass es nicht für die gleichzeitige/mehrkanalige Aufnahme gedacht ist? Ich meine, besteht ein Konflikt zwischen dsnoop
und dshare
oder dsnoop
kann nur von einem Kanal gleichzeitig aufgenommen/aufgezeichnet werden? Gibt es eine andere Möglichkeit, dies zu erreichen?
Antwort1
Die ipc_key
wird für die Kommunikation zwischen den Programmen verwendet, die dasselbe Gerät gemeinsam nutzen. Dies bedeutet, dass Sie für verschiedene Hardwaregeräte unterschiedliche Werte verwenden müssen, aber dass alle virtuellen Geräte, die auf dasselbe Hardwaregerät zugreifen (also denselben Slave usb_audio_1
), dieselbe ID verwenden müssen.
Antwort2
In meinem Fall wird die arecord
Nutzung des Geräts gesperrt, wenn ich VLC geöffnet habe (auch im Leerlauf und mit leerer Wiedergabeliste).
Ebenso wird es blockiert, wenn ich nur die Einstellungen (Menü oben rechts) geöffnet habe – vermutlich wegen des dortigen Sound-/Mikrofon-Testfensters.