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
に明確な問題があることを明確に示しているので、それは同時/マルチチャネル録音用ではないという意味ですか?つまり、dsnoop
とdshare
の間に矛盾があるのでしょうか、それともdsnoop
が一度に1つのチャネルからしか記録/キャプチャできないのでしょうか?これを達成する別の方法はありますか?
ipc_key
は、同じデバイスを共有するプログラム間の通信に使用されます。つまり、ハードウェアデバイスごとに異なる値を使用する必要がありますが、同じハードウェアデバイスにアクセスするすべての仮想デバイス(つまり、同じスレーブusb_audio_1
)は同じIDを使用する必要があります。