ACX 電源管理

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

ACX は WDF KMDF PnP 電源の動作を利用します。 KMDF 電源管理シーケンスについて詳しくは、「PnP と電源管理コールバック シーケンス」を参照してください。

ACX ドライバーは、WDF_PNPPOWER_EVENT_CALLBACKS構造を実装するなどして、WDF Power Management を完全に実装することをお勧めします。 詳細については、「ドライバーでの PnP と電源管理のサポート」を参照してください

Note

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

ACX デバイスの予期しない削除

WDF フレームワークはいつでも EvtDeviceSurpriseRemoval を呼び出すことができます。つまり、このコールバックはパワー ダウン シーケンスでシリアル化されません。 WDF ドライバーは、デバイスが予期せず削除されたことをメモする以外に、このコールバックの受信に対してアクションを実行しないでください。

電源ダウンの予期しない削除のコールバック シーケンスは、電源ダウン Dx および削除のケースと同じです。WDF は、予期しない削除パスで次のコールバックを呼び出しません。

詳細については、「 PnP および電源管理コールバック シーケンス 」および 「Power-Managed I/O キューの使用」を参照してください。

ACX 回線の電源投入とスタートアップ

"動的" AcxCircuit はいつでも追加できます。 ドライバーは、新しい子 PDO デバイスを作成し、この PDO デバイスの WDF PrepareHardware コールバックを処理するときに新しい AcxCircuit を関連付けます。 "動的" 回線の有効期間は、FDO の有効期間にバインドされません。

"静的" AcxCircuit は、ドライバーが FDO デバイスの WDF PrepareHardware コールバックを処理している場合にのみ追加できます。 "静的" 回線の有効期間は、FDO の有効期間にバインドされます。

ACX ドライバーは、AcxFactoryCircuitCreate 関数を使用して、電源投入シーケンス中に AcxFactoryCircuit オブジェクト (回線プロバイダー) を作成することもできます。 AcxFactoryCircuit オブジェクトは、ACX によって要求されたときに ACXCIRCUITS を追加するために動的回線の作成を使用します。 この機能は、複合エンドポイント (つまり、2 つ以上の ACXCIRCUIT を連結したオーディオ エンドポイント) を構築する場合に非常に便利です。

ACX 回線は、AcxCircuit/オーディオ エンドポイントの初期化中に呼び出される次のコールバックを定義します。

  • EvtAcxCircuitPrepareHardware: ACX は、WDF が WDF 準備ハードウェア コールバックを提供した直後にこのコールバックを呼び出します。 ドライバーは、回線に固有の "準備ハードウェア" を実行する機会を与えます。 この呼び出しは ACX によってシリアル化されます。 この呼び出しを行ったとき、デバイスは D0 の状態ではありません。

  • EvtAcxCircuitPowerUp: ACX は、Dx から戻った直後にこのコールバックを呼び出します。 この呼び出しは ACX によってシリアル化されます。 デバイスは D0 の状態です。

複合エンドポイントの場合、AcxCircuits は必要に応じて次のコールバックに登録できます。

  • EvtAcxCircuitCompositeCircuitInitialize は、ACX がこの ACXCIRCUIT が表示されていることを初めて検出するときに呼び出されます。つまり、関連付けられているデバイスが D0 に入り、この回線が独自のスタックの外部のエンティティに表示されるようにしました。 回線のオーディオ インターフェイスは引き続き OFF 状態です。

  • EvtAcxCircuitCompositeInitialize は、ACX が複合エンドポイントの初期化を完了するたびに呼び出されます。 このコールバックの後、ACX はこの回線のオーディオ インターフェイスをオンにします。

  • EvtAcxCircuitCompositeDeinitialize は、ACX が複合エンドポイントを破棄するたびに呼び出されます。 ドライバーは、独自のスタックが予期せず削除された場合、または I/O を処理できない場合に、このコールバックを受け取らない可能性があります。

存在する場合、ストリーム インスタンスは電源を切る前の状態に復元されます。

ACX 回線の電源ダウンと削除

"動的" AcxCircuit は、回線に関連付けられているデバイス オブジェクトを無効にして削除することで、いつでも削除できます。 関連付けられている回線は、ドライバーがこの PDO デバイスの WDF PrepareHardware/ReleaseHardware コールバックを処理するときに、削除されたデバイスから削除/デタッチできます。 上記メンションように、"動的" 回路の有効期間は FDO の有効期間にバインドされません。

"静的" AcxCircuit は、ドライバーが FDO デバイスの WDF PrepareHardware/ReleaseHardware コールバックを処理している場合にのみ削除できます。 "静的" 回線の有効期間は、FDO の有効期間にバインドされます。

ドライバーは、WDF PrepareHardware/ReleaseHardware コールバックで AcxFactoryCircuit (回線プロバイダー) を削除できます。 AcxFactoryCircuit を削除すると、関連付けられている "動的" AcxCircuit をすべて削除する効果があります。 AcxCircuit は、ACX マネージャーが特定の回線を削除するように回線ファクトリに指示したとき、または ACX マネージャーがその AcxFactoryCircuit ハンドルを閉じるときにも削除できます。このシナリオでは、ACX はそのハンドルに関連付けられているすべての回線を閉じます。

