フィルター ファクトリ

オーディオ アダプター ドライバーは、フィルターのインスタンス化を管理するフィルター ファクトリを提供します。 各フィルター ファクトリは、特定の種類の 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 型の構造です。 つまり、この構造には、フィルターのピン ファクトリ、ノード、内部接続の個々の記述子が含まれています。 これらの記述子は以下の型の構造体です。

PCPIN_DESCRIPTOR

PCNODE_DESCRIPTOR

PCCONNECTION_DESCRIPTOR

ミニポート ドライバーからフィルター記述子を取得するには、ポート ドライバーは IMiniport::GetDescription メソッドを呼び出します。

ドライバーが PCFILTER_DESCRIPTOR 構造を設定する方法の例については、「サンプル オーディオ ドライバー」で説明されている Sysvad サンプル ドライバーをご覧ください。