ユーザー モード オーディオ コンポーネント

Windows Vista では、コア オーディオ API が、ユーザー モードのオーディオ サブシステムの基盤として機能します。 コア オーディオ API は、ユーザー モード クライアントとカーネル モード オーディオ ドライバーとオーディオ ハードウェアを分離する、ユーザー モード システム コンポーネントの薄いレイヤーとして実装されます。 DirectSound や Windows マルチメディア機能などの上位レベルのオーディオ API は、コア オーディオ API を介してオーディオ デバイスにアクセスします。 さらに、一部のオーディオ アプリケーションはコア オーディオ API と直接通信します。

コア オーディオ API は、オーディオ エンドポイント デバイスという、ユーザーにとってわかりやすい概念をサポートしています。 オーディオ エンドポイント デバイスは、ユーザーが直接操作する物理的なデバイスをソフトウェアで抽象化して表したものです。 オーディオ エンドポイント デバイスの例としては、スピーカー、ヘッドフォン、マイクがあります。 詳しくは、「オーディオ エンドポイント デバイス」をご覧ください。

次の図は、コア オーディオ API と、Windows Vista の他のユーザー モード オーディオ コンポーネントとの関係を示しています。

diagram of user-mode audio-rendering components

わかりやすくするために、上の図は、エンドポイント デバイスへのオーディオ レンダリング データ パスのみを示しています。この図にはオーディオ キャプチャ データ パスは表示されていません。 コア オーディオ API には、MMDevice APIWASAPIDeviceTopology APIEndpointVolume API が含まれます。これらは、Audioses.dll および Mmdevapi.dll ユーザー モード システム モジュールに実装されています。

上の図に示すように、コア オーディオ API は、次の上位レベルの API の基盤となっています。

  • メディア ファンデーション
  • Windows マルチメディア waveXxx 関数と mixerXxx 関数
  • DirectSound
  • DirectMusic

DirectSound、Windows マルチメディア オーディオ機能、および Media Foundation (ストリーミング オーディオ レンダラーまたは SAR コンポーネントを使用) は、コア オーディオ API と直接通信します。 DirectMusic は、DirectSound を介してコア オーディオ API と間接的に通信を行います。

WASAPI のクライアントは、エンドポイント バッファーを介してエンドポイント デバイスにデータを渡します。 システム ソフトウェアとハードウェア コンポーネントは、エンドポイント バッファーからエンドポイント デバイスへのデータの移動を、クライアントに対しておおむね透過的な方法で管理します。 さらに、ジャック検出機能のあるオーディオ アダプターに接続するエンドポイント デバイスの場合は、クライアントは、物理的に存在するエンドポイント デバイスに対してのみエンドポイント バッファーを作成できます。 ジャック プレゼンス検出について詳しくは、「オーディオ エンドポイント デバイス」をご覧ください。

上の図では、2 種類のエンドポイント バッファーが示されています。 WASAPI のクライアントが共有モードでストリームを開くと、そのクライアントはエンドポイント バッファーにオーディオ データを書き込み、Windows オーディオ エンジンが書き込まれたバッファーからデータを読み取ります。 このモードでは、クライアントは、他のプロセスで実行されている他のアプリケーションとオーディオ ハードウェアを共有します。 オーディオ エンジンは、これらのアプリケーションからのストリームをミックスし、作成されたミックスをハードウェアを介して再生します。 オーディオ エンジンは、ソフトウェアですべてのストリーム処理操作を実行する、ユーザー モード システム コンポーネント (Audiodg.dll) です。 これに対し、クライアントが排他モードでストリームを開いた場合は、クライアントはオーディオ ハードウェアに排他的にアクセスすることができます。 通常、排他モードが必要なのは、少数の「プロ オーディオ」アプリケーションまたは RTC アプリケーションのみです。 図では共有モードと排他モードの両方のストリームを示していますが、クライアントが共有モードでストリームを開くか排他モードで開くかに応じて、存在するのは、これら 2 つのストリーム (およびそれに対応するエンドポイント バッファー) のうち 1 つだけです。

排他モードでは、クライアントは、エンドポイント デバイスでサポートされている任意のオーディオ形式でストリームを開くことができます。 共有モードでは、クライアントは、オーディオ エンジンで現在使用されているミックス形式 (またはミックス形式に似た形式) でストリームを開く必要があります。 オーディオ エンジンの入力ストリームとエンジンからの出力ミックスはすべて、この形式です。

Windows 7 では、共有モードのストリームに対して、低遅延モードと呼ばれる新機能が追加されました。 このモードでは、オーディオ エンジンはプル モードで実行され、待機時間が大幅に短縮されます。 これは、ストリーミングを高速化するためにオーディオ ストリームの待機時間を短くする必要がある通信アプリケーションに非常に便利です。

