Ошибка «Устройство или ресурс заняты» возникает при попытке записать звук с помощью arecord

Ошибка «Устройство или ресурс заняты» возникает при попытке записать звук с помощью arecord

Я пытаюсь записать звук, который воспроизводится на отдельных каналах с помощью 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 (даже если он бездействует и с пустым плейлистом).

Аналогично, он также блокируется, если у меня открыты только настройки (меню в правом верхнем углу) — предположительно из-за панели проверки звука/микрофона.

Связанный контент