9

サウンド リクエストを受け取り、ALSA で再生する C++ オブジェクトがあります。サウンド要求を処理するスレッドがあります。一部のサウンドは周期的で、wav ファイルの内容が ALSA ライブラリに書き込まれた後に再スケジュールされます。すべてのデータがいつ再生されたかを知る方法はありますか? 関数 snd_pcm_writei はブロッキング書き込み関数ですが、必ずしもファイルが再生されたことを意味するわけではありません。

私が検討しているオプションの 1 つは、各サウンド ファイルを再生した後に snd_pcm_drain を呼び出し、次のファイルを再生するときに snd_pcm_prepare を呼び出すことです。これは良い解決策でしょうか?それともこれは非効率ですか?

更新: 「排水ソリューション」は機能しているようですが、あまり効率的ではありません。呼び出しが返されるまでに時間がかかり (一部のリソースがクリーンアップされる可能性があります)、プログラムに待ち時間が追加されます。多くの小さなファイルを連続して再生すると、遅延が最もよく見られます。各ファイルの間に数秒間の無音が聞こえます。これは実行中の snd_pcm_drain です。

4

1 に答える 1

4

正しくないかもしれません (私はこの分野でほとんど作業を行っていません) が、ALSA のドキュメントを参照してください: http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html

snd_pcm_status_tは、ストリームが現在データを処理しているかどうかを示すステータス情報を保持しているようです。

于 2010-10-19T17:16:02.197 に答える