S.F. Page

Programming,Music,etc...

WASAPI - About the Windows Core Audio APIs(2)

(参考)

http://msdn.microsoft.com/en-us/library/dd316780(VS.85).aspx

■オーディオAPIのユーザモードコンポーネント化

Core Audio APIはユーザモードコンポーネントとして実装されている。 これはカーネルモードで動作していた時にくらべて信頼性が向上するから。 Vista以降はDirectSoundやWindows Multimedia Functions などの高レベルAudioAPIはCore Audio APIを通じてオーディオデバイスにアクセスするように変更されている。

(参考:マイクロソフトの図)

■エンドポイントデバイスとは

物理デバイスを表現する抽象的なデバイスのことである。エンドポイントデバイスの例:スピーカ、ヘッドフォン、マイクなど
上図ではエンドポイントデバイスはオーディオアダプタに接続されたスピーカーセットである。

■エンドポイントバッファ

WASAPIはデータをエンドポイントバッファを通じてエンドポイントにデータを渡す。システムソフトウェアとハードウェアコンポーネントはエンドポイントバッファからエンドポイントデバイス間のデータ転送を行う。あとジャックに接続しているかどうか検出できるオーディオデバイスは、実際に出力可能なエンドポイントデバイスだけにエンドポイントバッファを作成できる。

■共有モードと排他モード

エンドポイントバッファは2つのモードがある。共有モードと排他モードである。 上図では共有モードと排他モード両方記載されているけれども、開くモードによって2つモードのうちいずれか1つのみが存在する。

まず共有モードは、他のプロセスで動作しているアプリケーションとオーディオハードウェアを共有する。共有モードでストリームをオープンした場合、エンドポイントバッファにオーディオデータを書き込むと、Windowsオーディオエンジンがエンドポイントバッファからデータを読み出す。そして、オーディオエンジンはアプリケーションのストリームをミックスしてハードウェアに送る。オーディオエンジンはストリーム処理を行うユーザモード・システムコンポーネント(Audiodg.dll)である。共有モードでは、オーディオエンジンによって使用されているミックスフォーマット(もしくはミックスフォーマットに近いフォーマット)を使用してストリームをオープンしなくてはならない。共有モード中ではオーディオエンジンの入力ストリームおよびエンジンからミックスされる出力はすべて同じフォーマットである。

※Windows7では、共有モードでlow-latecneモードが追加された。このモードだとオーディオエンジンはプルモードでの動作時の処理遅延を大幅に削減する。(それに対してイベントモードというのがあるのだけれど、これはまた後日。。)

次に排他モードは言葉通りオーディオハードウェアに排他的にアクセスすることができる。利用中は他ののアプリケーションの音は鳴らなくなる。排他モード中では、エンドポイントデバイスがサポートするオーディオフォーマットのなかから、オープンするフォーマットを選択できる。排他モードはレイテンシにシビアなDAWアプリケーションなどで使用する。

■MMCSS

低レイテンシなオーディオストリーム再生するアプリケーションが間断なくストリームを再生できるように、Windows VistaではMultimedia Class Scheduler Service (MMCSS)を使用することができる。MMCSSは低優先順位のアプリケーションへのCPUリソースの割り当てをなくすことなく高いプライオリティでアプリケーションを動作させることができる。MMCSSスレッドは、タスク名に基づいて優先順位を割り当てる。たとえば、Windows Vistaでは"Audio"と"Pro Audio"というタスク名をサポートしている。デフォルトでは"Pro Audio"の方が"Audio"よりも優先順位が高い。

■ストリームのフォーマット

Core Audio APIはPCMおよびnon-PCMストリームフォーマットをサポートしている。しかし、オーディオエンジンがミックスできるのはPCMストリームのみである。なので、排他モードだけがnon-PCMストリームフォーマットを設定することができる。

■オーディオエンジン&オーディオサービス

オーディオエンジンはアプリケーション中のプロセスから分離された保護プロセスで動作する。共有モードをサポートするためにWindowsオーディオサービスはオーディオエンジンとアプリケーションの両方からアクセス可能なcross-processエンドポイントバッファを割り当てる。 排他モードではエンドポイントバッファはアプリケーションおよびオーディオエンジン両方がアクセス可能なメモリ中に存在する。

■Windowsオーディオポリシー

オーディオポリシーはシステムが同じハードウェアの利用のために共有・競合する複数アプリケーションのオーデディオストリーム間の相互調停を行うための内部ルールのセットである。Windowsオーディオサービスはオーディオエンジンのための制御パラメータを設定することによってオーディオポリシーを実装する。←この辺今時点よくわかりません。

■Windows Audio サービス

オーディオサービスの役割は、

  • ユーザがシステムからオーディオデバイスを削除・追加してもオーディオデバイスのトラックを維持すること
  • システム中のオーディオデバイスが割り当てられる役割をモニタすること
  • 類似するオーディオ・コンテント(console, multimedia, and communications)のクラスを生成するタスクグループからオーディオストリームを管理すること←(意味不明)
  • さまざまな種類のオーディオコンテントのそれぞれの複合出力ストリームの音量レベルを制御すること
  • ・オーディオストリームのためのデータパス中の処理エレメントについてオーディオエンジンに伝えること

■ドライバコンポーネントについて

上図中の"Audio Driver"と表記された部分はシステムとベンダで提供されたドライバコンポーネントの組み合わせで提供されることがある。

PCIもしくはPCI Express上のオーディオアダプタの場合、システムはPortクラスシステムドライバ(Portcls.sys、アダプタ中のさまざまなオーディオ機能ためのポートドライバのセットを実装している)を供給し、ハードウェアベンダはポートドライバのためのデバイス固有のオペレーションを操作するミニポートドライバのセットを実装する。PCIもしくはPCI Express上のHigh Definition Audioコントローラおよびコーデックでは、システムはアダプタドライバ(Hdaudio.sys)を提供し、ベンダ供給ドライバは不要である。USB上のオーディオデバイスの場合、システムはUSBオーディドライバ(usbaudio.sys)に加えてAVStreamクラスシステムドライバ(ks.sys)を供給し、ベンダ供給ドライバは不要である。

■キャプチャ(録音)ストリーム

Core Audio APIはキャプチャ(録音)ストリームも同様にサポートしている。共有モードではオーディオデバイスからのストリームをキャプチャを共有することができる。排他モードではオーディオデバイスからのキャプチャストリームを排他的にアクセスできる。