忘れ気味なので、サンプルを元にWASAPI排他モードで再生する時の処理フローをまとめておくことにする。
<イベント駆動のとき>
- IMMDeviceEnumeratorを得る
- IMMDeviceEnumeratorからIMMDeviceCollectionを得る
- IMMDeviceCollectionからIMMDeviceを得る
- IMMDeviceからIAudioClientを得る
- 再生フォーマットを求める
- レイテンシ(再生遅延時間)を決め、IAudioClientを排他モード(AUDCLNT_SHAREMODE_EXCLUSIVE)で初期化する
- バッファの書き込みタイミングを受け取るためのイベントオブジェクトを1個作り、IAudioClientにセットする。
- IAudioClientからIAudioRenderClientを得る
- IAudioRenderClientでバッファを初期化する
- IAudioClientで再生を開始する
- イベントを待つ
- IAudioRenderClientからBufferを得る
- バッファに書き込む。
- 再生が終了したらIAudioClientで再生を停止する
<タイマ駆動のとき>
- IMMDeviceEnumeratorを得る
- IMMDeviceEnumeratorからIMMDeviceCollectionを得る
- IMMDeviceCollectionからIMMDeviceを得る
- IMMDeviceからIAudioClientを得る
- 再生フォーマットを求める
- レイテンシ(再生遅延時間)を決め、IAudioClientをタイマモードで初期化する
- IAudioClientからIAudioRenderClientを得る
- IAudioRenderClientでバッファを初期化する
- IAudioClientで再生を開始する
- バッファが空くまですこし待つ
- バッファの空きサイズを取得する
- IAudioRenderClientからBufferを得る
- バッファに書き込む
- 再生が終了したらIAudioClientで再生を停止する