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 |