次の方法で共有


フィルターファクトリー

オーディオ アダプター ドライバーは、フィルターのインスタンス化を管理するフィルター ファクトリを提供します。 各フィルター ファクトリは、特定の種類の 1 つ以上の KS フィルターをインスタンス化できます。 フィルターの種類で特定のハードウェア機能がカプセル化されている場合、ファクトリでインスタンス化できるその種類のフィルターの数は、基になるハードウェア リソースによって制限されます。

フィルター ファクトリは、ハードウェア機能の大部分が自律的なブロックを管理するため、各フィルター ファクトリはそれ自体がデバイス ドライバーと見なすことができます。 実際、前の段落で使用されるアダプター ドライバーという用語は、アダプター カードのさまざまなハードウェア機能を管理するためにパッケージ化された、関連するドライバー フィルター ファクトリのコレクションを指します。

他の Microsoft Windows ドライバー モデル (WDM) ドライバーと同様に、フィルター ファクトリは電源管理とセットアップ機能を処理します。 インストール中に、ドライバーの INF ファイルは、1 つ以上のフィルター デバイス名を登録します (デバイス識別文字列参照)。 このプロセスでは、オーディオ アダプターのデバイス インターフェイスのインストールの説明に従って、システム レジストリに名前を読み込み、各フィルター ファクトリを 1 つまたは複数の KS フィルター カテゴリに関連付けます 。 すべてのオーディオ デバイスはKSCATEGORY_AUDIOに分類されますが、オーディオ デバイスは、KSCATEGORY_RENDER (オーディオ レンダリング デバイスの場合) やKSCATEGORY_CAPTURE (オーディオ キャプチャ デバイスの場合) などの追加カテゴリに分類される場合もあります。 ドライバーは、デバイスのフィルターを登録するさまざまなカテゴリを使用して、デバイスの一般的な機能をアドバタイズします。 たとえば、SysAudio システム ドライバーが特定の種類のオーディオ デバイスを必要とする場合、レジストリで適切なカテゴリに分類されるデバイスを検索します。

オペレーティング システムでは、「デバイスとドライバーのインストールの」の説明に従って、セットアップ API を使用して、レジストリ内のすべてのKSCATEGORY_AUDIO フィルター ファクトリを検出して列挙します。 各ファクトリのレジストリ エントリは、フィルター ファクトリのフレンドリ名とそのデバイス名の両方を指定します。これは、クライアントがフィルターをインスタンス化する create-file 呼び出しに渡す長い文字列です。 この呼び出しは、カーネル モードから ZwCreateFile を したり、ユーザー モードから CreateFile を したりするために行われる場合があります。 フィルターはカーネル モード オブジェクトであり、カーネル ハンドルによって識別されます。 ファイルの作成呼び出しは、クライアントがフィルターを参照するために使用できるインスタンス ハンドルを返します。 オーディオ グラフ内のユーザー モード クライアントまたはアップストリーム フィルターは、このハンドルを使用して、IOCTL 要求をフィルターに送信または転送できます。 CreateFileの詳細については、Microsoft Windows SDK のドキュメントを参照してください。

一般的な WDM オーディオ アダプター カードは、たとえば PCI バス上に存在し、ウェーブ データをレンダリングまたはキャプチャするための複数の I/O コネクタが含まれている場合があります。 このカードの 1 つのオーディオ デバイスには、一連のスピーカーとラインアウト ケーブルを駆動するためのアナログ オーディオ出力ジャックと、マイクとラインイン ケーブルから信号を受信するためのアナログ オーディオ入力ジャックが含まれている場合があります。 WDM オーディオ システムは、デバイスをフィルターとして表し、オーディオ ジャックをそのフィルターのピンとして表します。

オーディオ デバイスのフィルターは、個別のポートとミニポート ドライバーとして実装され、まとめて動作するようにバインドされます。

  • ミニポート ドライバーには、ハードウェア固有のコードが含まれています。
  • ポート ドライバーには、特定の種類のすべてのフィルターに共通する汎用コードが含まれています。

ベンダーは、ミニポート ドライバーを記述します。このドライバーには、フィルターがオーディオ ハードウェアを管理するために必要なすべての独自のコードが含まれています。 オペレーティング システムは、PortCls システム ドライバー (Portcls.sys; を介してアクセスできるポート ドライバーを提供します。ポート クラス アダプター ドライバーと PortCls システム ドライバーの参照)。 フィルターの実装をポートドライバーとミニポート ドライバーに分割すると、独自のデバイス用のドライバーを記述するタスクが簡略化されます。

フィルター ファクトリがフィルターをインスタンス化すると、最初にフィルターのミニポート ドライバー オブジェクトが作成されます。 フィルター ファクトリは、適切なポート オブジェクトのインスタンスを作成し、完全に機能するフィルターを形成するために、そのインスタンスにミニポート ドライバー オブジェクトをバインドします。 Subdevice Creation のコード例は、このプロセスを示しています。 ポートドライバーとミニポート ドライバーは、適切に定義されたソフトウェア インターフェイスを介して相互に通信します。 これらのインターフェイスの詳細については、「ミニポートインターフェイス 」および「デバイスのサポート 」を参照してください。

オーディオ フィルターは、基になるオーディオ デバイスの構造をピン ファクトリ、ノード、および内部接続のコレクションとして公開します。 ミニポート ドライバーは、PCFILTER_DESCRIPTOR型の構造であるフィルター記述子にこの情報を統合します。 この構造には、フィルターのピン ファクトリ、ノード、および内部接続の個々の記述子が含まれます。 これらの記述子は、次の型の構造体です。

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

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