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 riempito completamente più di recente, incluso il valore QPC al momento in cui il driver ha iniziato a riempire il 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 il numero di pacchetti completi di dati acquisiti.

QPCPacketStart

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

MoreData

Restituisce TRUE se sono disponibili più dati pronti immediatamente. Il sistema operativo può facoltativamente 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 di valori NTSTATUS.

Osservazioni

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. Viene reimpostato 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 rispetto all'inizio del flusso.

Il sistema operativo può chiamare questa routine in qualsiasi momento. Nel normale funzionamento, il sistema operativo chiama questa routine dopo che il driver chiama AcxRtStreamNotifyPacketComplete o dopo che una chiamata precedente restituisce true per MoreData. Quando il sistema operativo chiama questa routine, il driver può presupporre che il sistema operativo abbia terminato la lettura di tutti i pacchetti precedenti. Se l'hardware ha acquisito dati sufficienti, il driver potrebbe scoppiare immediatamente 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 potrebbe eliminare o sovrascrivere alcuni dati audio. Il driver audio elimina o sovrascrive prima i dati meno recenti. Il driver audio può continuare ad avanzare il contatore dei pacchetti interno anche se il sistema operativo potrebbe non aver letto i dati.

Esempio

Di seguito è riportato un 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 di ACX, vedere panoramica della versione ACX.

Fabbisogno

Requisito Valore
intestazione acxstreams.h
IRQL PASSIVE_LEVEL

Vedere anche