5

LinuxでALSAドライバーを使用するオーディオアプリケーションがあり、コードはIntelLinuxデスクトップマシンで非常にうまく機能します。ただし、Raspberry Piもサポートしたいので、そのプラットフォームで定期的にオーディオのドロップアウトとバッファアンダーランが発生します。公平を期すために、アンダーランはIntel Linuxでも発生しますが、厄介な静的バーストは発生しません。これは、おそらくそのプラットフォームのALSAドライバーに関係しています。

とにかく、2種類のエラーが発生します。まず、への呼び出しでコードsnd_pcm_wait()が返されることがあり-EPIPEます。このコードをキャッチしてから呼び出してみますがsnd_pcm_recover()、その後snd_pcm_prepare()のへの呼び出しで少し静的な歪みが発生しsnd_pcm_writei()ます。これはそのようなエラーから回復する正しい方法ですか?静的なしでこれから回復する方法はありますか?

正常に戻ったときsnd_pcm_wait()、私は電話しsnd_pcm_avail_update()ます...から正常に戻った後もこれを行う必要がありますsnd_pcm_recover()か?

私が抱えている2番目の問題は、リターンコードsnd_pcm_writei()も返されることがあるということです。-EPIPE繰り返しにsnd_pcm_recover()なりますが、この場合は電話をかけてみますが、クリック音やその他の不快感が聞こえます。このエラーからより適切に回復する方法はありますか?

4

1 に答える 1

3

アンダーランはいつでも発生する可能性があるため、どの関数もを返すことができ-EPIPEます。

snd_pcm_recover()snd_pcm_prepare()成功した場合はすでに呼び出しています。再度呼び出す必要はありません。

デバイスが準備されると、そのバッファがリセットされます。つまり、完全に空であることがわかっているため、使用可能なフレーム数を確認する必要はありません。

リセットにより、後でバッファに書き込んだデータのみが聞こえるはずです。静的なものは、アンダーランからの残りのゴミであり、ドライバーのバグを示します。アプリケーションがそれについてできることは何もありません。

于 2012-10-11T16:56:47.340 に答える