Erro 'Dispositivo ou recurso ocupado' gerado ao tentar gravar áudio usando um registro

Erro 'Dispositivo ou recurso ocupado' gerado ao tentar gravar áudio usando um registro

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_idestá 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 arecordminha 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 dsnoope dshareou 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 arecorduso 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.

informação relacionada