функция обратного вызова EVT_ACX_STREAM_GET_PRESENTATION_POSITION (acxstreams.h)
EvtAcxStreamGetPresentationPosition указывает драйверу, что необходимо указать текущую позицию вместе со значением QPC на момент вычисления текущей позиции.
Синтаксис
EVT_ACX_STREAM_GET_PRESENTATION_POSITION EvtAcxStreamGetPresentationPosition;
NTSTATUS EvtAcxStreamGetPresentationPosition(
ACXSTREAM Stream,
PULONGLONG PositionInBlocks,
PULONGLONG QPCPosition
)
{...}
Параметры
Stream
Объект ACXSTREAM представляет звуковой поток, созданный каналом. Поток состоит из списка элементов, созданных на основе элементов родительского канала. Дополнительные сведения см. в разделе ACX — сводка по объектам ACX.
PositionInBlocks
Задает смещение блока от начала потока до текущей позиции после декодированного без сжатия в потоке. "Блок" относится к группе каналов в том же образце. Например, в потоке PCM блок совпадает с кадром. Однако для сжатых форматов блок — это одна выборка в кадре. Это означает, что для типичного потока MP3, который содержит 1152 выборки в кадре, есть 1152 блока.
QPCPosition
Указывает значение счетчика производительности в момент, когда звуковой драйвер читает позицию презентации в ответ на вызов KSAUDIO_PRESENTATION_POSITION. Драйвер записывает в это поле значение, считанное из вызова KeQueryPerformanceCounter, когда snapshot принимается из позиции презентации.
Возвращаемое значение
Возвращает значение STATUS_SUCCESS
, если вызов был успешным. В противном случае возвращается соответствующий код ошибки. Дополнительные сведения см. в разделе Использование значений NTSTATUS.
Remarks
Пример
Ниже приведен пример использования.
//
// Init streaming callbacks.
//
ACX_RT_STREAM_CALLBACKS rtCallbacks;
ACX_RT_STREAM_CALLBACKS_INIT(&rtCallbacks);
rtCallbacks.EvtAcxStreamGetPresentationPosition = EvtStreamGetPresentationPosition;
status = AcxStreamInitAssignAcxRtStreamCallbacks(StreamInit, &rtCallbacks);
PAGED_CODE_SEG
NTSTATUS
EvtStreamGetPresentationPosition(
_In_ ACXSTREAM Stream,
_Out_ PULONGLONG PositionInBlocks,
_Out_ PULONGLONG QPCPosition
)
{
PSTREAM_CONTEXT ctx;
ULONG blockAlign;
LARGE_INTEGER qpc;
PAGED_CODE();
ctx = GetStreamContext(Stream);
blockAlign = AcxDataFormatGetBlockAlign(ctx->StreamFormat);
// Recalculate the stream position that is stored in ctx->StreamPosition
UpdateStreamPosition(Stream);
qpc = KeQueryPerformanceCounter(NULL);
*PositionInBlocks = ctx->StreamPosition / blockAlign;
*QPCPosition = qpc;
return STATUS_SUCCESS;
}
Требования ACX
Минимальная версия ACX: 1.0
Дополнительные сведения о версиях ACX см. в статье Обзор версий ACX.
Требования
Требование | Значение |
---|---|
Заголовок | acxstreams.h |
IRQL | PASSIVE_LEVEL |