こんにちは、同時に 3 つの入力デバイスからキャプチャする必要があるプログラムを作成しています (この場合は、3 つの同一の USB Web カメラです)。
まず第一に、ALSA はおなじみの UNIX パラダイム「すべてがファイルである」に基づいていないため、通常の poll(3) 呼び出しは使用できません。すべてのデバイス間でデータ ストリームが安定している必要があることがわかっているので、今のところ、次のようにします。
while(!stop)
for(i = 0; i < input_device_count; i++)
{
snd_pcm_readi(handle[i], buffer, frames);
write(fd_out[i], buffer, size);
}
このコードは、各デバイスを反復処理して読み取り、以前に開いていたファイルに結果を書き込みます。それは機能しますが、これを行うにはより良い方法があると思います。これも mmap を使用するため、カーネル空間からユーザー、およびカーネルに再度コピーする必要はありません。
ちょっとの間、3 つの入力が同期していると仮定しましょう。上記のコードは、3 つのデバイスから同時に記録を開始することを保証するものではありません。それを保証する方法はありますか?実際、snd_pcm_prepare() や snd_pcm_start() のような呼び出しのセマンティクスは何ですか? 今はそれらを使用していません。snd_pcm_readi() に直行します。
コード例を検索しようとしましたが、同時に複数のキャプチャに関係するものは見つかりませんでした。ヒントをいただければ幸いです。