EVT_ACX_STREAM_SET_RENDER_PACKET 콜백 함수(acxstreams.h)

EvtAcxStreamSetRenderPacket 이벤트는 클라이언트에서 방금 릴리스한 패킷을 드라이버에 알려줍니다.

결함이 없는 경우 이 패킷은 (CurrentRenderPacket + 1)이어야 합니다. 여기서 CurrentRenderPacket은 드라이버가 현재 스트리밍 중인 패킷입니다. 이 값과 일치하도록 CurrentRenderPacket을 변경하는 대신 패킷이 렌더링될 때 드라이버는 CurrentRenderPacket을 계속 늘려야 합니다. 속성에는 패킷 인덱스(0 기반)와 적절한 경우 현재 패킷에서 스트림 끝의 바이트 오프셋이 있는 EOS 플래그가 포함됩니다.

구문

EVT_ACX_STREAM_SET_RENDER_PACKET EvtAcxStreamSetRenderPacket;

NTSTATUS EvtAcxStreamSetRenderPacket(
  ACXSTREAM Stream,
  ULONG Packet,
  ULONG Flags,
  ULONG EosPacketLength
)
{...}

매개 변수

Stream

ACXSTREAM 개체는 회로에서 만든 오디오 스트림을 나타냅니다. 자세한 내용은 ACX - ACX 개체 요약을 참조하세요.

Packet

OS에서 WaveRT 버퍼에 쓴 패킷의 수입니다. 드라이버가 AcxRtStreamNotifyPacketComplete에 제공하는 값에 따라 패킷 번호는 값을 건너뛸 수 있습니다.

Flags

플래그는 0 또는 AcxStreamSetRenderPacketEndOfStream일 수 있으며, 이는 패킷이 스트림의 마지막 패킷임을 나타냅니다.

EosPacketLength

AcxStreamSetRenderPacketEndOfStream이 Flags에 지정된 경우 EOS 패킷의 길이입니다. 0은 유효한 값입니다. AcxStreamSetRenderPacketEndOfStream이 Flags에 지정되지 않은 경우 이 매개 변수는 무시해야 합니다. EosPacketLength는 바이트 단위로 측정됩니다.

반환 값

호출에 성공하면 를 반환합니다 STATUS_SUCCESS . 그렇지 않으면 적절한 오류 코드를 반환합니다. 자세한 내용은 NTSTATUS 값 사용을 참조하세요.

STATUS_DATA_LATE_ERROR – OS가 이미 전송되었거나 현재 전송 중인 패킷 번호를 전달하면 드라이버가 이 오류를 반환합니다. 이 경우 결함이 발생했습니다. 드라이버는 필요에 따라 패킷의 일부 데이터를 사용하거나 이전에 이 패킷 번호에 기록된 데이터를 계속 재생할 수 있습니다.

STATUS_DATA_OVERRUN – OS가 WaveRT 버퍼에 저장할 수 있는 것보다 높은 패킷 번호를 전달하는 경우 드라이버가 이 오류를 반환합니다. 이 경우 결함이 발생했습니다. 드라이버는 필요에 따라 패킷의 데이터를 무시할 수 있습니다.

STATUS_INVALID_DEVICE_STATE – OS가 이전에 AcxStreamSetRenderPacketEndOfStream 플래그를 설정한 후 이 루틴을 호출하면 드라이버가 이 오류를 반환합니다.

STATUS_INVALID_PARAMETER – 다른 오류 상태 대한 특정 사례 외에 다른 매개 변수가 유효하지 않은 것으로 확인되면 드라이버가 이 오류를 반환합니다. 여기에는 위에서 구체적으로 정의되지 않은 플래그 값이 포함됩니다.

설명

OS가 이 루틴을 호출한 후 드라이버는 필요에 따라 제공된 정보를 사용하여 하드웨어 전송을 최적화할 수 있습니다. 예를 들어 드라이버가 DMA 전송을 최적화하거나 OS가 이 루틴을 다시 호출하여 다른 패킷을 드라이버에 알리지 않는 경우 지정된 패킷의 끝에서 전송을 중지하도록 프로그램 하드웨어를 최적화할 수 있습니다. 이렇게 하면 순환 버퍼를 반복하는 대신 가청 간격을 도입하는 등 언더플로의 가청 효과를 완화할 수 있습니다. 그러나 드라이버는 여전히 내부 패킷 카운터를 늘리고 알림 이벤트를 명목상 실시간 속도로 신호해야 합니다.

하드웨어 기능에 따라 AcxStreamSetRenderPacketEndOfStream 플래그가 지정된 경우 하드웨어가 EOS 위치 이상으로 데이터를 전송하는 경우 드라이버가 EOS 패킷 뒤에 있는 WaveRT 버퍼의 일부를 무음으로 채울 수 있습니다.

클라이언트는 버퍼를 미리 롤링하여 시작합니다. 클라이언트가 ReleaseBuffer를 호출하면 활성 ACXSTREAM에서 EvtAcxStreamSetRenderPacket을 호출하는 ACX 계층을 호출하는 AudioKSE의 호출로 변환됩니다. 속성에는 패킷 인덱스(0 기반)와 적절한 경우 현재 패킷에서 스트림 끝의 바이트 오프셋이 있는 EOS 플래그가 포함됩니다.   

예제

예제 사용법은 다음과 같습니다.

    //
    // Init RT streaming callbacks.
    //
    ACX_RT_STREAM_CALLBACKS rtCallbacks;
    ACX_RT_STREAM_CALLBACKS_INIT(&rtCallbacks);

    rtCallbacks.EvtAcxStreamSetRenderPacket = EvtStreamSetRenderPacket;

    status = AcxStreamInitAssignAcxRtStreamCallbacks(StreamInit, &rtCallbacks);
#pragma code_seg("PAGE")
NTSTATUS
EvtStreamSetRenderPacket(
    _In_ ACXSTREAM Stream,
    _In_ ULONG     Packet,
    _In_ ULONG     Flags,
    _In_ ULONG     EosPacketLength
    )
{
    PSTREAM_CONTEXT ctx;
    NTSTATUS        status = STATUS_SUCCESS;

    PAGED_CODE();

    ctx = GetStreamContext(Stream);

    currentPacket = (ULONG)InterlockedCompareExchange((LONG*)&ctx->m_CurrentPacket, -1, -1);

    if (Packet <= currentPacket)
    {
        status = STATUS_DATA_LATE_ERROR;
    }
    else if (Packet > currentPacket + 1)
    {
        status = STATUS_DATA_OVERRUN;
    }

    return status;
}

ACX 요구 사항

최소 ACX 버전: 1.0

ACX 버전에 대한 자세한 내용은 ACX 버전 개요를 참조하세요.

요구 사항

요구 사항
헤더 acxstreams.h
IRQL PASSIVE_LEVEL

추가 정보