функция обратного вызова EVT_ACX_STREAM_GET_CAPTURE_PACKET (acxstreams.h)
EvtAcxStreamGetCapturePacket указывает драйверу, какой пакет (на основе 0) был полностью заполнен в последнее время, включая значение QPC на момент, когда драйвер начал заполнять пакет.
Синтаксис
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, если есть дополнительные данные, готовые немедленно. Ос может при необходимости сразу же вызвать эту подпрограмму после обработки пакета, чтобы получить сведения о следующем пакете. Если драйвер возвращает значение FALSE, запись выполняется в режиме реального времени.
Возвращаемое значение
Возвращает значение STATUS_SUCCESS
, если вызов был выполнен успешно. В противном случае возвращается соответствующий код ошибки. Дополнительные сведения см. в разделе Использование значений NTSTATUS.
Комментарии
Перед считывание звуковых данных из звукового буфера ОС вызывает эту подпрограмму для получения сведений о доступных данных.
Номер пакета идентифицирует пакет в потоке. Это сбрасывается до нуля при вызове EVT_ACX_STREAM_RELEASEHARDWARE для потока. Число увеличивается с каждым захваченным буфером. Из номера пакета ОС может получить расположение пакета в звуковом буфере, а также наследовать позицию потока пакета относительно начала потока.
Операционная система может вызвать эту подпрограмму в любое время. В обычной работе ОС вызывает эту подпрограмму после вызова драйвером AcxRtStreamNotifyPacketComplete или после того, как предыдущий вызов возвращает true для MoreData. Когда ОС вызывает эту подпрограмму, драйвер может предположить, что ОС закончила чтение всех предыдущих пакетов. Если оборудование захватило достаточно данных, драйвер может немедленно отправить следующий полный пакет в звуковой буфер и снова вызвать AcxRtStreamNotifyPacketComplete. В случае переполнения записи (когда ОС недостаточно быстро считывает данные) звуковой драйвер может удалить или перезаписать некоторые звуковые данные. Аудиодрайвер сначала удаляет или перезаписывает старые данные. Звуковой драйвер может продолжать продвигать свой внутренний счетчик пакетов, даже если ОПЕРАЦИОННая система может не прочитать данные.
Пример
Ниже приведен пример использования.
#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 |