ACXデバイスの列挙
このトピックでは、ACX デバイスの列挙、スタートアップとシャットダウン、およびデバイスの再調整について説明します。 ACX の一般的な概要については、「ACX オーディオ クラス拡張機能の概要」を参照してください。 ACX 電源管理と PnP については、「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 ストリーム追加 (インスタンス) (ACX 回線上の ACX コールバック) – WDF 自己管理 I/O 初期化または 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 要求に失敗します。