функция обратного вызова 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 |