ACXデバイスの列挙

このトピックでは、ACX デバイスの列挙、起動とシャットダウン、およびデバイスの再調整について説明します。 ACX の一般的な概要については、ACX オーディオ クラス拡張機能の概要を参照してください。 ACX 電源管理と PnP については、ACX 電源管理を参照してください

Note

ACX ヘッダーとライブラリは、WDK 10.0.22621.2428 (2023 年 10 月 24 日リリース) には含まれていませんが、以前のバージョンと WDK の最新 (25000 シリーズ ビルド) Insider Preview で使用できます。 WDK のプレビュー バージョンの詳細については、「Windows Driver Kit (WDK) のプレビュー バージョンのインストール」を参照してください

静的オーディオ デバイスの ACX デバイスの列挙と起動

ACX スタートアップのしくみについては、次のシナリオについて説明します。

  • オーディオ デバイスは、1 つの回線で表されます。
  • オーディオ/回線の有効期間は、PnP デバイスの有効期間に関連付けられています。
  • 1 つのデバイスで、異なるオーディオ デバイスに対して複数の回線を作成できます。
  • KMDF カーネル モード環境。

起動のシーケンスは次のとおりです。

  • WDM DriverEntry。 ドライバー スコープ。 DriverEntry for WDF Drivers ルーチン

    • Init トレース。
    • 必要に応じてアンロードに登録します。
    • WDFDRIVER を作成します。
    • ACX を呼び出して、ポスト ドライバー init を実行します。
    • 必要に応じて、ポスト ドライバー init を実行します。
  • WDF DeviceAdd。 デバイス スコープ。 コールバック関数EVT_WDF_DRIVER_DEVICE_ADD

    • ACX を呼び出してデバイスの初期化コンテキストを初期化する - ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)ACX_DEVICEINIT_CONFIG_INIT関数
    • WDF PnP Power コールバックを登録する - WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
    • AcxDeviceInitialize を使用してデバイスを 作成する
    • ACX を呼び出して、ポスト デバイス init を実行します。
    • 必要に応じて、ポスト デバイス init を実行します。
  • WDF PrepareHardware。 デバイス スコープ。 コールバック関数EVT_WDF_DEVICE_PREPARE_HARDWAREします。

    • ハードウェア リソースを作成して初期化します (割り込みとスレッドの場合は、それらを ACX に登録します)。

    • 1 つ以上の回線を作成します (1 回限り作成)。

      • AcxCircuitInit コンテキストを作成します。
      • コールバックを追加します。
      • AcxCircuit を作成します。
      • 必要に応じて、ポスト回線 init を実行します。
      • 回線 を AcxDeviceAddCircuitDevice に登録します
  • WDF デバイス D0 エントリ コールバック。 デバイス スコープ。 コールバック関数EVT_WDF_DEVICE_D0_ENTRYします。

  • ACX は、すべての回線で EvtAcxCircuitPowerUp コールバック を呼び出します。 回線スコープ。

  • ACX デバイスの電源が切れる前に、ストリーム (ある場合) を以前の状態に移動します。 Stream インスタンススコープ。

  • WDF キューが再起動されます。

  • コールバック関数EVT_WDF_DEVICE_Standard Edition LF_MANAGED_IO_INITします。 デバイス スコープ。

  • コールバック関数EVT_WDF_DEVICE_Standard Edition LF_MANAGED_IO_RESTARTします。 デバイス スコープ。 - Dx からの各電源投入後に Init。

ACX ストリームの追加

  • ACX 回線上の ACX Stream Add (インスタンス) (ACX 回線の ACX コールバック) – WDF 自己管理 I/O Init または Restart が呼び出され、デバイスが D0 に入った後、いつでも呼び出されます。 回線スコープ。
    • 入力: AcxStreamInit コンテキスト、ACXCIRCUIT。
    • コールバックを追加します。
    • AcxStream (インスタンス) を作成します。
    • 必要に応じて、ポスト ストリーム インスタンス init を実行します。
    • 返されると、ACX はこのストリーム インスタンスをアクティブ化し、このシナリオではオーディオ パス上の唯一のものであるため、ストリーム メッセージを通過できます。

動的オーディオ デバイスの ACX デバイスの列挙と起動

このシナリオでは、次のことが想定されます。

  • 動的オーディオのサポート (実行時にオーディオ デバイスを作成または削除する)。
  • デバイスの有効期間は、回線の有効期間に関連付けられません。
  • 1 つのデバイスで、異なるオーディオ デバイスに対して複数の回線を作成できます。
  • 動的パターンに固有の要素のみを追加することで、上記の単純な静的パターンにピギーバックを適用します。
  • 子未加工の PDO を使用します。
  • KMDF カーネル モード環境。

このシナリオのスタートアップのシーケンスは次のとおりです。

  • WDM DriverEntry。 ドライバー スコープ。

    • Init トレース。
    • 必要に応じてアンロードに登録します。
    • WDFDRIVER を作成します。
    • ACX を呼び出して、ポスト ドライバー init を実行します。
    • 必要に応じて、ポスト ドライバー init を実行します。
  • WDF DeviceAdd。 デバイス スコープ。

    • ACX を呼び出して、デバイスの初期化コンテキストを初期化します。
    • デバイスを作成します。
    • ACX を呼び出して、ポスト デバイス init を実行します。
    • 必要に応じて、ポスト デバイス init を実行します。
  • WDF PrepareHardware。 デバイス スコープ。

    • ハードウェア リソースを作成して初期化します (割り込みとスレッドの場合は、それらを ACX に登録します)。
  • WDF デバイス D0 エントリ コールバック。 デバイス スコープ。

  • WDF キューが再起動されます。

  • WDF DeviceSelfManagedIoInit。 デバイス スコープ。

  • WDF DeviceSelfManagedIoRestart。 デバイス スコープ。

    • Dx からの各電源投入後に初期化します。

回線の動的な作成 (いつでも)

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 要求に失敗します。

関連項目

ACX オーディオ クラス拡張機能の概要

ACX リファレンス ドキュメント

PnP および電源管理コールバック シーケンス