функция обратного вызова 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 как ожидающий удаления. Платформа ACX не завершает обратный вызов ACX EvtDeviceD0Entry подчеркиванием. Это позволяет использовать существующие рабочие acXCIRCUITs с этого устройства для создания рабочих звуковых путей.
Комментарии
Чтобы зарегистрировать функцию обратного вызова EvtCircuitPowerUp, драйвер должен вызвать AcxCircuitInitSetAcxCircuitPnpPowerCallbacks.
Если драйвер зарегистрировал функцию обратного вызова EvtCircuitPowerUp для устройства, платформа вызывает функцию каждый раз, когда устройство переходит в рабочее состояние (D0). Устройство перейдет в состояние D0 при выполнении одного из следующих действий:
- Перечисляется устройство (так как устройство было подключено или система была перезагружена).
- Система и все ее устройства возвращаются в рабочее состояние из состояния с низким энергопотреблением.
- Устройство возвращается в рабочее состояние после того, как оно перейдет в состояние с низким энергопотреблением, так как оно было бездействующее (если устройство поддерживает маломощное бездействующее).
- Диспетчер Plug and Play перераспределяет аппаратные ресурсы системы между устройствами системы.
- Платформа вызывает функцию обратного вызова EvtDeviceD0Entry сразу после того, как устройство перейдет в рабочее состояние (D0) и доступно драйверу, но до включения прерываний устройства. Параметр PreviousState определяет состояние питания устройства, в котором оно находилось до того, как оно перешло в состояние D0. Когда платформа впервые вызывает EvtDeviceD0Entry, она предоставляет значение PreviousState wdfPowerDeviceD3Final.
Эта функция обратного вызова должна выполнять все операции, необходимые для обеспечения полной работоспособности устройства.
Дополнительные сведения о драйверах, предоставляющих эту функцию обратного вызова, см. в разделе Поддержка 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.
Требования
Требование | Значение |
---|---|
Заголовок | acxcircuit.h |
IRQL | PASSIVE_LEVEL |