다음을 통해 공유


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 또는 KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM = 0x200수 있습니다. 패킷이 스트림의 마지막 패킷이고 EosPacketLength가 패킷에 유효한 길이(바이트)임을 나타냅니다. 자세한 내용은 KSSTREAM_HEADER 구조체(ks.h)OptionsFlags 참조하세요.

EosPacketLength

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

반환 값

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

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

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

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

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

발언

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

하드웨어 기능에 따라 KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM 플래그가 지정된 경우 하드웨어가 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

참고 항목

  • acxstreams.h 헤더