Condividi tramite


EVT_ACX_STREAM_SET_RENDER_PACKET funzione di callback (acxstreams.h)

L'evento EvtAcxStreamSetRenderPacket indica al driver il pacchetto appena rilasciato dal client.

Se non sono presenti errori, questo pacchetto deve essere (CurrentRenderPacket + 1), dove CurrentRenderPacket è il pacchetto da cui il driver è attualmente in streaming. Il driver deve continuare ad aumentare CurrentRenderPacket perché viene eseguito il rendering dei pacchetti invece di modificarne CurrentRenderPacket in modo che corrisponda a questo valore. La proprietà includerà l'indice del pacchetto (basato su 0) e, se appropriato, un flag EOS con l'offset di byte della fine del flusso nel pacchetto corrente.

Sintassi

EVT_ACX_STREAM_SET_RENDER_PACKET EvtAcxStreamSetRenderPacket;

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

Parametri

Stream

Un oggetto ACXSTREAM rappresenta un flusso audio creato da un circuito. Per altre informazioni, vedere ACX - Riepilogo degli oggetti ACX.

Packet

Numero del pacchetto scritto dal sistema operativo nel buffer WaveRT. A seconda dei valori forniti dal driver per AcxRtStreamNotifyPacketComplete, il numero di pacchetto può ignorare i valori.

Flags

I flag possono essere 0 o KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200, che indicano che il pacchetto è l'ultimo pacchetto nel flusso e EosPacketLength è una lunghezza valida in byte per il pacchetto. Per altre informazioni, vedere OptionsFlags nella struttura KSSTREAM_HEADER (ks.h).

EosPacketLength

Lunghezza del pacchetto EOS se KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200 è specificato in Flag. Zero è un valore valido. Se KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM non è specificato in Flags, questo parametro deve essere ignorato. EosPacketLength viene misurato in byte.

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.

STATUS_DATA_LATE_ERROR: il driver restituisce questo errore se il sistema operativo passa un numero di pacchetto che è già stato trasferito o che è in corso il trasferimento. In questo caso, si è verificata una condizione di errore. Il driver può facoltativamente usare alcuni dati del pacchetto o continuare a riprodurre i dati scritti in precedenza in questo numero di pacchetto.

STATUS_DATA_OVERRUN: il driver restituisce questo errore se il sistema operativo passa un numero di pacchetto superiore a quello che può essere archiviato nel buffer WaveRT. In questo caso, si è verificata una condizione di errore. Il driver può facoltativamente ignorare i dati nel pacchetto.

STATUS_INVALID_DEVICE_STATE: il driver restituisce questo errore se il sistema operativo chiama questa routine dopo aver impostato in precedenza il flag KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM.

STATUS_INVALID_PARAMETER: il driver restituisce questo errore se rileva un altro parametro non valido, a parte i casi specifici per altri stati di errore. Sono inclusi tutti i valori flag non definiti in modo specifico in precedenza.

Osservazioni

Dopo che il sistema operativo chiama questa routine, il driver può facoltativamente usare le informazioni fornite per ottimizzare il trasferimento hardware. Ad esempio, il driver potrebbe ottimizzare i trasferimenti DMA o l'hardware del programma per arrestare il trasferimento alla fine del pacchetto specificato nel caso in cui il sistema operativo non chiami di nuovo questa routine per informare il driver di un altro pacchetto. Ciò può attenuare gli effetti acustici dell'underflow, ad esempio introducendo una distanza udibile anziché ripetere un buffer circolare. Tuttavia, il driver è comunque obbligato ad aumentare il contatore dei pacchetti interno e gli eventi di notifica dei segnali a una velocità in tempo reale nominale.

A seconda delle funzionalità hardware, se viene specificato il flag KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM, il driver può riempire in silenzio una parte del buffer WaveRT che segue il pacchetto EOS nel caso in cui l'hardware trasferisca i dati oltre la posizione EOS.

Il client inizia pre-rotolando un buffer. Quando il client chiama ReleaseBuffer, verrà convertito in una chiamata in AudioKSE che chiamerà nel livello ACX, che chiamerà EvtAcxStreamSetRenderPacket sull'ACXSTREAM attivo. La proprietà includerà l'indice del pacchetto (basato su 0) e, se appropriato, un flag EOS con l'offset di byte della fine del flusso nel pacchetto corrente.   

Esempio

Di seguito è riportato un esempio di utilizzo.

    //
    // 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;
}

Requisiti ACX

versione minima di ACX: 1.0

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

Fabbisogno

Requisito Valore
intestazione acxstreams.h
IRQL PASSIVE_LEVEL

Vedere anche