xaudio で raw-pcm データを再生しようとしていますが、再生に大きな遅延があります (>=5ms)。私は次のコードでこれをやっています:
bool Play(uint8_t *data, size_t size)
{
_xaudio_buffer.AudioBytes = size;
_xaudio_buffer.pAudioData = data;
Time t1;
if (_g_source->SubmitSourceBuffer(&_xaudio_buffer) != S_OK)
return false;
if(WaitForSingleObjectEx(_voice_callback.hBufferEndEvent,INFINITE,true) != WAIT_OBJECT_0)
return false;
Time t2;
printf("%d\n",t2-t1);
}
Time クラスは GetTickCount の下の単なるラッパーであり、結果の t2-t1 は差をミリ秒単位で返します。Time クラスが追加の遅延を発生させないことを確認しました。
再生時間をミリ秒単位で計算するのはそれほど難しくありません: play_time = size*1000 / (channels*(bits_per_sample/8) * frequency)
したがって、サイズが 4608 バイト、48 khz、2 チャネル、サンプルあたり 16 ビットのデータの場合、そのようなチャンクを再生するには約 24 ミリ秒かかります。代わりに、上記のコードでは、そのようなチャンクを再生するために約 31 ミリ秒以上必要です。何がそのような遅延を生み出しているのでしょうか? ビデオ プレーヤーを作成していて、リアルタイム ストリームからデータを取得している場合 (同期機能は既にありますが、このような小さなサンプルの 5 ミリ秒の遅延は理想的なサウンドではありません)、どのように対処すればよいですか?
また、このコードは、Windows 7 を搭載した 2 台のコンピューターと異なるハードウェアでテストしました。どちらも同じ遅延を生成します。