ACX IO要求パケットIRP
このトピックでは、オーディオ クラス拡張機能 (ACX) IO 要求パケット IRP の概要について説明します。
ACX の一般的な情報については、「ACX オーディオ クラス拡張機能の概要」と「ACX オブジェクトの概要」を参照してください。 ACX ターゲットと同期については、「ACX ターゲットとドライバーの同期」を参照してください。
IRP 要求のディスパッチ
ACX クライアントは、ドライバー要求 (IRP) を介してアクションを指定します。 IRP の一般的な情報については、「I/O 要求パケット」および「再利用可能な IRP によるパケット駆動 I/O」を参照してください。
クライアントは、回線またはストリーム ハンドルを使用して、この要求を回線/ピン/要素/ストリームに送信します。 要求 ID はトリプレットです。
- セット (guid)
- id/インデックス (ulong)
- オプションの pin-id/node-id (ulong) 値。
作成時に、ドライバーは必要に応じて、プロパティ/メソッド/イベントを次のいずれかのオブジェクトに関連付けることができます。
- pin
- 回線
- stream
- 要素
各プロパティ/メソッド/イベントは、ID とコールバック ハンドラーによって識別されます。 既定では、ACX は KS クライアント (ユーザー モード レイヤー) で必要なすべてのプロパティ/メソッド/イベントを定義するため、ドライバーはそれらを再定義する必要はありません。 ドライバーは、カスタム プロパティ/メソッド/イベントのみを定義する必要があります。
ACX は、ACX/KS スタイルの IoCtrl 要求を受信すると、要求を検証し、呼び出し元のバッファーをメモリにロックします。 この検証とバッファー ロックダウンは、初期化時に ACX が登録した WDM 前処理コールバックで行われます。 このフェーズでは、ACX は、通常のディスパッチのために WDF に転送する前に、WDM IRP に独自の完了コールバックを追加します。 完了コールバックは、必要に応じて互換性の回避策を追加または挿入する機会を ACX に提供します。
次に、WDF は動的ディスパッチ IRP コールバックを呼び出し、このコールバックでは ACX/ドライバー (必要に応じて) WDF キューを要求に関連付けます。 このコールバック ACX では、ターゲット ACX オブジェクト (この要求が送信されたハンドルを使用した回線、ピン、回線要素、ストリーム)、および要求内のオプションの pin-id/node-id/circuit-element を検索します。
オーディオ複合デバイスでは、ターゲット オブジェクト (回線のみ) が、要求が最初に送信されたスタックとは異なるスタックに配置される場合があります。 さらに、要求は複数のスタックに対して動作する必要がある場合があります。その例として、ストリーム変更の状態があります。
ターゲットが識別されると、ACX は、ターゲット回線/ストリーム オブジェクトが既定の処理キューのオーバーライドを指定した場合にチェックします。指定されていない場合、ACX は現在のハンドルに関連付けられている既定のキューを使用します。 その後、ACX/ドライバー は、指定されたキューまたは既定のキューに要求を挿入するように WDF に指示します。
次の WDF は、呼び出し元プロセス コールバックが存在する場合に呼び出します。 ACX は、前処理コールバック内のメモリ内のバッファーを既にロックしているため、呼び出し元内プロセス コールバックを必要としません/使用します。 したがって、ACX は、要求のターゲット キューを指定した後、インプロセス コールバックを呼び出さないことを WDF に通知します。
セカンダリ キューの使用
既定の ACX キューは、電源管理、シリアル、ロックなしキューです。 ドライバーは、未確定の時間を要する要求をセカンダリ キューに移動する必要があります。 ドライバー管理のキューは、手動パッシブ キューである場合があります。このキューでは、後で完了する準備ができるまで、ドライバーはこれらの要求を保持できます。
電源リファレンス要求
ACX は、ドライバーに要求をディスパッチする前に、デバイスの電源を自動的にオンにします。 これは、WDF 電源管理キューを使用して暗黙的に行われます。 これにより、portcls のような動作が作成されます。 つまり、要求をディスパッチする前に、電源リファレンスが取得されます。
キューのディスパッチ ハンドラーの呼び出し
次に、WDF は電源リファレンスを受け取り、キューのディスパッチ ハンドラーを呼び出します。 ACX ハンドラーに関連付けられている既定のキューは、前処理のオーバーライドをチェックし、存在する場合は、ACX が登録されたドライバーの前処理コールバックを呼び出します。 ACX を使用すると、ドライバーは要求の種類 (プロパティ、イベント、メソッド) と (必要に応じて) 要求 ID に基づいてオーバーライドを指定できます。
前処理コールバックが指定された場合、ACX がコールバックを呼び出した後、要求はドライバーによって所有されます。 ドライバーは要求を完了するか、通常のディスパッチのために ACX に転送できます。
前処理コールバックが指定されていない場合、またはドライバーが要求を ACX に返した場合、ACX はターゲット ACX オブジェクトを取得し、宣言されたプロパティ/イベント/メソッドのコールバックを検索します。 次に、WDF 要求とターゲット ACX オブジェクト (circuit/stream/circuit-element) を渡すコールバックを呼び出します。
次の ACX (またはカスタム プロパティの場合、ドライバー) は、要求されたアクションを実行して要求を完了します。または、要求に未確定の時間がかかる場合、ドライバーは要求をセカンダリ キューに移動できます。 ドライバーは、アクティブな保留中の要求をシリアル化して完了する必要があります。
この図は、一般的な要求ディスパッチ ワークフローを示しています。
この図は、ドライバーに ACX 前処理コールバックが定義されている場合のディスパッチ ワークフローを示しています。ただし、最終的には要求は ACX フレームワークによって処理されます。
ACX 回線 PnP 内部インターフェイス
ACX エンドポイント マネージャー (EM) と ACX ドライバー コンポーネント (カーネル モードまたはユーザーモード コンポーネント) の間の通信を容易にするために、ACX は次の内部 PnP デバイス インターフェイスを定義します。
- ACXCATEGORY_CIRCUITFACTORY
- ACXCATEGORY_CIRCUIT
EM では、ACXCATEGORY_CIRCUITFACTORY インターフェイスを使用して、この種類の特定の回線を作成または削除するようにターゲット デバイスに指示します。 このインターフェイスは、下線デバイスが回線を作成できる間にアクティブになります。それ以外の場合は無効になります (削除、予期しない削除、停止、手動削除など)。
オーディオ サブシステムは、ACXCATEGORY_CIRCUIT (回線マネージャー スタックとは異なるデバイス スタックに作成される可能性があります) を使用して、ACX 回線を追跡して通信します。 このインターフェイスは、回線が作成され、コマンドを処理する準備ができたときにアクティブになります。
その他の電源および PnP プロセスの詳細については、「ACX デバイスの列挙」 と 「ACX 電源管理」を参照してください。