web-dev-qa-db-ja.com

レコードを使用してオーディオを録音しようとすると「デバイスまたはリソースビジー」エラーがスローされる

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

プログラムの記録関数でarecordを使用して記録を開始する直前にlsof /dev/snd/pcm*を実行すると、次のようになります。

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に明確な問題があることを明確に示しているので、それは同時/マルチチャネル録音用ではないという意味ですか?つまり、dsnoopdshareの間に矛盾があるのでしょうか、それともdsnoopが一度に1つのチャネルからしか記録/キャプチャできないのでしょうか?これを達成する別の方法はありますか?

6
skrowten_hermit

ipc_keyは、同じデバイスを共有するプログラム間の通信に使用されます。つまり、ハードウェアデバイスごとに異なる値を使用する必要がありますが、同じハードウェアデバイスにアクセスするすべての仮想デバイス(つまり、同じスレーブusb_audio_1)は同じIDを使用する必要があります。

2
CL.