Partager via


EVT_ACX_STREAM_GET_CAPTURE_PACKET fonction de rappel (acxstreams.h)

EvtAcxStreamGetCapturePacket indique au pilote quel paquet (basé sur 0) a été complètement 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 de base 0 qui indique le nombre de paquets de données complets qui ont été capturés.

QPCPacketStart

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

MoreData

Retourne TRUE s’il y a 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 sur le paquet suivant. Si le pilote retourne FALSE, la capture fonctionne en temps réel.

Valeur retournée

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

Remarques

Avant de lire les 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. Cette opération est réinitialisée à zéro lorsque EVT_ACX_STREAM_RELEASEHARDWARE a été appelée 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 du flux du paquet par rapport au début du flux.

Le système d’exploitation peut appeler cette routine à tout moment. En fonctionnement normal, le système d’exploitation appelle cette routine après que le pilote a appelé AcxRtStreamNotifyPacketComplete ou 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 faire exploser le paquet complet suivant dans la mémoire tampon audio et appeler à nouveau AcxRtStreamNotifyPacketComplete. En cas de dépassement de capacité de capture (lorsque le système d’exploitation ne lit pas les données assez rapidement), 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 ACX minimale : 1.0

Pour plus d’informations sur les versions d’ACX, consultez Vue d’ensemble des versions d’ACX.

Configuration requise

Condition requise Valeur
En-tête acxstreams.h
IRQL PASSIVE_LEVEL

Voir aussi