Я пытаюсь записать звук, который воспроизводится на отдельных каналах с помощью arecord
. Я делаю это, выполняя следующую команду в отдельных потоках в скрипте Python:
arecord -D plug:"+str(in_id)+" -c 1 -d "+str(duration)+" -f S16_LE -r "+str(rate)+" "+rec_filename
где in_id
— переменная входного канала, которую я передаю каждому из потоков. Но затем выдается следующая ошибка:
ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open) unable to open slave
arecord: main:722: audio open error: Device or resource busy
Когда я запускаю функцию записи в программе, lsof /dev/snd/pcm*
непосредственно перед началом записи arecord
, я вижу следующее:
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
Мое определение устройства для входных каналов выглядит .asoundrc
следующим образом:
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>)"
}
где <num>
принимает все значения от 1 до 8 и <ch_num>
принимает все значения от 0 до 7.
Поскольку ошибка ясно говорит о наличии определенной проблемы с dsnoop
, означает ли это, что он не предназначен для одновременной/многоканальной записи? Я имею в виду, есть ли конфликт между dsnoop
и dshare
или если dsnoop
можно записывать/захватывать только с одного канала одновременно? Есть ли другой способ добиться этого?
решение1
Используется ipc_key
для связи между программами, которые совместно используют одно и то же устройство. Это означает, что вам придется использовать разные значения для разных аппаратных устройств, но все виртуальные устройства, которые обращаются к одному и тому же аппаратному устройству (т. е. к одному и тому же подчиненному устройству usb_audio_1
), должны использовать один и тот же идентификатор.
решение2
В моем случае устройство блокируется для arecord
использования, если у меня открыт VLC (даже если он бездействует и с пустым плейлистом).
Аналогично, он также блокируется, если у меня открыты только настройки (меню в правом верхнем углу) — предположительно из-за панели проверки звука/микрофона.