タイムスタンプ付きのオーディオ ストリームを受信し、指定されたタイムスタンプにできるだけ近いオーディオ サンプルを再生しようとする C++ アプリケーションがあります。そのためには、オーディオ サンプルを出力バッファーに配置してから実際にオーディオが聞こえるまでの遅延を (妥当な精度で) 知る必要があります。
オーディオ出力のレイテンシーについては多くの議論がありますが、私が見つけたのはレイテンシーを最小限に抑えることだけです。これは私には関係ありません。必要なのは (実行時の)既知のレイテンシだけです。
Linux ではこれを解決しsnd_pcm_delay()
て非常に良い結果を得ましたが、Windows ではまともな解決策を探しています。
私は以下を見てきました:
- OpenAL を使用して、原因不明の 80 ミリ秒の遅延を測定しました。これはハードコードされた値ではなく、レイテンシを読み取る API が見つからなかったと思います。これをサポートすると主張する OpenAL の拡張機能がいくつかありますが、Linux でのみ実装されていることがわかります。
- Wasapi には
GetStreamLatency()
本物のように聞こえるものがありますが、これは明らかにスレッドのポーリング間隔か何かにすぎないため、これも役に立ちません。私のマシンにはまだ 30 ミリ秒の原因不明の遅延があります。 - DirectSound にはレイテンシを取得するための API がありませんか? しかし、出力バッファを追跡するだけで十分に近づくことができるでしょうか?
ブラッドのコメントに応じて編集します。
- ASIO についての私の印象は、主にプロのオーディオ アプリケーションとオーディオ愛好家を対象としており、ユーザーは特別なサウンド カード ドライバーをインストールする必要があり、ライセンスに対処する必要があるということです。ただし、機能的には良いオプションのようです。