ポート クラスの概要
PCI および DMA ベースのオーディオ デバイスのほとんどのハードウェア ドライバーは、PortCls システム ドライバー (Portcls.sys) を通じてアクセスできるポート クラス ライブラリに基づいています。 PortCls は、マイクロソフトがオペレーティング システムの一部として含めるオーディオ ポート クラス ドライバーです。 PortCls には、汎用カーネル ストリーミング (KS) フィルター機能の大部分が実装されたポート ドライバーのセットが用意されています。 そのため、PortCls はオーディオ ドライバー開発者のタスクを簡略化します。 ハードウェア ベンダーは、オーディオ アダプターのハードウェア固有の機能を処理するミニポート ドライバーのセットを提供する必要があります。
ハードウェア ベンダーには、オーディオ デバイス用に独自の KS フィルターを実装するオプションがありますが、このオプションは一般的なオーディオ デバイスで使用するのが難しく、必要ありません。 AVStream クラス ドライバーの Stream.sys、Stream クラス ドライバー、または Avstream.sys のいずれかに準拠する KS フィルターを開発できます。 ただし、Stream.sysに基づく KS フィルターでは、AVStream でのみ使用できる機能強化を利用することはできません。 KS フィルターと PortCls について詳しくは、「WDM オーディオ ドライバーの概要」をご覧ください。
PortCls の内部実装は、既存のドライバーとの互換性を維持しながら、連続する Windows リリースでカーネル ストリーミングの改善を利用するよう進化させることができます。
PortCls は、エクスポート ドライバー (カーネル モード DLL) として Portcls.sys システム ファイルに実装されています。以下の項目が含まれています。
アダプター ドライバーによって呼び出すことができるヘルパー関数のセット
オーディオ ポート ドライバーのコレクション
アダプター ドライバーを提供する責任は、オーディオ デバイスのハードウェア ベンダーにあります。 アダプター ドライバーには、初期化とミニポート ドライバー管理コード (DriverEntry 関数を含む)、およびオーディオ ミニポート ドライバーのコレクションが含まれています。
オペレーティング システムがアダプター ドライバーを読み込むとき、アダプター ドライバーはミニポート ドライバー オブジェクトのセットを作成し、ポート ドライバー オブジェクトの対応するセットを作成する PortCls システム ドライバーを要求します。 (「サブデバイスの作成」のコード例は、このプロセスを示しています)。通常、これらのポート ドライバーは、Portcls.sys ファイルで使用できるポート ドライバーのサブセットです。 各ミニポート ドライバーは、サブデバイス ドライバー全体を形成する Portcls.sys から一致するポート ドライバーに自分自身をバインドします。 ポートとミニポートを組み合わせたサブデバイス ドライバーは、KS フィルターです (「オーディオ フィルター」をご覧ください)。 たとえば、一般的なアダプター ドライバーには、WaveRT、DMusUART、トポロジ (IMiniportWaveRT、IMiniportDMus、IMiniportTopology インターフェイスを使用) の 3 つのミニポート ドライバーが含まれる場合があります。 初期化中、これらのミニポート ドライバーは、Portcls.sys ファイルに含まれている WaveRT、DMus、トポロジ ポート ドライバー (IPortWaveRT、IPortDMus、および IPortTopology インターフェイスを使用) にバインドされます。 これら 3 つのサブデバイス ドライバーはそれぞれ、KS フィルターの形式になります。 3 つのフィルターが一緒に、オーディオ アダプターの全機能を公開します。
通常、ポート ドライバーは、オーディオ サブデバイスの各クラスの機能の大部分を提供します。 たとえば、WaveRT ポート ドライバーは、DMA ベースのオーディオ デバイスにオーディオ データをストリーミングするために必要なほとんどの処理を行う一方、ミニポート ドライバーは、DMA アドレスやデバイス名などのデバイス固有の詳細を提供します。
オーディオ アダプター ドライバーとミニポート ドライバーは通常、Microsoft C++ で記述され、COM インターフェイスを広範に使用します。 ポート ミニポート ドライバー アーキテクチャは、モジュール設計を促します。 ミニポート ドライバーライターは、ヘッダー ファイル Portcls.h で定義されている IMiniport インターフェイスから派生した C++ クラスとしてドライバーを実装する必要があります。 ハードウェアの初期化は、ドライバーの読み込み時に行われます。通常、IMiniport 派生クラスの Init メソッド (IMiniportWaveRT::Init など) で行われます。 オーディオ ミニポート ドライバーの COM 実装について詳しくは、「カーネル内の COM」をご覧ください。
次の図は、ポート ドライバーおよびミニポート ドライバーの関係と、オーディオ スタック内での位置を示しています。
上の図では、KSEndpoint コンポーネントは、Windows Vista 以降のバージョンの Windows で提供されるシステム提供のファイルになっています。 このコンポーネントは、DLL (Audiokse.dll) の形式で提供されます。 KSEndpoint はカーネル モード デバイス エンドポイントを抽象化し、オーディオ エンジンに抽象エンドポイントへのアクセスを提供します。 オーディオ エンジンについて詳しくは、「Windows Vista オーディオ エンジンの詳細」をご覧ください。
前の図の凡例は、ベンダーによって提供されるドライバー コンポーネントを表すボックスを示しています。 各ミニポート ドライバーの上端は、各ポート ドライバーの下端とやり取りします。 たとえば、WaveRT ポート ドライバーは、IMiniportWaveRT インターフェイスをポート ドライバーに公開する WaveRT ミニポート ドライバーに IPortWaveRT インターフェイスを公開します。 これらのインターフェイスは、上端と下端のインターフェイスと呼ばれることもあります。
ポート クラス ドライバーと AVStream クラス ドライバーはどちらも WDM ドライバーであり、どちらも WDM カーネル ストリーミング アーキテクチャをサポートするという点で似ています。 ただし、ポート クラス ドライバーは、マルチプロセッサ処理と再入の領域で、AVStream クラス ドライバーとは異なります。 ポート クラス ドライバーは次の処理を行います。
クラス ドライバー、ポート ドライバー、およびベンダーによって提供されるミニポート ドライバーを組み合わせた 3 層アプローチを使用します。
オーディオ機能の数が制限し、ミニポート ドライバーがオーディオ ハードウェアに近い状態で動作できるようにします。
特定のデバイスに対して複数のポートまたはミニポート ドライバーをリンクすることを許可します。 この機能により、多機能カードのサポートが強化されます。
外部バス (USB など) はサポートしないでください。 すべてのポート ドライバーは、システム バス (PCMCIA、PCI) 上に存在するデバイスをサポートします。
WDM オーディオ ポートとミニポート ドライバーを説明するための用語は、Windows ドライバーの他のクラスに使用される用語といくつかの点で異なっています。 これらの違いについては、「WDM オーディオの用語」で説明します。
このセクションでは、次のトピックについて説明します。