フィルターファクトリー
オーディオ アダプター ドライバーは、フィルターのインスタンス化を管理するフィルター ファクトリを提供します。 各フィルター ファクトリは、特定の種類の 1 つ以上の KS フィルターをインスタンス化できます。 フィルターの種類で特定のハードウェア機能がカプセル化されている場合、ファクトリでインスタンス化できるその種類のフィルターの数は、基になるハードウェア リソースによって制限されます。
フィルター ファクトリは、ハードウェア機能の大部分が自律的なブロックを管理するため、各フィルター ファクトリはそれ自体がデバイス ドライバーと見なすことができます。 実際、前の段落で使用されるアダプター ドライバーという用語は、アダプター カードのさまざまなハードウェア機能を管理するためにパッケージ化された、関連するドライバー フィルター ファクトリのコレクションを指します。
他の Microsoft Windows ドライバー モデル (WDM) ドライバーと同様に、フィルター ファクトリは電源管理とセットアップ機能を処理します。 インストール中に、ドライバーの INF ファイルは、1 つ以上のフィルター デバイス名を登録します (デバイス識別文字列
オペレーティング システムでは、「デバイスとドライバーのインストールの」の説明に従って、セットアップ API を使用して、レジストリ内のすべてのKSCATEGORY_AUDIO フィルター ファクトリを検出して列挙します。 各ファクトリのレジストリ エントリは、フィルター ファクトリのフレンドリ名とそのデバイス名の両方を指定します。これは、クライアントがフィルターをインスタンス化する create-file 呼び出しに渡す長い文字列です。 この呼び出しは、カーネル モードから ZwCreateFile を
一般的な WDM オーディオ アダプター カードは、たとえば PCI バス上に存在し、ウェーブ データをレンダリングまたはキャプチャするための複数の I/O コネクタが含まれている場合があります。 このカードの 1 つのオーディオ デバイスには、一連のスピーカーとラインアウト ケーブルを駆動するためのアナログ オーディオ出力ジャックと、マイクとラインイン ケーブルから信号を受信するためのアナログ オーディオ入力ジャックが含まれている場合があります。 WDM オーディオ システムは、デバイスをフィルターとして表し、オーディオ ジャックをそのフィルターのピンとして表します。
オーディオ デバイスのフィルターは、個別のポートとミニポート ドライバーとして実装され、まとめて動作するようにバインドされます。
- ミニポート ドライバーには、ハードウェア固有のコードが含まれています。
- ポート ドライバーには、特定の種類のすべてのフィルターに共通する汎用コードが含まれています。
ベンダーは、ミニポート ドライバーを記述します。このドライバーには、フィルターがオーディオ ハードウェアを管理するために必要なすべての独自のコードが含まれています。 オペレーティング システムは、PortCls システム ドライバー (Portcls.sys; を介してアクセスできるポート ドライバーを提供します。ポート クラス アダプター ドライバーと PortCls システム ドライバーの
フィルター ファクトリがフィルターをインスタンス化すると、最初にフィルターのミニポート ドライバー オブジェクトが作成されます。 フィルター ファクトリは、適切なポート オブジェクトのインスタンスを作成し、完全に機能するフィルターを形成するために、そのインスタンスにミニポート ドライバー オブジェクトをバインドします。 Subdevice Creation のコード例は、このプロセスを示しています。 ポートドライバーとミニポート ドライバーは、適切に定義されたソフトウェア インターフェイスを介して相互に通信します。 これらのインターフェイスの詳細については、「ミニポートインターフェイス 」および「デバイスのサポート 」を参照してください。
オーディオ フィルターは、基になるオーディオ デバイスの構造をピン ファクトリ、ノード、および内部接続のコレクションとして公開します。 ミニポート ドライバーは、PCFILTER_DESCRIPTOR型の構造であるフィルター記述子にこの情報を統合します。 この構造には、フィルターのピン ファクトリ、ノード、および内部接続の個々の記述子が含まれます。 これらの記述子は、次の型の構造体です。
ミニポート ドライバーからフィルター記述子を取得するには、ポート ドライバーは、IMiniport::GetDescription メソッドを呼び出します。
ドライバーがPCFILTER_DESCRIPTOR構造を設定する方法の例については、Sysvad サンプル ドライバーを参照してください。これについては、「サンプル オーディオ ドライバー」で説明されています。