EVT_ACX_CIRCUIT_POWER_UP回调函数 (acxcircuit.h)

驱动程序使用EVT_ACX_CIRCUIT_POWER_UP回调在 ACXCIRCUIT 对象的通电路径中添加功能。

语法

EVT_ACX_CIRCUIT_POWER_UP EvtAcxCircuitPowerUp;

NTSTATUS EvtAcxCircuitPowerUp(
  WDFDEVICE Device,
  ACXCIRCUIT Circuit,
  WDF_POWER_DEVICE_STATE PreviousState
)
{...}

参数

Device

WDFDEVICE 对象 (WDF - 与指定 ACXCIRCUIT 关联的框架对象) 摘要中所述。

Circuit

ACXCIRCUIT 对象 () 启动的 ACX 对象摘要 中所述。

PreviousState

一个WDF_POWER_DEVICE_STATE类型的枚举器,用于标识以前的设备电源状态。

返回值

STATUS_SUCCESS如果调用成功,则返回 。 否则,它将返回相应的错误代码。 有关详细信息,请参阅 使用 NTSTATUS 值。 如果驱动程序未通过此回调,ACX 框架会关闭关联的 ACXSTREAMS(如果有),并将 ACXCIRCUIT 标记为 pending-delete。 ACX 框架不会使下划线 ACX EvtDeviceD0Entry 回调失败,这允许使用此设备的现有工作 ACXCIRCUIT 来生成工作音频路径。

注解

若要注册 EvtCircuitPowerUp 回调函数,驱动程序必须调用 AcxCircuitInitSetAcxCircuitPnpPowerCallbacks

如果驱动程序为设备注册了 EvtCircuitPowerUp 回调函数,则每次设备进入其工作 (D0) 状态时,框架都会调用该函数。 发生以下情况之一时,设备将进入 D0 状态:

  • (枚举设备,因为设备已接通电源或系统已重新启动) 。
  • 系统及其所有设备从低功耗状态返回到其工作状态。
  • 设备在进入低功耗状态后将恢复其工作状态,因为设备处于空闲状态, (如果设备支持低功耗空闲) 。
  • 即插即用管理器已在系统设备之间重新分发了系统的硬件资源。
  • 框架在设备进入其工作 (D0) 状态后立即调用 EvtDeviceD0Entry 回调函数,并可供驱动程序使用,但在启用设备的中断之前。 PreviousState 参数标识设备进入 D0 状态之前处于的设备电源状态。 当框架首次调用 EvtDeviceD0Entry 时,它提供 WdfPowerDeviceD3Final 的 PreviousState 值。

此回调函数必须执行使设备完全正常运行所需的任何操作。

有关提供此回调函数的驱动程序的详细信息,请参阅 在函数驱动程序中支持 PnP 和电源管理

EvtCircuitPowerUp 回调函数在 IRQL = PASSIVE_LEVEL调用。 不应使此回调函数可分页。

示例

示例用法如下所示。 此示例演示如何启动一些计时器值以用于测试代码。

EVT_ACX_CIRCUIT_POWER_UP            CodecR_EvtCircuitPowerUp;

NTSTATUS
CreateCircuit()
{
    ...
    ACX_CIRCUIT_PNPPOWER_CALLBACKS_INIT(&powerCallbacks);
    powerCallbacks.EvtAcxCircuitPowerUp = CodecR_EvtCircuitPowerUp;
    powerCallbacks.EvtAcxCircuitPowerDown = CodecR_EvtCircuitPowerDown;
    AcxCircuitInitSetAcxCircuitPnpPowerCallbacks(circuitInit, &powerCallbacks);
    ...
}

NTSTATUS
CodecR_EvtCircuitPowerUp (
    _In_ WDFDEVICE  Device,
    _In_ ACXCIRCUIT Circuit,
    _In_ WDF_POWER_DEVICE_STATE PreviousState
    )
{
    UNREFERENCED_PARAMETER(Device);
    UNREFERENCED_PARAMETER(PreviousState);

    CODEC_RENDER_CIRCUIT_CONTEXT *  circuitCtx;
    CODEC_MUTE_ELEMENT_CONTEXT *    muteCtx;
    CODEC_VOLUME_ELEMENT_CONTEXT *  volumeCtx;

    PAGED_CODE();

    // for testing.
    circuitCtx = GetRenderCircuitContext(Circuit);
    ASSERT(circuitCtx);

    ASSERT(circuitCtx->MuteElement);
    muteCtx = GetCodecMuteElementContext(circuitCtx->MuteElement);
    ASSERT(muteCtx);

    ASSERT(muteCtx->Timer);
    WdfTimerStart(muteCtx->Timer, WDF_REL_TIMEOUT_IN_MS(10));

    ASSERT(circuitCtx->VolumeElement);
    volumeCtx = GetCodecVolumeElementContext(circuitCtx->VolumeElement);
    ASSERT(volumeCtx);

    ASSERT(volumeCtx->Timer);
    WdfTimerStart(volumeCtx->Timer, WDF_REL_TIMEOUT_IN_MS(1000));

ACX 要求

最低 ACX 版本: 1.0

有关 ACX 版本的详细信息,请参阅 ACX 版本概述

要求

要求
Header acxcircuit.h
IRQL PASSIVE_LEVEL

另请参阅