EVT_ACX_STREAM_GET_CAPTURE_PACKET função de retorno de chamada (acxstreams.h)
EvtAcxStreamGetCapturePacket informa ao driver para indicar qual pacote (baseado em 0) foi completamente preenchido mais recentemente, incluindo o valor de QPC no momento em que o driver começou a preencher o pacote.
Sintaxe
EVT_ACX_STREAM_GET_CAPTURE_PACKET EvtAcxStreamGetCapturePacket;
NTSTATUS EvtAcxStreamGetCapturePacket(
ACXSTREAM Stream,
PULONG LastCapturePacket,
PULONGLONG QPCPacketStart,
PBOOLEAN MoreData
)
{...}
Parâmetros
Stream
Um objeto ACXSTREAM representa um fluxo de áudio criado por um circuito. O fluxo é composto por uma lista de elementos criados com base nos elementos do circuito pai. Para obter mais informações, consulte ACX – Resumo de objetos ACX.
LastCapturePacket
Um valor que indica a posição do último pacote capturado. Este é um índice baseado em 0 que indica quantos pacotes completos de dados foram capturados.
QPCPacketStart
Um valor que indica a hora de início do último pacote capturado.
MoreData
Retornará TRUE se houver mais dados prontos imediatamente. Opcionalmente, o sistema operacional pode chamar essa rotina imediatamente novamente depois de processar o pacote para obter as próximas informações do pacote. Se o driver retornar FALSE, a captura estará operando em tempo real.
Retornar valor
Retorna STATUS_SUCCESS
se a chamada foi bem-sucedida. Caso contrário, ele retornará um código de erro apropriado. Para obter mais informações, consulte Usando valores NTSTATUS.
Comentários
Antes de ler dados de áudio capturados do buffer de áudio, o sistema operacional chama essa rotina para obter informações sobre os dados disponíveis.
O número do pacote identifica um pacote dentro do fluxo. Isso é redefinido para zero quando EVT_ACX_STREAM_RELEASEHARDWARE foi chamado para o fluxo. O número avança com cada buffer capturado. No número do pacote, o sistema operacional pode derivar o local do pacote dentro do buffer de áudio e também pode derivar a posição do fluxo do pacote em relação ao início do fluxo.
O sistema operacional pode chamar essa rotina a qualquer momento. Na operação normal, o sistema operacional chama essa rotina depois que o driver chama AcxRtStreamNotifyPacketComplete ou depois que uma chamada anterior retorna true para MoreData. Quando o sistema operacional chama essa rotina, o driver pode assumir que o sistema operacional terminou de ler todos os pacotes anteriores. Se o hardware tiver capturado dados suficientes, o driver poderá imediatamente estourar o próximo pacote completo para o buffer de áudio e chamar AcxRtStreamNotifyPacketComplete novamente. No caso de estouro de captura (quando o sistema operacional não lê dados rapidamente o suficiente), o driver de áudio pode remover ou substituir alguns dados de áudio. O driver de áudio descarta ou substitui os dados mais antigos primeiro. O driver de áudio pode continuar avançando seu contador de pacotes interno, embora o sistema operacional possa não ter lido os dados.
Exemplo
O uso de exemplo é mostrado abaixo.
#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;
}
Requisitos do ACX
Versão mínima do ACX: 1.0
Para obter mais informações sobre versões do ACX, consulte Visão geral da versão do ACX.
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | acxstreams.h |
IRQL | PASSIVE_LEVEL |