WASAPIのタイマモードとイベントモードってなんだっけと思って、久しぶりにWASAPIのサンプルコードをチェック。
RenderExclusiveEventDriven
RenderExclusiveTimerDriven
両方共タイミング管理をイベントオブジェクトと行うのだけれど、
・タイマモード
バッファへの書き込みタイミングをアプリケーションがタイマなどを使ってコントロールする。
・イベントモード
バッファへの書き込みタイミングをOSに任せる(イベントオブジェクトで受け取る)。
の違いがある。
PlayPcmWinのページにそのへんのことが詳しく載っているので引用する。
http://code.google.com/p/bitspersampleconv2/wiki/PlayPcmWin
・イベント駆動モードでは、WASAPIから、そろそろ次のデータを下さいというイベントが来たら再生スレッドが起き、再生スレッドは次のデータをWASAPIに送ります。再生スレッドが起床する時間間隔は、IAudioClient::Initialize時に設定した レイテンシー時間(PlayPcmWinでは、[出力レイテンシー]で設定した時間)で、このとき送るデータのサンプル数は、IAudioClient::Initialize時に設定した レイテンシー時間 x サンプリング周波数 (サンプル)です。
・タイマー駆動モードは、再生スレッドが自発的に一定間隔で起きて、オーディオデバイスのバッファの空きサイズを調べてその分のデータをWASAPIに送ります。再生スレッドが起床する時間間隔は、IAudioClient::Initialize時に設定した レイテンシー時間 ÷ 2です。 同じレイテンシ設定でも、イベント駆動モードの方がスレッドが起きる頻度が少なくてすみ、 CPU負荷が低くなります。 イベント駆動モードよりもタイマー駆動モードの方が動作する組み合わせ(オーディオデバイス、サンプリング周波数、量子化ビット数の組み合わせ)の数が多いです。
なるほど。。
ちなみに、タイマーモードの時の時間間隔はPlaPcmWinやサンプルだとレイテンシー時間 ÷ 2だけど、この間隔は自由に設定できる。サンプルで試してみたけどレイテンシー時間 ÷ 4とかでも問題なかった。まあでも一般的には1/2だろうね。。