共用方式為


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呼叫此例程時,驅動程式可能會假設作系統已完成讀取所有先前的封包。 如果硬體已擷取足夠的數據,驅動程式可能會立即將下一個完整封包高載至音訊緩衝區,並再次呼叫 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

另請參閱