オーディオ コンポーネントの User-Mode
Windows Vista では、コア オーディオ API がユーザー モード オーディオ サブシステムの基盤として機能します。 コア オーディオ API は、ユーザー モード クライアントとカーネル モード オーディオ ドライバーとオーディオ ハードウェアを分離するユーザー モード システム コンポーネントのシン レイヤーとして実装されます。 DirectSound や Windows マルチメディア機能などの上位レベルのオーディオ API は、コア オーディオ API を介してオーディオ デバイスにアクセスします。 さらに、一部のオーディオ アプリケーションはコア オーディオ API と直接通信します。
コア オーディオ API は、オーディオ エンドポイント デバイスのわかりやすい概念をサポートします。 オーディオ エンドポイント デバイスは、ユーザーが直接操作する物理デバイスを表すソフトウェア抽象化です。 オーディオ エンドポイント デバイスの例としては、スピーカー、ヘッドフォン、マイクがあります。 詳細については、「オーディオ エンドポイント デバイスの」を参照してください。
次の図は、コア オーディオ API と、Windows Vista の他のユーザー モード オーディオ コンポーネントとの関係を示しています。
ユーザー モードのオーディオ レンダリング コンポーネントの
わかりやすくするために、上の図は、エンドポイント デバイスへのオーディオ レンダリング データ パスのみを示しています。図にはオーディオ キャプチャ データ パスは表示されません。 コア オーディオ API には、MMDevice API、WASAPI、DeviceTopology API、EndpointVolume APIが含まれます。これは、Audioses.dll および Mmdevapi.dll ユーザー モード システム モジュールに実装されています。
上の図に示すように、コア オーディオ API は、次の上位レベルの API の基盤を提供します。
- Media Foundation
- 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 オーディオ サービスは既定で無効になっており、システムがオーディオを再生する前に明示的に有効にする必要があります。
前の図に示した例では、エンドポイント デバイスは、オーディオ アダプターに接続されているスピーカーのセットです。 クライアント アプリケーションは、エンドポイント バッファーにオーディオ データを書き込み、オーディオ エンジンは、バッファーからエンドポイント デバイスにデータを転送する詳細を処理します。
前の図の "オーディオ ドライバー" というラベルの付いたボックスは、システム提供のドライバー コンポーネントとベンダーが提供するドライバー コンポーネントの組み合わせである可能性があります。 PCI または PCI Express バス上のオーディオ アダプターの場合、システムはポート クラス システム ドライバー (Portcls.sys) を提供します。このドライバーは、アダプターのさまざまなオーディオ機能のポート ドライバーのセットを実装します。ハードウェア ベンダーは、ポート ドライバーのデバイス固有の操作を処理するミニポート ドライバーのセットを実装するアダプター ドライバーを提供します。 PCI または PCI Express バス上のハイ ビジョン オーディオ コントローラーとコーデックの場合、システムはアダプター ドライバー (Hdaudio.sys) を提供し、ベンダーが提供するドライバーは必要ありません。 USB バス上のオーディオ アダプターの場合、システムは AVStream クラス システム ドライバー (Ks.sys) と USB オーディオ ドライバー (Usbaudio.sys) を提供します。再び、ベンダーが指定したドライバーは必要ありません。
わかりやすくするために、上の図はレンダリング ストリームのみを示しています。 ただし、コア オーディオ API ではキャプチャ ストリームもサポートされています。 共有モードでは、複数のクライアントがオーディオ ハードウェア デバイスからキャプチャされたストリームを共有できます。 排他モードでは、1 つのクライアントがデバイスからキャプチャされたストリームに排他的にアクセスできます。
関連トピック