Condividi tramite


EVT_ACX_STREAM_GET_CAPTURE_PACKET funzione di callback (acxstreams.h)

EvtAcxStreamGetCapturePacket indica al driver di indicare quale pacchetto (basato su 0) è stato completamente riempito di recente, incluso il valore QPC al momento dell'avvio del riempimento del pacchetto.

Sintassi

EVT_ACX_STREAM_GET_CAPTURE_PACKET EvtAcxStreamGetCapturePacket;

NTSTATUS EvtAcxStreamGetCapturePacket(
  ACXSTREAM Stream,
  PULONG LastCapturePacket,
  PULONGLONG QPCPacketStart,
  PBOOLEAN MoreData
)
{...}

Parametri

Stream

Un oggetto ACXSTREAM rappresenta un flusso audio creato da un circuito. Il flusso è costituito da un elenco di elementi creati in base agli elementi del circuito padre. Per altre informazioni, vedere ACX - Riepilogo degli oggetti ACX.

LastCapturePacket

Valore che indica la posizione dell'ultimo pacchetto acquisito. Si tratta di un indice basato su 0 che indica quanti pacchetti completi di dati sono stati acquisiti.

QPCPacketStart

Valore che indica l'ora di inizio dell'ultimo pacchetto acquisito.

MoreData

Restituisce TRUE se sono pronti immediatamente altri dati. Il sistema operativo può chiamare nuovamente questa routine dopo l'elaborazione del pacchetto per ottenere le informazioni sul pacchetto successivo. Se il driver restituisce FALSE, l'acquisizione viene eseguita in tempo reale.

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 dei valori NTSTATUS.

Commenti

Prima di leggere i dati audio acquisiti dal buffer audio, il sistema operativo chiama questa routine per ottenere informazioni sui dati disponibili.

Il numero di pacchetto identifica un pacchetto all'interno del flusso. Questa operazione viene reimpostata su zero quando EVT_ACX_STREAM_RELEASEHARDWARE è stato chiamato per il flusso. Il numero avanza con ogni buffer acquisito. Dal numero di pacchetto il sistema operativo può derivare la posizione del pacchetto all'interno del buffer audio e può anche derivare la posizione del flusso del pacchetto relativo all'inizio del flusso.

Il sistema operativo può chiamare questa routine in qualsiasi momento. In un'operazione normale il sistema operativo chiama questa routine dopo che il driver chiama AcxRtStreamNotifyPacketComplete o dopo una chiamata precedente restituisce true per MoreData. Quando il sistema operativo chiama questa routine, il driver può presumere che il sistema operativo abbia completato la lettura di tutti i pacchetti precedenti. Se l'hardware ha acquisito dati sufficienti, il driver potrebbe immediatamente scoppiare il pacchetto completo successivo nel buffer audio e chiamare di nuovo AcxRtStreamNotifyPacketComplete. Nel caso dell'overflow di acquisizione (quando il sistema operativo non legge i dati abbastanza rapidamente) il driver audio può eliminare o sovrascrivere alcuni dati audio. Il driver audio elimina o sovrascrive prima i dati meno recenti. Il driver audio può continuare a avanzare il contatore dei pacchetti interni anche se il sistema operativo potrebbe non aver letto i dati.

Esempio

Di seguito è riportato l'esempio di utilizzo.

#pragma code_seg("PAGE")
NTSTATUS
CodecC_EvtStreamGetCapturePacket(
    _In_ ACXSTREAM          Stream,
    _Out_ ULONG           * LastCapturePacket,
    _Out_ ULONGLONG       * QPCPacketStart,
    _Out_ BOOLEAN         * MoreData
)
{
    PCODEC_STREAM_CONTEXT ctx;
    CCaptureStreamEngine* streamEngine = nullptr;
    ULONG currentPacket;
    LONGLONG qpcPacketStart;

    PAGED_CODE();

    ctx = GetCodecStreamContext(Stream);
    // Retrieve the current packet that is being written to by the audio hardware
    currentPacket = (ULONG)InterlockedCompareExchange((LONG*)&ctx->CurrentPacket, -1, -1);
    qpcPacketStart = InterlockedCompareExchange64(&ctx->LastPacketStart.QuadPart, -1, -1);

    // The Last capture packet is the packet before the current packet.
    *LastCapturePacket = currentPacket - 1;
    *QPCPacketStart = (ULONGLONG)qpcPacketStart;
    *MoreData = FALSE;

    return STATUS_SUCCESS;
}

Requisiti ACX

Versione minima DI ACX: 1.0

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

Requisiti

Requisito Valore
Intestazione acxstreams.h
IRQL PASSIVE_LEVEL

Vedi anche