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 つのチャンネルからしか録画/キャプチャできないのでしょうか? これを実現する別の方法はありますか?

答え1

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

答え2

arecord私の場合、 VLC を開いていると (アイドル状態でプレイリストが空の場合でも)デバイスの使用がブロックされます。

同様に、(右上隅のメニュー)設定のみが開いている場合もブロックされます。これは、サウンド/マイク テスト パネルが原因であると考えられます。

関連情報