Condividi tramite


EVT_ACX_CIRCUIT_POWER_DOWN funzione di callback (acxcircuit.h)

Il callback EVT_ACX_CIRCUIT_POWER_DOWN viene usato dal driver per aggiungere funzionalità nel percorso di spegnimento di un oggetto ACXCIRCUIT.

Sintassi

EVT_ACX_CIRCUIT_POWER_DOWN EvtAcxCircuitPowerDown;

NTSTATUS EvtAcxCircuitPowerDown(
  WDFDEVICE Device,
  ACXCIRCUIT Circuit,
  WDF_POWER_DEVICE_STATE TargetState
)
{...}

Parametri

Device

Oggetto WDFDEVICE (descritto in WDF - Riepilogo degli oggetti framework) associato all'oggetto ACXCIRCUIT specificato.

Circuit

Oggetto ACXCIRCUIT (descritto in Riepilogo degli oggetti ACX) spento.

TargetState

Enumeratore tipizzato WDF_POWER_DEVICE_STATE che identifica lo stato di alimentazione del dispositivo che il dispositivo sta per entrare.

Valore restituito

Restituisce STATUS_SUCCESS se la chiamata ha avuto esito positivo. In caso contrario, restituisce un codice di errore appropriato. Per altre informazioni, vedere Uso di valori NTSTATUS.

Osservazioni

Per registrare una funzione di callback EvtAcxCircuitPrepareHardware, un driver deve chiamare AcxCircuitInitSetAcxCircuitPnpPowerCallbacks.

Se il driver ha registrato una funzione di callback EvtCircuitPowerDown, il framework ACX chiama la funzione ogni volta che uno dei dispositivi del driver lascia lo stato di lavoro (D0). Un dispositivo lascia lo stato D0 quando si verifica uno dei seguenti:

  • Il sistema e tutti i suoi dispositivi stanno per lasciare i loro stati di lavoro e entrare in uno stato di basso consumo.
  • Il dispositivo sta per entrare in uno stato a basso consumo perché è inattiva, se il dispositivo supporta l'inattività a basso consumo.
  • Il gestore Plug and Play sta tentando di ridistribuire le risorse hardware del sistema.
  • Un utente ha indicato, in genere tramite l'interfaccia utente di un'applicazione, che vuole rimuovere il dispositivo.
  • Il framework chiama anche la funzione di callback EvtCircuitPowerDown dopo che un dispositivo è stato rimosso in modo imprevisto (rimosso a sorpresa).

Per altre informazioni sui casi in cui il framework chiama questa funzione di callback, vedere Scenari di risparmio energia e PnP.

A meno che il dispositivo non sia stato rimosso a sorpresa, il framework ACX chiama questa funzione di callback immediatamente dopo che disabilita gli interrupt del dispositivo, ma prima che la potenza del dispositivo venga ridotta da D0 e prima che WDF richiami il callback EvtDeviceD0Exit del driver nei dispositivi associati. Il parametro TargetState identifica lo stato di alimentazione del dispositivo che il dispositivo sta per entrare.

La funzione di callback EvtCircuitPowerDown deve eseguire tutte le operazioni necessarie prima che l'hardware di ACXCIRCUT entri nello stato di alimentazione a basso consumo specificato, ad esempio salvando eventuali informazioni che il driver dovrà successivamente ripristinare l'hardware di ACXCIRCUIT sullo stato di alimentazione D0.

Se TargetState è WdfPowerDeviceD3Final, devi presupporre che il sistema sia disattivato, il dispositivo associato sta per essere rimosso o che sia in corso un ribilanciamento delle risorse. Se il driver deve salvare le informazioni, deve scriverlo su disco o su un altro supporto di archiviazione permanente.

Per altre informazioni sui driver che forniscono questa funzione di callback, vedere Supporto di PnP e risparmio energia in Driver di funzione.

Esempio

Di seguito è riportato un esempio di utilizzo. Questo esempio mostra l'arresto di alcune istanze timer nel codice di test quando il circuito è spento.

EVT_ACX_CIRCUIT_POWER_DOWN          CodecR_EvtCircuitPowerDown;

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

NTSTATUS
CodecR_EvtCircuitPowerDown (
    _In_ WDFDEVICE  Device,
    _In_ ACXCIRCUIT Circuit,
    _In_ WDF_POWER_DEVICE_STATE TargetState
    )
{
    UNREFERENCED_PARAMETER(Device);
    UNREFERENCED_PARAMETER(TargetState);
    
    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);
    WdfTimerStop(muteCtx->Timer, TRUE);

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

    ASSERT(volumeCtx->Timer);
    WdfTimerStop(volumeCtx->Timer, TRUE);

    return STATUS_SUCCESS;
}

Requisiti ACX

versione minima di ACX: 1.0

Per altre informazioni sulle versioni di ACX, vedere panoramica della versione ACX.

Fabbisogno

Requisito Valore
intestazione acxcircuit.h
IRQL PASSIVE_LEVEL

Vedere anche