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 헤더