Partager via


EVT_ACX_STREAM_GET_CAPTURE_PACKET fonction de rappel (acxstreams.h)

EvtAcxStreamGetCapturePacket indique au pilote d’indiquer quel paquet (basé sur 0) a été entièrement rempli récemment, y compris la valeur QPC au moment où le pilote a commencé à remplir le paquet.

Syntaxe

EVT_ACX_STREAM_GET_CAPTURE_PACKET EvtAcxStreamGetCapturePacket;

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

Paramètres

Stream

Un objet ACXSTREAM représente un flux audio créé par un circuit. Le flux est composé d’une liste d’éléments créés en fonction des éléments du circuit parent. Pour plus d’informations, consultez ACX - Résumé des objets ACX.

LastCapturePacket

Valeur indiquant la position du dernier paquet capturé. Il s’agit d’un index basé sur 0 indiquant le nombre de paquets complets de données capturés.

QPCPacketStart

Valeur indiquant l’heure de début du dernier paquet capturé.

MoreData

Retourne TRUE s’il existe plus de données prêtes immédiatement. Le système d’exploitation peut éventuellement appeler immédiatement cette routine après avoir traité le paquet pour obtenir les informations suivantes sur les paquets. Si le pilote retourne FALSE, la capture fonctionne en temps réel.

Valeur de retour

Retourne STATUS_SUCCESS si l’appel a réussi. Sinon, elle retourne un code d’erreur approprié. Pour plus d’informations, consultez Using NTSTATUS Values.

Remarques

Avant de lire des données audio capturées à partir de la mémoire tampon audio, le système d’exploitation appelle cette routine pour obtenir des informations sur les données disponibles.

Le numéro de paquet identifie un paquet dans le flux. Cela est réinitialisé à zéro lorsque EVT_ACX_STREAM_RELEASEHARDWARE a été appelé pour le flux. Le nombre avance avec chaque mémoire tampon capturée. À partir du numéro de paquet, le système d’exploitation peut dériver l’emplacement du paquet dans la mémoire tampon audio et peut également dériver la position de flux du paquet par rapport au début du flux.

Le système d’exploitation peut appeler cette routine à tout moment. En opération normale, le système d’exploitation appelle cette routine après que le pilote appelle AcxRtStreamNotifyPacketComplete ou après qu’un appel précédent retourne true pour MoreData. Lorsque le système d’exploitation appelle cette routine, le pilote peut supposer que le système d’exploitation a terminé de lire tous les paquets précédents. Si le matériel a capturé suffisamment de données, le pilote peut immédiatement éclater le paquet complet suivant vers la mémoire tampon audio et appeler à nouveau AcxRtStreamNotifyPacketComplete. Dans le cas d’un dépassement de capacité de capture (lorsque le système d’exploitation ne lit pas assez rapidement les données), le pilote audio peut supprimer ou remplacer certaines données audio. Le pilote audio supprime ou remplace d’abord les données les plus anciennes. Le pilote audio peut continuer à avancer son compteur de paquets interne même si le système d’exploitation n’a peut-être pas lu les données.

Exemple

L’exemple d’utilisation est illustré ci-dessous.

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

Configuration requise pour ACX

version minimale d’ACX : 1.0

Pour plus d’informations sur les versions ACX, consultez vue d’ensemble de la version ACX.

Exigences

Exigence Valeur
d’en-tête acxstreams.h
IRQL PASSIVE_LEVEL

Voir aussi