ACX デバイス列挙
このトピックでは、ACX デバイスの列挙、起動とシャットダウン、およびデバイスの再調整について説明します。 ACX の一般的な概要については、ACX オーディオ クラス拡張機能の概要
静的オーディオ デバイスの ACX デバイスの列挙と起動
ACX スタートアップのしくみについては、次のシナリオについて説明します。
- オーディオ デバイスは、1 つの回線で表されます。
- オーディオ/回線の有効期間は、PnP デバイスの有効期間に関連付けられています。
- 1 つのデバイスで、異なるオーディオ デバイスに対して複数の回線を作成できます。
- KMDF カーネル モード環境。
起動のシーケンスは次のとおりです。
WDM DriverEntry。 ドライバー スコープ。 WDF ドライバー用 DriverEntry ルーチン
- Init トレース。
- 必要に応じてアンロードに登録します。
- WDFDRIVER を作成します。
- ACX を呼び出して、ポスト ドライバーの初期化を実行します。
- 必要に応じて、ポスト ドライバーの初期化を実行します。
WDF DeviceAdd。 デバイス スコープ。 EVT_WDF_DRIVER_DEVICE_ADD コールバック関数
- ACX を呼び出してデバイスの初期化コンテキストを初期化する -
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
ACX_DEVICEINIT_CONFIG_INIT 関数 - WDF PnP 電源コールバックの登録 -
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- AcxDeviceInitialize を使用してデバイスを作成する
- ACX を呼び出して、デバイスの初期化後の処理を実行します。
- 必要に応じて、ポスト デバイスの初期化を実行します。
- ACX を呼び出してデバイスの初期化コンテキストを初期化する -
WDF PrepareHardware。 デバイス スコープ。 EVT_WDF_DEVICE_PREPARE_HARDWARE コールバック関数。
ハードウェア リソースを作成して初期化します (割り込みとスレッドの場合は、それらを ACX に登録します)。
1 つ以上の回線を作成します (1 回限り作成)。
- AcxCircuitInit コンテキストを作成します。
- コールバックを追加します。
- AcxCircuit を作成します。
- 必要に応じて、ポスト回線の初期化を実行します。
- AcxDeviceAddCircuitDeviceに回路を登録します。
WDF デバイス D0 エントリ コールバック。 デバイス スコープ。 EVT_WDF_DEVICE_D0_ENTRY コールバック関数。
ACX は、すべての回線で EvtAcxCircuitPowerUp コールバック を呼び出します。 回線スコープ。
ACX デバイスの電源が切れる前に、ストリーム (ある場合) を以前の状態に移動します。 ストリーム インスタンススコープ。
WDF キューが再起動されます。
EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT コールバック関数。 デバイス スコープ。
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART コールバック関数。 デバイス スコープ。 - Dx からの各電源投入後に初期化します。
ACX ストリームの追加
- ACX 回線上の ACX Stream Add (インスタンス) (ACX 回線の ACX コールバック) – WDF 自己管理 I/O Init または Restart が呼び出され、デバイスが D0 に入った後、いつでも呼び出されます。 回線スコープ。
- 入力: AcxStreamInit コンテキスト、ACXCIRCUIT。
- コールバックを追加します。
- AcxStream (インスタンス) を作成します。
- 必要に応じて、ポストストリームインスタンスの初期化を実行します。
- 返されると、ACX はこのストリーム インスタンスをアクティブ化し、このシナリオではオーディオ パス上の唯一のものであるため、ストリーム メッセージを通過できます。
動的オーディオ デバイスの ACX デバイスの列挙と起動
このシナリオでは、次のことが想定されます。
- 動的オーディオのサポート (実行時にオーディオ デバイスを作成または削除する)。
- デバイスの有効期間は、回線の有効期間に関連付けられません。
- 1 つのデバイスで、異なるオーディオ デバイスに対して複数の回線を作成できます。
- 動的パターンに固有の要素のみを追加することで、上記の単純な静的パターンにピギーバックを適用します。
- 未加工の子 PDO を使用します。
- KMDF カーネル モード環境。
このシナリオのスタートアップのシーケンスは次のとおりです。
WDM DriverEntry。 ドライバー スコープ。
- Init トレース。
- 必要に応じてアンロードに登録します。
- WDFDRIVER を作成します。
- ACX を呼び出して、ポスト ドライバーの初期化を実行します。
- 必要に応じて、ポスト ドライバーの初期化を実行します。
WDF DeviceAdd。 デバイス スコープ。
- ACX を呼び出して、デバイスの初期化コンテキストを初期化します。
- デバイスを作成します。
- ACX を呼び出して、デバイス初期化後の処理を行います。
- 必要に応じて、ポスト デバイスの初期化を実行します。
WDF PrepareHardware。 デバイス スコープ。
- ハードウェア リソースを作成して初期化します (割り込みとスレッドの場合は、それらを ACX に登録します)。
WDF デバイス D0 エントリ コールバック。 デバイス スコープ。
WDF キューが再起動されます。
WDF DeviceSelfManagedIoInit。 デバイス スコープ。
WDF DeviceSelfManagedIoRestart。 デバイス スコープ。
- Dx からの各電源投入後に初期化します。
回路の動的作成(いつでも可能)
- ドライバーは、WDFDEVICE_INIT 構造体を WdfPdoInitAllocate を呼び出すことで割り当てます。 ドライバーは、デバイスを正常に作成する前にエラーが発生した場合、WdfDeviceInitFree を呼び出す役割を担います。
- ドライバーは、受信する PnP/電源コールバックを指定します。
- ドライバーは、デバイスを作成します。
- ドライバーは、AcxDeviceAddCircuitDevice
呼び出すことによって、新しいデバイス/回線をインスタンス化します。 - WDF/PnP が引き継がれ、前のセクションで説明した単純な列挙型/スタートアップ パターンが実行されます。
AcxFactoryCircuit
ACX ドライバーは、AcxFactoryCircuitCreate 関数 と AcxDeviceAddFactoryCircuit 関数を使用して、電源投入シーケンス中に AcxFactoryCircuit オブジェクト (回線プロバイダー) を作成することもできます。
ACX ドライバーは回線ファクトリとして ACX に登録されているため、ACX フレームワークは登録済みのファクトリを使用して、新しい回線を作成するようにドライバーに要求します。
AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);
AcxDeviceAddFactoryCircuit(Device, factory);
ACX デバイスの再調整
再調整は、システム リソースの使用でオペレーティング システムがデバイス間でリソースを再調整する必要がある場合に行われます。 再調整の一般的な情報については、「PortCls オーディオ ドライバーの PnP 再調整を実装する」を参照してください。
ACX では、次のようにデバイスの再調整がサポートされます。
電源ダウン WDF/ACX シーケンスでは、ドライバーは、すべてのストリーミング リソース (EvtAcxStreamPowerDown、EvtAcxStreamReleaseHardware)、回線リソース (EvtAcxCircuitPowerDown、EvtAcxCircuitReleaseHardware)、デバイス リソース (EvtDeviceReleaseHardware) を解放します。
すべての要求が保留になり、ハンドルは開いたままです。
電源投入 WDF/ACX シーケンスでは、ドライバーは、新しいリソースが現在のリソースと互換性があることを確認し、その設定に許可された調整を行います。 リソースが現在のデバイス/回線の初期化と互換性がない場合、ドライバーは現在の回線を削除し、新しい回線を作成する必要があります。 詳細については、以下を参照してください。
電源投入シーケンスでは、WDF は EvtDevicePrepareHardware と EvtDeviceD0 エントリを呼び出し、ACX は対応する EvtAcxCircuitPrepareHardware と EvtAcxCircuitPowerUp を呼び出し、すべてのストリームを既存の状態に移動します。
キューが電源投入/実行状態になるとすぐに、I/O フローが再び行われます。
ACX では、アクティブ (RUN) 状態のストリームがある場合に、削除 (クエリの削除に失敗) または再調整 (クエリ停止に失敗) を行うことはできません。
ドライバーは、再調整時に常にオーディオ デバイスを破棄して再作成することを選択することもできます。 これは、デバイスが新しい設定が古いものと互換性ないことを検出した場合と同じシナリオです。 回線の削除は、EvtDevicePrepareHardware/EvtDeviceReleaseHardware コールバックで行う必要があり、新しい回線は EvtDevicePrepareHardware に再作成されます。 ドライバーは、(AcxDeviceRemoveCircuitを使用して) 回線を登録解除することによって回線を削除します。 通常、再調整中にファクトリ回線を削除しないでください。
ユーザー モード ファイル ハンドル
ACX は、新しい回線を再作成する前に、ユーザー モードのファイル ハンドルが閉じられるのを待ちません。 ファイル システム ハンドルの有効期間は、デバイス/回線で使用されるハードウェア リソースの有効期間に関連付けられません。 クライアントは、インターフェイスの到着/削除をリッスンし、ファイル ハンドルを閉じて開き直す必要があります。
古いファイル ハンドルは古いとマークされ、ACX はそれらに関連付けられているすべての I/O 要求に失敗します。