次の方法で共有


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

こちらもご覧ください