EVT_ACX_STREAM_FREE_RTPACKETS fungsi panggilan balik (acxstreams.h)

Peristiwa EvtAcxStreamFreeRtPackets memberi tahu driver untuk membebaskan RtPackets yang dialokasikan dalam panggilan sebelumnya ke EvtAcxStreamAllocateRtPackets. Paket yang sama dari panggilan tersebut disertakan.

Sintaks

EVT_ACX_STREAM_FREE_RTPACKETS EvtAcxStreamFreeRtpackets;

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

Parameter

Stream

Objek ACXSTREAM mewakili aliran audio yang dibuat oleh sirkuit. Aliran terdiri dari daftar elemen yang dibuat berdasarkan elemen sirkuit induk. Untuk informasi selengkapnya, lihat ACX - Ringkasan Objek ACX.

Packets

Penunjuk ke array struktur ACX_RTPACKET yang menjelaskan lokasi dan ukuran paket yang akan dibebaskan.

PacketCount

Menentukan jumlah paket yang akan dibebaskan. Nilai yang valid adalah 1 atau 2.

Nilai kembali

Tidak ada

Keterangan

Ketika pekerjaan dengan aliran selesai, EvtAcxStreamFreeRtPackets dipanggil setelah EvtAcxStreamReleaseHardware. Ini memungkinkan fase perangkat keras rilis untuk menyelesaikan pembatalan alokasi bandwidth, membebaskan sumber daya DMA dan pembersihan terkait lainnya, terjadi sebelum buffer RT yang dialokasikan kemudian dibebaskan.

Contoh

Contoh penggunaan ditunjukkan di bawah ini.

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

Persyaratan ACX

Versi ACX minimum: 1.0

Untuk informasi selengkapnya tentang versi ACX, lihat Gambaran umum versi ACX.

Persyaratan

Persyaratan Nilai
Header acxstreams.h
IRQL PASSIVE_LEVEL

Lihat juga