ACX_CIRCUIT_PNPPOWER_CALLBACKS 構造体では、ACX ドライバーで使用できる次のコールバックについて説明します。

  • EvtAcxCircuitPowerDown: ACX は、Sx/Dx/Stop/Removal/SurpriseRemoval に入る直前、およびドライバーが回線を削除する直前に、このコールバックを呼び出します。 この呼び出しは ACX によってシリアル化されます。 デバイスは D0 状態にありますが、デバイスはいつでも予期せず削除される可能性があることにご注意ください (関連付けられているハードウェアがなくなったことを意味します)。

  • EvtAcxCircuitReleaseHardware: ACX は、WDF が WDF リリース ハードウェア コールバックを配信する直前に、このコールバックを呼び出します。 これによって、回線が動作している間に、ドライバーに任意のクリーンアップを行う機会が与えられます。 この呼び出しは ACX によってシリアル化されます。 この呼び出しが呼び出されたとき、デバイスは D0 にありません。

  • EvtWdfObjectContextCleanup: WDF/ACX オブジェクトが削除されると、WDF によってこのコールバックが呼び出されます。 この呼び出しは、WDF オブジェクト削除の呼び出しと同期されます。 この呼び出しが行われたときに、デバイスが D0 の状態でない可能性があります。 コールバックはパッシブ レベルで実行されています。

  • EvtWdfObjectContextDestory: WDF は、このオブジェクトの最後の参照が終了した後にこのコールバックを呼び出します。 この呼び出しは、WDF オブジェクト削除の呼び出しと非同期です。 この呼び出しが行われたときに、デバイスが D0 の状態でない可能性があります。 このコールバックは、オブジェクトの最後の参照が終了した後にのみ呼び出されます。 コールバックは、<= DPC レベルで実行されています。 正確な IRQL は、最後の参照を解放するスレッドの IRQL に依存します。

ACX デバイスのアイドル管理

ACX は、WDF アイドル管理インフラを活用します。 ACX ドライバーでは、次の WDF DDI を使用してアイドル管理を有効にします。

  • WdfDeviceAssignS0IdleSettings: この呼び出しは、アイドル タイムアウトとアイドル管理の種類を指定します。 ACX ドライバーは、デバイスの適切な設定を自由に使用できます。

  • WdfDeviceStopIdle: この呼び出しにより、デバイスがアイドル状態にならないようにします。 この呼び出しでは、Sx 要求はブロックされません。 つまり、システムが低い電力状態になると、デバイスはアクティブな電源参照の数とは無関係に Dx 状態になります。

  • WdfDeviceResumeIdle: この呼び出しにより、デバイスはアイドル タイムアウトを再起動できます。

マルチスタック/回線のシナリオでは、スタックによってアイドル タイムアウトが異なる場合があります。 これは、各スタックの電源設定/要件が異なるため、異なるアイドル タイムアウトが適切であるためです。 マルチスタックに関する一般的な情報については、ACX マルチ スタックのクロス ドライバー通信を参照してください

ACX ドライバーと電源管理キュー

WDF では、電源管理 I/O キューがサポートされます。 この種類のキューは、WDF 電源管理と完全に統合されています。 WDF は、WDF シーケンスの電源投入/電源ダウンのさまざまな手順でキューのコールバックを呼び出します。 詳細については、「電源管理 I/O キューの使用」を参照してください。

ACX ドライバーは、ドライバーがマルチステート (Fx) 機能を持つ単一または複数コンポーネントを使用していない場合にのみ、この種類のキューを使用できます。

ACX ドライバーと D3Hot/D3Cold (D3) 状態

オーディオ ドライバーは、ACX_DX_EXIT_LATENCY 列挙体で使用可能な情報に基づいて、D3Hot または D3Cold に移動するタイミングを認識します。

typedef enum _ACX_DX_EXIT_LATENCY { 
  AcxDxExitLatencyInstant     = 0,
  AcxDxExitLatencyFast,
  AcxDxExitLatencyResponsive
} ACX_DX_EXIT_LATENCY;

AcxDxExitLatencyFast は D3Hot (DSP on) に対応し、AcxDxExitLatencyResponsive は D3Cold (DSP off) に対応します。

オーディオ ドライバーは、AcxDeviceGetCurrentDxExitLatency 関数を呼び出すことで、ACX_DX_EXIT_LATENCY 値を取得できます。

WDF は、WDF_DEVICE_POWER_POLICY_IDLE_Standard Edition TTINGS の ExcludeD3Cold フィールドを使用して、ドライバーの D3Cold 機能について認識します。 ドライバーは、この構造体を入力として WdfDeviceAssignS0IdleSettings に渡します。

WDF ドライバーは、WdfDeviceAssignS0IdleSettings を複数回呼び出して、システム環境 (ACX への応答) に応じて D3Cold をオンまたはオフにすることができます。 詳しくは、「WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 構造体」を参照してください。

電源管理フレームワーク (PoFx) とドライバーによって管理されるアイドル タイムアウト

コンポーネント レベルの電源管理

WDF は Fx デバイス/コンポーネントの状態を直接サポートしないことにご注意ください。 これらの状態を使用するには、ドライバーでドライバーが管理するアイドル タイムアウトを使用する必要があります。 Fx デバイス コンポーネントの状態とドライバーで管理されるアイドル タイムアウトの使用の詳細については、次のトピックを参照してください。

電源管理フレームワーク (PoFx)

Windows には、コンポーネント レベルの電源管理のサポートを追加する、実行時の電源管理フレームワーク (PoFx) が用意されています。 コンポーネント (サブデバイス) は、同じデバイス内の他のコンポーネントとは関係なく、電源をオンにしたり、低電力状態に切り替えたりできるデバイスの機能ハードウェア ユニットです。 詳しくは、「電源管理フレームワークの概要」を参照してください。

関連項目

ACXデバイスの列挙

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

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

Power-Managed I/O キューの使用。

PnP と電源管理のコールバック シーケンス