EVT_ACX_STREAM_FREE_RTPACKETS fonction de rappel (acxstreams.h)

L’événement EvtAcxStreamFreeRtPackets indique au pilote de libérer les RtPackets qui ont été alloués lors d’un appel précédent à EvtAcxStreamAllocateRtPackets. Les mêmes paquets de cet appel sont inclus.

Syntaxe

EVT_ACX_STREAM_FREE_RTPACKETS EvtAcxStreamFreeRtpackets;

void EvtAcxStreamFreeRtpackets(
  ACXSTREAM Stream,
  PACX_RTPACKET Packets,
  ULONG PacketCount
)
{...}

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.

Packets

Pointeur vers un tableau de structures ACX_RTPACKET qui décrit l’emplacement et la taille des paquets à libérer.

PacketCount

Spécifie le nombre de paquets à libérer. Les valeurs valides sont 1 ou 2.

Valeur de retour

None

Remarques

Lorsque l’utilisation du flux est terminée, EvtAcxStreamFreeRtPackets est appelé après EvtAcxStreamReleaseHardware. Cela permet à la phase matérielle de mise en production de terminer l’allocation de bande passante, libérant les ressources DMA et tout autre nettoyage associé, de se produire avant que les mémoires tampons RT allouées ne soient ensuite libérées.

Exemple

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

    // Init RT streaming callbacks.
    //
    ACX_RT_STREAM_CALLBACKS rtCallbacks;
    ACX_RT_STREAM_CALLBACKS_INIT(&rtCallbacks);
    rtCallbacks.EvtAcxStreamFreeRtPackets               = Dsp_EvtStreamFreeRtPackets;

    RETURN_NTSTATUS_IF_FAILED(AcxStreamInitAssignAcxRtStreamCallbacks(StreamInit, &rtCallbacks));

// Later in the code need to free the packets...
#pragma code_seg("PAGE")
VOID
Codec_EvtStreamFreeRtPackets(
    _In_ ACXSTREAM Stream,
    _In_ PACX_RTPACKET Packets,
    _In_ ULONG PacketCount
    )
{
    PCODEC_STREAM_CONTEXT ctx;
    ULONG i;
    PVOID buffer;

    PAGED_CODE();

    ctx = GetCodecStreamContext(Stream);

    for (i = 0; i < PacketCount; ++i)
    {
        if (Packets[i].RtPacketBuffer.u.MdlType.Mdl)
        {
            buffer = MmGetMdlVirtualAddress(Packets[i].RtPacketBuffer.u.MdlType.Mdl);
            IoFreeMdl(Packets[i].RtPacketBuffer.u.MdlType.Mdl);
            ExFreePool(buffer);
        }
    }

    ExFreePool(Packets);

    ctx->PacketsCount = 0;
    ctx->PacketSize = 0;
    ctx->FirstPacketOffset = 0;
}

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