2016-08-29 19 views
2

ALSAは循環バッファを埋めるために書き込み関数を使用し、サウンドカードはサンプルを再生してバッファを排出します。アプリケーションは、ストリームの次のフラグメントでバッファを再充填する役割を担います。もしアプリケーションアプリケーションがバッファをいっぱいにして遅くすると、音楽にギャップがあります。アプリケーションがすぐに再生しないと、まだ再生されていないサンプルは、バッファーが円形であるため、新しいサンプルで上書きされます。ALSAバッファをタイムリーに埋め込む方法

私の質問は、バッファをどのくらい補充する必要があるのか​​、どのくらいそれを知っているかです。 alsaによって定義されたいくつかのイベントがありますか、それとも他のテクニックですか?

答えて

2

PCMデバイスがブロッキングモード(デフォルト)になると、snd_pcm_write*()はすべてのバイトが実際にバッファに書き込まれるまで待機します。再生されないサンプルは上書きされません。

PCMデバイスがノンブロッキングモードのとき、snd_pcm_write*()は実際に書き込まれたフレーム数を返します(バッファがいっぱいになると-EAGAINを返します)。空き領域があるのを待つには、poll()を使用します。これにより、複数の種類のイベントを待つイベントループを使用できます。 (詳細は、that answerを参照してください。)

+0

ポーリングでは多くのプロセッサ時間が使用されます。 alsaにはコールバックに基づく解決策がありますか? – Trismegistos

+0

'poll()'はポーリングしていません。 –

+0

タイムアウト0が与えられると、実際にポーリングがポーリングされます。 0より大きいタイムアウトが与えられたときにブロックされます。 – Trismegistos

関連する問題