Condividi tramite


EVT_ACX_STREAM_FREE_RTPACKETS funzione di callback (acxstreams.h)

L'evento EvtAcxStreamFreeRtPackets indica al driver di liberare i RtPackets allocati in una chiamata precedente a EvtAcxStreamAllocateRtPackets. Vengono inclusi gli stessi pacchetti di tale chiamata.

Sintassi

EVT_ACX_STREAM_FREE_RTPACKETS EvtAcxStreamFreeRtpackets;

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

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.

Packets

Puntatore a una matrice di strutture ACX_RTPACKET che descrive la posizione e le dimensioni dei pacchetti da liberare.

PacketCount

Specifica il numero di pacchetti da liberare. I valori validi sono 1 o 2.

Valore restituito

Nessuno

Osservazioni

Al termine dell'uso del flusso, viene chiamato EvtAcxStreamFreeRtPackets dopo EvtAcxStreamReleaseHardware. Ciò consente alla fase hardware di rilascio di completare la deallocazione della larghezza di banda, liberando le risorse DMA e qualsiasi altra pulizia associata, prima che i buffer RT allocati vengano liberati.

Esempio

Di seguito è riportato un esempio di utilizzo.

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

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