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 時呼叫此例程。 當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

另請參閱