Freigeben über


EVT_ACX_STREAM_SET_RENDER_PACKET Rückruffunktion (acxstreams.h)

Das EvtAcxStreamSetRenderPacket--Ereignis teilt dem Treiber mit, welches Paket gerade vom Client freigegeben wurde.

Wenn keine Störungen vorhanden sind, sollte dieses Paket (CurrentRenderPacket + 1) sein, wobei CurrentRenderPacket das Paket ist, von dem der Treiber derzeit gestreamt wird. Der Treiber sollte das CurrentRenderPacket weiterhin erhöhen, da Pakete gerendert werden, anstatt das CurrentRenderPacket so zu ändern, dass er mit diesem Wert übereinstimmt. Die Eigenschaft enthält den Paketindex (0-basiert) und gegebenenfalls ein EOS-Flag mit dem Byte-Offset des Endes des Datenstroms im aktuellen Paket.

Syntax

EVT_ACX_STREAM_SET_RENDER_PACKET EvtAcxStreamSetRenderPacket;

NTSTATUS EvtAcxStreamSetRenderPacket(
  ACXSTREAM Stream,
  ULONG Packet,
  ULONG Flags,
  ULONG EosPacketLength
)
{...}

Parameter

Stream

Ein ACXSTREAM -Objekt stellt einen Von einem Schaltkreis erstellten Audiodatenstrom dar. Weitere Informationen finden Sie unter ACX – Zusammenfassung von ACX Objects.

Packet

Die Nummer des Pakets, das vom Betriebssystem in den WaveRT-Puffer geschrieben wurde. Abhängig von den vom Treiber bereitgestellten Werten zum AcxRtStreamNotifyPacketCompletekann die Paketnummer Werte überspringen.

Flags

Flags können 0 oder KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200sein, was angibt, dass das Paket das letzte Paket im Datenstrom ist, und EosPacketLength ist eine gültige Länge in Bytes für das Paket. Weitere Informationen finden Sie unter OptionsFlags- in KSSTREAM_HEADER Struktur (ks.h).

EosPacketLength

Die Länge des EOS-Pakets, wenn KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200 in Flags angegeben ist. Null ist ein gültiger Wert. Wenn KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM in Flags nicht angegeben ist, sollte dieser Parameter ignoriert werden. Die EosPacketLength wird in Bytes gemessen.

Rückgabewert

Gibt STATUS_SUCCESS zurück, wenn der Anruf erfolgreich war. Andernfalls wird ein entsprechender Fehlercode zurückgegeben. Weitere Informationen finden Sie unter Verwenden von NTSTATUS-Werten.

STATUS_DATA_LATE_ERROR – Der Treiber gibt diesen Fehler zurück, wenn das Betriebssystem eine Paketnummer übergibt, die bereits übertragen wurde oder derzeit übertragen wird. In diesem Fall ist eine Glitch-Bedingung aufgetreten. Der Treiber kann optional einige daten aus dem Paket verwenden oder die zuvor in diese Paketnummer geschriebenen Daten weiter wiedergeben.

STATUS_DATA_OVERRUN – Der Treiber gibt diesen Fehler zurück, wenn das Betriebssystem eine Paketnummer übergibt, die höher ist als im WaveRT-Puffer gespeichert werden kann. In diesem Fall ist eine Glitch-Bedingung aufgetreten. Der Treiber kann die Daten im Paket optional ignorieren.

STATUS_INVALID_DEVICE_STATE – Der Treiber gibt diesen Fehler zurück, wenn das Betriebssystem diese Routine aufruft, nachdem zuvor das KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM Flag festgelegt wurde.

STATUS_INVALID_PARAMETER – Der Treiber gibt diesen Fehler zurück, wenn er einen anderen ungültigen Parameter findet, abgesehen von den spezifischen Fällen für einen anderen Fehlerstatus. Dies schließt alle Flag-Werte ein, die oben nicht ausdrücklich definiert sind.

Bemerkungen

Nachdem das Betriebssystem diese Routine aufruft, kann der Treiber optional die bereitgestellten Informationen verwenden, um die Hardwareübertragung zu optimieren. Beispielsweise kann der Treiber DMA-Übertragungen optimieren oder Hardware programmieren, um die Übertragung am Ende des angegebenen Pakets zu beenden, falls das Betriebssystem diese Routine nicht erneut aufruft, um den Treiber eines anderen Pakets zu informieren. Dies kann hörbare Auswirkungen des Unterlaufs verringern, z. B. die Einführung einer akustischen Lücke anstelle eines kreisförmigen Puffers. Der Treiber ist jedoch weiterhin verpflichtet, seine internen Paketzähler- und Signalbenachrichtigungsereignisse mit einer nominalen Echtzeitrate zu erhöhen.

Je nach Hardwarefunktionen füllt KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM der Treiber möglicherweise einen Teil des WaveRT-Puffers aus, der auf das EOS-Paket folgt, falls die Hardware Daten über die EOS-Position hinaus überträgt.

Der Client beginnt mit dem Vorabrollen eines Puffers. Wenn der Client ReleaseBuffer aufruft, wird dies in einen Anruf in AudioKSE übersetzt, der in die ACX-Ebene aufruft, wodurch EvtAcxStreamSetRenderPacket für den aktiven ACXSTREAM aufgerufen wird. Die Eigenschaft enthält den Paketindex (0-basiert) und gegebenenfalls ein EOS-Flag mit dem Byte-Offset des Endes des Datenstroms im aktuellen Paket.   

Beispiel

Die Beispielverwendung wird unten gezeigt.

    //
    // Init RT streaming callbacks.
    //
    ACX_RT_STREAM_CALLBACKS rtCallbacks;
    ACX_RT_STREAM_CALLBACKS_INIT(&rtCallbacks);

    rtCallbacks.EvtAcxStreamSetRenderPacket = EvtStreamSetRenderPacket;

    status = AcxStreamInitAssignAcxRtStreamCallbacks(StreamInit, &rtCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
EvtStreamSetRenderPacket(
    _In_ ACXSTREAM Stream,
    _In_ ULONG     Packet,
    _In_ ULONG     Flags,
    _In_ ULONG     EosPacketLength
    )
{
    PSTREAM_CONTEXT ctx;
    NTSTATUS        status = STATUS_SUCCESS;

    PAGED_CODE();

    ctx = GetStreamContext(Stream);

    currentPacket = (ULONG)InterlockedCompareExchange((LONG*)&ctx->m_CurrentPacket, -1, -1);

    if (Packet <= currentPacket)
    {
        status = STATUS_DATA_LATE_ERROR;
    }
    else if (Packet > currentPacket + 1)
    {
        status = STATUS_DATA_OVERRUN;
    }

    return status;
}

ACX-Anforderungen

Mindestens ACX-Version: 1.0

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

Anforderungen

Anforderung Wert
Header- acxstreams.h
IRQL- PASSIVE_LEVEL

Siehe auch