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