다음을 통해 공유


EVT_ACX_STREAM_GET_CAPTURE_PACKET 콜백 함수(acxstreams.h)

EvtAcxStreamGetCapturePacket 은 드라이버가 패킷을 채우기 시작했을 때의 QPC 값을 포함하여 가장 최근에 완전히 채워진 패킷(0부터 시작)을 나타내도록 드라이버에 지시합니다.

구문

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 호출되면 0으로 다시 설정됩니다. 캡처된 각 버퍼로 숫자가 진행됩니다. 패킷 번호에서 OS는 오디오 버퍼 내에서 패킷 위치를 파생시킬 수 있으며 스트림 시작을 기준으로 패킷의 스트림 위치를 파생시킬 수도 있습니다.

OS는 언제든지 이 루틴을 호출할 수 있습니다. 정상 작업에서 OS는 드라이버가 AcxRtStreamNotifyPacketComplete 를 호출한 후 또는 이전 호출이 MoreData에 대해 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

추가 정보