EVT_ACX_STREAM_GET_CAPTURE_PACKET回调函数 (acxstreams.h)

EvtAcxStreamGetCapturePacket 告知驱动程序指示最近完全填充了哪个数据包(基于 0),包括在驱动程序开始填充数据包时 QPC 值。

语法

EVT_ACX_STREAM_GET_CAPTURE_PACKET EvtAcxStreamGetCapturePacket;

NTSTATUS EvtAcxStreamGetCapturePacket(
  ACXSTREAM Stream,
  PULONG LastCapturePacket,
  PULONGLONG QPCPacketStart,
  PBOOLEAN MoreData
)
{...}

参数

Stream

ACXSTREAM 对象表示线路创建的音频流。 该流由基于父线路的元素创建的元素列表组成。 有关详细信息,请参阅 ACX - ACX 对象的摘要

LastCapturePacket

一个值,该值指示上次捕获的数据包的位置。 这是一个基于 0 的索引,指示捕获了多少个完整的数据包。

QPCPacketStart

一个值,指示上次捕获数据包的开始时间。

MoreData

如果立即准备好更多数据,则返回 TRUE。 OS 可以选择在处理数据包以获取下一个数据包信息后立即再次调用此例程。 如果驱动程序返回 FALSE,则捕获将实时运行。

返回值

如果调用成功,则返回 STATUS_SUCCESS。 否则,它将返回适当的错误代码。 有关详细信息,请参阅 使用 NTSTATUS 值

言论

在从音频缓冲区读取捕获的音频数据之前,OS 会调用此例程以获取有关可用数据的信息。

数据包编号标识流中的数据包。 当为流调用 EVT_ACX_STREAM_RELEASEHARDWARE 时,这会重置为零。 该数字随每个捕获的缓冲区向前推进。 从数据包号中,OS 可以在音频缓冲区中派生数据包位置,还可以派生数据包相对于流启动的流位置。

OS 可以随时调用此例程。 在正常作中,OS 在驱动程序调用 AcxRtStreamNotifyPacketComplete 或之前调用返回 true for MoreData 后调用此例程。 当 OS 调用此例程时,驱动程序可能假定 OS 已完成读取所有以前的数据包。 如果硬件捕获了足够的数据,驱动程序可能会立即将下一个完整的数据包突发到音频缓冲区,并再次调用 AcxRtStreamNotifyPacketComplete。 如果捕获溢出(OS 不够快地读取数据),音频驱动程序可能会删除或覆盖某些音频数据。 音频驱动程序首先删除或覆盖最早的数据。 即使 OS 可能没有读取数据,音频驱动程序仍可能继续推进其内部数据包计数器。

示例用法如下所示。

#pragma code_seg("PAGE")
NTSTATUS
CodecC_EvtStreamGetCapturePacket(
    _In_ ACXSTREAM          Stream,
    _Out_ ULONG           * LastCapturePacket,
    _Out_ ULONGLONG       * QPCPacketStart,
    _Out_ BOOLEAN         * MoreData
)
{
    PCODEC_STREAM_CONTEXT ctx;
    CCaptureStreamEngine* streamEngine = nullptr;
    ULONG currentPacket;
    LONGLONG qpcPacketStart;

    PAGED_CODE();

    ctx = GetCodecStreamContext(Stream);
    // Retrieve the current packet that is being written to by the audio hardware
    currentPacket = (ULONG)InterlockedCompareExchange((LONG*)&ctx->CurrentPacket, -1, -1);
    qpcPacketStart = InterlockedCompareExchange64(&ctx->LastPacketStart.QuadPart, -1, -1);

    // The Last capture packet is the packet before the current packet.
    *LastCapturePacket = currentPacket - 1;
    *QPCPacketStart = (ULONGLONG)qpcPacketStart;
    *MoreData = FALSE;

    return STATUS_SUCCESS;
}

ACX 要求

最低 ACX 版本: 1.0

有关 ACX 版本的详细信息,请参阅 ACX 版本概述

要求

要求 价值
标头 acxstreams.h
IRQL PASSIVE_LEVEL

另请参阅