待機時間の短いオーディオ ストリームを管理するアプリケーションでは、Windows Vista のマルチメディア クラス スケジューラ サービス (MMCSS) を使用して、エンドポイント バッファーにアクセスするアプリケーション スレッドの優先順位を高めることができます。 MMCSS を使用すると、優先順位の低いアプリケーションの CPU リソースを奪うことなく、オーディオ アプリケーションを高い優先度で実行できます。 MMCSS は、タスク名に基づいてスレッドに優先順位を割り当てます。 たとえば、Windows Vista では、オーディオ ストリームを管理するスレッドのタスク名、「Audio」と「Pro Audio」がサポートされています。 既定では、「Pro Audio」スレッドの優先度は、「Audio」スレッドよりも高くなります。 MMCSS の詳細については、Windows SDK のドキュメントを参照してください。

コア オーディオ API は、PCM ストリーム形式と非 PCM ストリーム形式の両方をサポートしています。 ただし、オーディオ エンジンは PCM ストリームのみミックスさせることができます。 したがって、非 PCM 形式を使用できるのは排他モード ストリームのみです。 詳細については、「デバイス フォーマット」を参照してください。

オーディオ エンジンは、アプリケーションを実行するプロセスとは別に、独自の保護されたプロセスで実行されます。 共有モード ストリームをサポートするために、Windows オーディオ サービス (上の図で「Audio Service」というラベルが付いたボックス) は、アプリケーションとオーディオ エンジンの両方からアクセスできるクロスプロセス エンドポイント バッファーを割り当てます。 排他モードの場合、エンドポイント バッファーは、アプリケーションとオーディオ ハードウェアの両方にアクセスできるメモリ内に存在します。

Windows オーディオ サービスは、Windows オーディオ ポリシーを実装するモジュールです。 オーディオ ポリシーは、同じオーディオ ハードウェアを共有し競合して使用する複数のアプリケーションからのオーディオ ストリーム間の相互作用に対して、システムが適用する一連の内部ルールです。 Windows オーディオ サービスは、オーディオ エンジンの制御パラメーターを設定することで、オーディオ ポリシーを実装します。 オーディオ サービスは次のタスクを行います。

  • ユーザーがシステムに追加またはシステムから削除したオーディオ デバイスを追跡します。
  • システム内のオーディオ デバイスに割り当てられているロールを監視します。
  • 同様のクラスのオーディオ コンテンツ (コンソール、マルチメディア、通信) を生成するタスクのグループからのオーディオ ストリームを管理します。
  • さまざまな種類のオーディオ コンテンツごとに、結合された出力ストリーム (「サブミックス」) のボリューム レベルを制御します。
  • オーディオ ストリームのデータ パス内の処理要素についてオーディオ エンジンに通知します。

Windows の一部のバージョンでは、Windows オーディオ サービスは既定で無効になっており、システムがオーディオを再生する前に明示的に有効にする必要があります。

前の図に示した例では、エンドポイント デバイスは、オーディオ アダプターに接続されているスピーカーのセットです。 クライアント アプリケーションは、エンドポイント バッファーにオーディオ データを書き込み、オーディオ エンジンは、バッファーからエンドポイント デバイスへのデータの転送に関する詳細を処理します。

前の図の「Audio Driver」というラベルの付いたボックスは、システム提供のドライバー コンポーネントとベンダーが提供するドライバー コンポーネントの組み合わせである場合があります。 PCI または PCI Express バス上のオーディオ アダプターの場合は、システムはポート クラス システム ドライバー (Portcls.sys) を提供します。このドライバーは、アダプター内のさまざまなオーディオ機能のためのポート ドライバーのセットを実装します。またハードウェア ベンダーは、ポート ドライバーのデバイス固有の操作を処理するためのミニポート ドライバーのセットを実装する、アダプター ドライバーを提供します。 PCI または PCI Express バス上の HD オーディオ コントローラーとコーデックの場合は、システムはアダプター ドライバー (Hdaudio.sys) を提供し、ベンダーが提供するドライバーは必要ありません。 USB バス上のオーディオ アダプターの場合は、システムは AVStream クラス システム ドライバー (Ks.sys) と USB オーディオ ドライバー (Usbaudio.sys) を提供します。これについても、ベンダーが提供するドライバーは必要ありません。

わかりやすくするために、上の図では、レンダリング ストリームのみを示しています。 ただし、コア オーディオ API はキャプチャ ストリームもサポートしています。 共有モードでは、オーディオ ハードウェア デバイスからキャプチャされたストリームを、複数のクライアントが共有できます。 排他モードでは、デバイスからキャプチャされたストリームに、1 つのクライアントが排他的にアクセスできます。

プログラミング ガイド