EVT_ACX_CIRCUIT_POWER_UP Rückruffunktion (acxcircuit.h)

Der EVT_ACX_CIRCUIT_POWER_UP Rückruf wird vom Treiber verwendet, um Funktionen im Power-up-Pfad eines ACXCIRCUIT-Objekts hinzuzufügen.

Syntax

EVT_ACX_CIRCUIT_POWER_UP EvtAcxCircuitPowerUp;

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

Parameter

Device

Ein WDFDEVICE-Objekt (beschrieben in WDF – Zusammenfassung von Frameworkobjekten), das dem angegebenen ACXCIRCUIT zugeordnet ist.

Circuit

Das ACXCIRCUIT-Objekt (beschrieben unter Zusammenfassung von ACX-Objekten) wird aktiviert.

PreviousState

Ein WDF_POWER_DEVICE_STATE typisierter Enumerator, der den vorherigen Energiezustand des Geräts identifiziert.

Rückgabewert

Gibt zurück STATUS_SUCCESS , wenn der Aufruf erfolgreich war. Andernfalls wird ein geeigneter Fehlercode zurückgegeben. Weitere Informationen finden Sie unter Verwenden von NTSTATUS-Werten. Wenn der Treiber bei diesem Rückruf fehlschlägt, beendet das ACX-Framework den zugeordneten ACXSTREAMS, falls vorhanden, und markiert den ACXCIRCUIT als pending-delete. Das ACX-Framework schlägt beim Unterstrichen des ACX EvtDeviceD0Entry-Rückrufs nicht fehl. Dadurch können vorhandene funktionierende ACXCIRCUITs von diesem Gerät verwendet werden, um funktionierende Audiopfade zu erstellen.

Hinweise

Um eine EvtCircuitPowerUp-Rückruffunktion zu registrieren, muss ein Treiber AcxCircuitInitSetAcxCircuitPnpPowerCallbacks aufrufen.

Wenn der Treiber eine EvtCircuitPowerUp-Rückruffunktion für ein Gerät registriert hat, ruft das Framework die Funktion bei jedem Wechsel des Geräts in den Betriebszustand (D0) auf. Ein Gerät wechselt in den D0-Zustand, wenn eine der folgenden Aktionen auftritt:

  • Ein Gerät wird aufgezählt (weil das Gerät angeschlossen oder das System neu gestartet wurde).
  • Das System und alle seine Geräte kehren aus einem Energiesparzustand in ihren Arbeitszustand zurück.
  • Das Gerät kehrt in seinen Betriebszustand zurück, nachdem es in einen Energiesparzustand versetzt wurde, da es sich im Leerlauf befand (wenn das Gerät den Leerlauf mit niedrigem Stromverbrauch unterstützt).
  • Der Plug & Play Manager hat die Hardwareressourcen des Systems auf die Geräte des Systems umverteilt.
  • Das Framework ruft die EvtDeviceD0Entry-Rückruffunktion sofort auf, nachdem das Gerät in den Arbeitszustand (D0) wechselt und für den Treiber verfügbar ist, aber bevor die Unterbrechungen des Geräts aktiviert wurden. Der PreviousState-Parameter identifiziert den Energiezustand des Geräts, in dem sich das Gerät befand, bevor es in den D0-Zustand gelangt ist. Beim ersten Aufruf von EvtDeviceD0Entry durch das Framework wird der PreviousState-Wert WdfPowerDeviceD3Final bereitgestellt.

Diese Rückruffunktion muss alle Vorgänge ausführen, die erforderlich sind, um das Gerät vollständig betriebsbereit zu machen.

Weitere Informationen zu Treibern, die diese Rückruffunktion bereitstellen, finden Sie unter Unterstützen der PnP- und Energieverwaltung im Funktionstreiber.

Die EvtCircuitPowerUp-Rückruffunktion wird unter IRQL = PASSIVE_LEVEL aufgerufen. Sie sollten diese Rückruffunktion nicht auslagerungsfähig machen.

Beispiel

Das Beispiel für die Verwendung ist unten dargestellt. In diesem Beispiel wird gezeigt, wie einige Zeitgeberwerte für die Verwendung im Testcode gestartet werden.

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-Anforderungen

ACX-Mindestversion: 1.0

Weitere Informationen zu ACX-Versionen finden Sie unter ACX-Versionsübersicht.

Anforderungen

Anforderung Wert
Header acxcircuit.h
IRQL PASSIVE_LEVEL

Weitere Informationen