EVT_ACX_STREAM_FREE_RTPACKETS回调函数 (acxstreams.h)
EvtAcxStreamFreeRtPackets 事件告知驱动程序释放在之前调用 EvtAcxStreamAllocateRtPackets 时分配的 RtPackets。 包含来自该调用的相同数据包。
语法
EVT_ACX_STREAM_FREE_RTPACKETS EvtAcxStreamFreeRtpackets;
void EvtAcxStreamFreeRtpackets(
ACXSTREAM Stream,
PACX_RTPACKET Packets,
ULONG PacketCount
)
{...}
参数
Stream
ACXSTREAM 对象表示线路创建的音频流。 该流由基于父线路的元素创建的元素列表组成。 有关详细信息,请参阅 ACX - ACX 对象的摘要。
Packets
指向 ACX_RTPACKET结构的 数组的指针,该结构描述要释放的数据包的位置和大小。
PacketCount
指定要释放的数据包数。 有效值为 1 或 2。
返回值
无
备注
处理流完成后,EvtAcxStreamFreeRtPackets 在 EvtAcxStreamReleaseHardware 之后调用。 这样,在释放分配的 RT 缓冲区之前,发布硬件阶段就可以完成解除分配带宽、释放 DMA 资源和任何其他相关的清理。
示例
示例用法如下所示。
// 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;
}
ACX 要求
最低 ACX 版本: 1.0
有关 ACX 版本的详细信息,请参阅 ACX 版本概述。
要求
要求 | 值 |
---|---|
Header | acxstreams.h |
IRQL | PASSIVE_LEVEL |