WASAPI 処理フロー

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

忘れ気味なので、サンプルを元にWASAPI排他モードで再生する時の処理フローをまとめておくことにする。

<イベント駆動のとき>

  1. IMMDeviceEnumeratorを得る
  2. IMMDeviceEnumeratorからIMMDeviceCollectionを得る
  3. IMMDeviceCollectionからIMMDeviceを得る
  4. IMMDeviceからIAudioClientを得る
  5. 再生フォーマットを求める
  6. レイテンシ(再生遅延時間)を決め、IAudioClientを排他モード(AUDCLNT_SHAREMODE_EXCLUSIVE)で初期化する
  7. バッファの書き込みタイミングを受け取るためのイベントオブジェクトを1個作り、IAudioClientにセットする。
  8. IAudioClientからIAudioRenderClientを得る
  9. IAudioRenderClientでバッファを初期化する
  10. IAudioClientで再生を開始する
  11. イベントを待つ
  12. IAudioRenderClientからBufferを得る
  13. バッファに書き込む。
  14. 再生が終了したらIAudioClientで再生を停止する

<タイマ駆動のとき>

  1. IMMDeviceEnumeratorを得る
  2. IMMDeviceEnumeratorからIMMDeviceCollectionを得る
  3. IMMDeviceCollectionからIMMDeviceを得る
  4. IMMDeviceからIAudioClientを得る
  5. 再生フォーマットを求める
  6. レイテンシ(再生遅延時間)を決め、IAudioClientをタイマモードで初期化する
  7. IAudioClientからIAudioRenderClientを得る
  8. IAudioRenderClientでバッファを初期化する
  9. IAudioClientで再生を開始する
  10. バッファが空くまですこし待つ
  11. バッファの空きサイズを取得する
  12. IAudioRenderClientからBufferを得る
  13. バッファに書き込む
  14. 再生が終了したらIAudioClientで再生を停止する