'Erro no dispositivo ou recurso ocupado' ao tentar gravar áudio usando um registro

5

Estou tentando gravar o áudio que está sendo reproduzido em canais separados usando arecord . Eu 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_id é a variável do canal de entrada que eu passo para cada um dos encadeamentos. Mas então, o seguinte erro é lançado:

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* antes de começar a gravar usando arecord na minha função de registro 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 em .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>)"
}

em que <num> aceita todos os valores entre 1 e 8 e <ch_num> aceita todos os valores entre 0 e 7.

Desde então, o erro diz claramente que há um problema definido com dsnoop , isso significa que não é para gravação simultânea / multicanal? Quer dizer, existe um conflito entre dsnoop e dshare ou se dsnoop pode gravar / capturar de apenas um canal de cada vez? Existe outra maneira de conseguir isso?

    
por skrowten_hermit 27.04.2017 / 08:22

1 resposta

3

O ipc_key é usado para comunicação entre os programas que compartilham o mesmo dispositivo. Isso significa que você precisa usar valores diferentes para dispositivos de hardware diferentes, mas que todos os dispositivos virtuais que acessam o mesmo dispositivo de hardware (ou seja, o mesmo escravo usb_audio_1 ) devem usar o mesmo ID.

    
por 28.04.2017 / 13:07