オーディオソフトウェアを書くとき、インターネット上の多くの人が、メモリ割り当てやブロックコードの使用は特に重要でないと言います。事実、これらは非決定論的なので、出力バッファがアンダーフローし、オーディオに不具合が生じる可能性があります。マルチスレッドリアルタイムオーディオプログラミング - ブロックするかどうかをブロックする
Iは、ビデオソフトウェアを記述する場合、私は一般的に両方を使用する、すなわち、ヒープ上でビデオフレームを割り当て、ロックと条件変数(境界バッファ)を使用して、スレッド間を通過します。個別のスレッドを各操作に使用できるので、ソフトウェアがコアごとに最大限になり、最高のパフォーマンスが得られるので、これが提供するパワーが大好きです。
オーディオでは、スレッド間に多分100サンプルのフレームを渡して同様のことをしたいと思いますが、2つの問題があります。
メモリ割り当てを使用せずにフレームを生成するにはどうすればよいですか?私はあらかじめ割り当てられたフレームのプールを使うことができると思うが、これは乱雑に思える。
ロックフリーキューを使用できることを知っています。このブーストには、これを行ううえで素晴らしいライブラリがあります。これはスレッド間で共有するのに最適な方法ですが、データが利用可能かどうかを定期的に確認するためにキューをポーリングするのは、CPU時間の浪費のようです。私の経験で
ミューテックスを使用すると、実際にミューテックスがロックされている部分が短いことを提供し、すべてで多くの時間を取ることはありません。
レイテンシを最小限に抑えながら、リソースを無駄にすることなく、非決定的な動作を比較的少なくすることで、スレッド間でオーディオフレームを渡す最も良い方法は何ですか?
オーディオに関することはよく分かりませんが、伝統的なプロデューサ/コンシューマの問題のように聞こえますが、セマフォを数えてみましたか? – smskelley
スレッドが必要ですか?オーディオデータはビデオよりもかなり安いです。 – immibis
@immibis、それはあなたのオーディオスレッドで何をするかによって異なります。ビデオは通常、1つのサンプルにつき非常に少数の操作しか行いませんが、オーディオ合成はサンプルごとに非常に厳しいものになります。 –