タイマモードとイベントモード

公開:2010-11-07 19:50
更新:2020-02-15 04:36
カテゴリ:windows,wasapi,audio,windows api

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だろうね。。