このトピックでは、ACX 電源管理について説明します。 ACX デバイスの列挙、スタートアップとシャットダウン、およびデバイスの再調整については、 ACX デバイスの列挙を参照してください。 ACX の一般的な概要については、ACX オーディオ クラス拡張機能の概要
ACX は WDF KMDF PnP 電源動作を利用します。 KMDF 電源管理シーケンスの詳細については、「 PnP と電源管理コールバック シーケンス」を参照してください。
ACX ドライバーは、WDF_PNPPOWER_EVENT_CALLBACKS 構造を実装するなどして、WDF Power Management を完全に実装することをお勧めします。 詳細については、「 ドライバーでの PnP と電源管理のサポート」を参照してください。
ACX デバイスの突然の削除
WDF フレームワークは 、いつでも EvtDeviceSurpriseRemoval を呼び出すことができます。つまり、このコールバックは電源ダウン シーケンスでシリアル化されません。 WDF ドライバーは、デバイスが突然削除されたことをメモする以外に、このコールバックの受信に対してアクションを実行しないでください。
電源オフの突然削除コールバックシーケンスは、電源オフ Dx および削除ケースと同じです。WDF は、突然削除経路では次のコールバックを呼び出しません。
- EvtDeviceArmWakeFrom* (EvtDeviceArmWakeFromS0 など)
- EvtIoStop (電源マネージド キューの消去) EvtWdfIoQueueIoStop
- EvtDeviceSelfManagedIoFlush (消去 I/O バッファー)
詳細については、「 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/Audio Endpoint の初期化中に呼び出される次のコールバックを定義します。
EvtAcxCircuitPrepareHardware: ACX は、WDF が WDF 準備ハードウェア コールバックを提供した直後にこのコールバックを呼び出します。 ドライバーが回路に固有の「準備ハードウェア」を実行する機会を得ることができます。 この呼び出しは ACX によってシリアル化されます。 この呼び出しが呼び出されたとき、デバイスは D0 にありません。
EvtAcxCircuitPowerUp: ACX は、Dx から戻った直後にこのコールバックを呼び出します。 この呼び出しは ACX によってシリアル化されます。 デバイスは D0 にあります。
複合エンドポイントの場合、AcxCircuits は必要に応じて次のコールバックに登録できます。
EvtAcxCircuitCompositeCircuitInitialize は、ACX がこの ACXCIRCUIT が表示されていることを初めて検出するときに呼び出されます。つまり、関連付けられているデバイスが D0 に入り、この回線が独自のスタックの外部のエンティティに表示されるようにしました。 回線のオーディオ インターフェイスは引き続き OFF 状態です。
ACX が複合エンドポイントの初期化を完了するたびに呼び出される EvtAcxCircuitCompositeInitialize。 このコールバックの後、ACX はこの回線のオーディオ インターフェイスをオンにします。
ACX が複合エンドポイントを破棄するたびに呼び出される EvtAcxCircuitCompositeDeinitialize。 ドライバーは、独自のスタックが突然削除された場合、または 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 は、このオブジェクトの最後の ref が終了した後にこのコールバックを呼び出します。 この呼び出しは、WDF オブジェクト呼び出しを削除すると非同期になります。 この呼び出しが呼び出されたときに、デバイスが D0 に含まれていない可能性があります。 このコールバックは、オブジェクトの最後の参照が終了した後にのみ呼び出されます。 コールバックは、 < = DPC レベルで実行されています。 正確な IRQL は、最後の ref を解放するスレッドの IRQL に依存します。
ACX デバイスの休止管理
ACX は、WDF アイドル管理インフラストラクチャを活用します。 ACX ドライバーでは、次の WDF DDI を使用してアイドル管理を有効にします。
WdfDeviceAssignS0IdleSettings: この呼び出しは、アイドル タイムアウトとアイドル管理の種類を指定します。 ACX ドライバーは、デバイスの適切な設定を自由に使用できます。
WdfDeviceStopIdle: この呼び出しにより、デバイスがアイドル状態にならないようにします。 彼の呼び出しが Sx 要求をブロックすることはありません。 つまり、システムが低い電力状態になると、デバイスはアクティブな電源参照の数とは無関係に Dx になります。
WdfDeviceResumeIdle: この呼び出しにより、デバイスはアイドル タイムアウトを再起動できます。
マルチスタック/回線シナリオでは、スタックによってアイドル タイムアウトが異なる場合があります。 これは、各スタックの電源設定/要件が異なるため、異なるアイドル タイムアウトが適切であるためです。 マルチスタックに関する一般的な情報については、 ACXマルチスタッククロスドライバ通信を参照してください。
ACX ドライバーと電源マネージド キュー
WDF では、電源マネージド I/O キューがサポートされます。 この種類のキューは、WDF 電源管理と完全に統合されています。 WDF は、WDF シーケンスの電源投入/電源ダウンのさまざまな手順でキューのコールバックを呼び出します。 詳細については、「 Power-Managed 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_SETTINGSの ExcludeD3Cold フィールドを使用して、ドライバーの D3Cold 機能について認識します。 ドライバーは、この構造体を WdfDeviceAssignS0IdleSettings への入力として渡します。
WDF ドライバーは、システム環境 (ACX への応答) に応じて、WdfDeviceAssignS0IdleSettings を複数回呼び出して D3Cold を有効または無効にすることができます。 詳細については、 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS構造を参照してください。
電源管理フレームワーク (PoFx) とドライバーによって管理されるアイドル タイムアウト
Component-Level 電源管理
WDF は Fx デバイス/コンポーネントの状態を直接サポートしないことに注意してください。 これらの状態を使用するには、ドライバー管理のアイドルタイムアウトを使用する必要があります。 Fx デバイス コンポーネントの状態とドライバーで管理されるアイドル タイムアウトの使用の詳細については、次のトピックを参照してください。
電源管理フレームワーク (PoFx)
Windows には、コンポーネント レベルの電源管理のサポートを追加するランタイム電源管理フレームワーク (PoFx) が用意されています。 コンポーネント (サブデバイス) は、同じデバイス内の他のコンポーネントとは関係なく、電源をオンにしたり、低電力状態に切り替えたりできるデバイスの機能ハードウェア ユニットです。 詳細については、「 Power Management Framework の概要」を参照してください。