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。 操作系统可以选择在处理数据包后立即再次调用此例程,以获取下一个数据包信息。 如果驱动程序返回 FALSE,则捕获将实时运行。

返回值

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

注解

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

数据包编号标识流中的数据包。 当为流调用 EVT_ACX_STREAM_RELEASEHARDWARE 时,这会重置为零。 该数字随着每个捕获的缓冲区而增加。 OS 可以从数据包号派生音频缓冲区中的数据包位置,也可以派生数据包相对于流开始的流位置。

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

要求

要求
Header acxstreams.h
IRQL PASSIVE_LEVEL

另请参阅