EVT_ACX_CIRCUIT_CREATE_STREAM função de retorno de chamada (acxcircuit.h)
O driver define o retorno de chamada EVT_ACX_CIRCUIT_CREATE_STREAM para criar instâncias de fluxo de circuito.
Sintaxe
EVT_ACX_CIRCUIT_CREATE_STREAM EvtAcxCircuitCreateStream;
NTSTATUS EvtAcxCircuitCreateStream(
WDFDEVICE Device,
ACXCIRCUIT Circuit,
ACXPIN Pin,
PACXSTREAM_INIT StreamInit,
ACXDATAFORMAT StreamFormat,
const GUID *SignalProcessingMode,
ACXOBJECTBAG VarArguments
)
{...}
Parâmetros
Device
Um objeto WDFDEVICE (descrito em WDF – Resumo de Objetos de Estrutura) associado ao ACXCIRCUIT especificado.
Circuit
O objeto ACXCIRCUIT associado à nova instância de fluxo. Para obter mais informações sobre objetos ACX, consulte Resumo de objetos ACX.
Pin
O objeto ACXPIN ACX associado à nova instância de fluxo.
StreamInit
O ACXSTREAM_INIT objeto ACX. Essa é uma estrutura opaca, que é usada para definir a inicialização do fluxo.
StreamFormat
Um objeto ACXDATAFORMAT ACX que define o formato de dados de fluxo.
SignalProcessingMode
Um GUID que identifica o modo de processamento de sinal de áudio do novo circuito de fluxo. Para obter mais informações sobre modos de áudio, consulte Modos de processamento de sinal de áudio.
VarArguments
Um objeto ACXOBJECTBAG opcional que contém argumentos adicionais a serem usados para inicializar o fluxo.
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
A primeira etapa na Criação de Stream é criar a instância ACXSTREAM para cada ACXCIRCUIT no Caminho de Áudio do Ponto de Extremidade. O ACX chamará evtAcxCircuitCreateStream de cada circuito. O ACX começará com o circuito principal e chamará CreateStream de cada circuito em ordem, terminando com o circuito final.
Os drivers têm a oportunidade de fazer qualquer inicialização antes ou depois que o próximo circuito na cadeia é invocado, consulte o objeto ACXSTREAMBRIDGE para obter mais informações.
A solicitação de criação de Stream é enviada para o ACXPIN apropriado exposto como parte da geração de topologia do circuito principal chamando o EvtAcxCircuitCreateStream especificado durante a criação do circuito principal.
O driver que recebe o retorno de chamada de criação de fluxo executa as seguintes operações:
- Ele inicializa a estrutura opaca ACXSTREAM_INIT usando DDIs definidos pelo ACX (AcxStreamInit*)
- Ele cria o objeto ACXSTREAM usando o AcxStreamCreate ou AcxRtStreamCreate ACX DDI. O AcxRtStreamCreate é usado apenas para streaming ACXPIN conectado ao pipeline de áudio do modo de usuário superior, todos os outros circuitos do caminho do ponto de extremidade devem usar o AcxStreamCreate DDI.
- Ele cria elementos específicos do fluxo, por exemplo, ACXAUDIOENGINE.
- Ele adiciona os elementos ao objeto ACXSTREAM.
- Ele retorna STATUS_SUCCESS para indicar que o retorno de chamada de criação de fluxo foi concluído com êxito.
O canal de comunicação de fluxo entre circuitos em um caminho de áudio usa objetos ACXTARGETSTREAM.
Depois que o circuito de destino padrão criar o objeto ACXSTREAM, cada circuito terá a oportunidade de executar a manipulação específica do circuito para o fluxo. Cada circuito, por sua vez, executa uma ou mais das seguintes ações:
- Crie e adicione um objeto Context ao ACXSTREAM com dados ou configuração específicas do driver de fluxo.
- Retorne o controle para a estrutura ACX, que executará a mesma ação com o próximo circuito no Caminho de Áudio do Ponto de Extremidade.
Exemplo
O uso de exemplo é mostrado abaixo.
status = AcxCircuitInitAssignAcxCreateStreamCallback(
circuitInit,
CodecC_EvtCircuitCreateStream);
NTSTATUS
CodecC_EvtCircuitCreateStream(
_In_ WDFDEVICE Device,
_In_ ACXCIRCUIT Circuit,
_In_ ACXPIN Pin,
_In_ PACXSTREAM_INIT StreamInit,
_In_ ACXDATAFORMAT StreamFormat,
_In_ const GUID * SignalProcessingMode,
_In_ ACXOBJECTBAG VarArguments
)
/*++
Routine Description:
This routine creates a stream for the specified circuit.
Return Value:
NT status value
--*/
{
NTSTATUS status;
PCODEC_CAPTURE_DEVICE_CONTEXT devCtx;
WDF_OBJECT_ATTRIBUTES attributes;
ACXSTREAM stream;
CODEC_STREAM_CONTEXT * streamCtx;
ACXELEMENT elements[2] = {0};
ACX_ELEMENT_CONFIG elementCfg;
CODEC_ELEMENT_CONTEXT * elementCtx;
ACX_STREAM_CALLBACKS streamCallbacks;
ACX_RT_STREAM_CALLBACKS rtCallbacks;
CCaptureStreamEngine * streamEngine = NULL;
CODEC_CAPTURE_CIRCUIT_CONTEXT * circuitCtx;
CODEC_PIN_CONTEXT * pinCtx;
PAGED_CODE();
UNREFERENCED_PARAMETER(SignalProcessingMode);
UNREFERENCED_PARAMETER(VarArguments);
ASSERT(IsEqualGUID(*SignalProcessingMode, AUDIO_SIGNALPROCESSINGMODE_RAW));
devCtx = GetCaptureDeviceContext(Device);
ASSERT(devCtx != NULL);
circuitCtx = GetCaptureCircuitContext(Circuit);
ASSERT(circuitCtx != NULL);
pinCtx = GetCodecPinContext(Pin);
ASSERT(pinCtx != NULL);
//
// Set circuit-callbacks.
//
status = AcxStreamInitAssignAcxRequestPreprocessCallback(
StreamInit,
CodecC_EvtStreamRequestPreprocess,
(ACXCONTEXT)AcxRequestTypeAny, // dbg only
AcxRequestTypeAny,
NULL,
AcxItemIdNone);
if (!NT_SUCCESS(status))
{
ASSERT(FALSE);
goto exit;
}
/*
//
// Add properties, events and methods.
//
status = AcxStreamInitAssignProperties(StreamInit,
StreamProperties,
StreamPropertiesCount);
*/
//
// Init streaming callbacks.
//
ACX_STREAM_CALLBACKS_INIT(&streamCallbacks);
streamCallbacks.EvtAcxStreamPrepareHardware = Codec_EvtStreamPrepareHardware;
streamCallbacks.EvtAcxStreamReleaseHardware = Codec_EvtStreamReleaseHardware;
streamCallbacks.EvtAcxStreamRun = Codec_EvtStreamRun;
streamCallbacks.EvtAcxStreamPause = Codec_EvtStreamPause;
status = AcxStreamInitAssignAcxStreamCallbacks(StreamInit, &streamCallbacks);
if (!NT_SUCCESS(status))
{
ASSERT(FALSE);
goto exit;
}
//
// Init RT streaming callbacks.
//
ACX_RT_STREAM_CALLBACKS_INIT(&rtCallbacks);
rtCallbacks.EvtAcxStreamGetHwLatency = Codec_EvtStreamGetHwLatency;
rtCallbacks.EvtAcxStreamAllocateRtPackets = Codec_EvtStreamAllocateRtPackets;
rtCallbacks.EvtAcxStreamFreeRtPackets = Codec_EvtStreamFreeRtPackets;
rtCallbacks.EvtAcxStreamGetCapturePacket = CodecC_EvtStreamGetCapturePacket;
rtCallbacks.EvtAcxStreamGetCurrentPacket = Codec_EvtStreamGetCurrentPacket;
rtCallbacks.EvtAcxStreamGetPresentationPosition = Codec_EvtStreamGetPresentationPosition;
status = AcxStreamInitAssignAcxRtStreamCallbacks(StreamInit, &rtCallbacks);
if (!NT_SUCCESS(status))
{
ASSERT(FALSE);
goto exit;
}
//
// Buffer notifications are supported.
//
AcxStreamInitSetAcxRtStreamSupportsNotifications(StreamInit);
//
// Create the stream.
//
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, CODEC_STREAM_CONTEXT);
attributes.EvtDestroyCallback = Codec_EvtStreamDestroy;
status = AcxRtStreamCreate(Device, Circuit, &attributes, &StreamInit, &stream);
if (!NT_SUCCESS(status))
{
ASSERT(FALSE);
goto exit;
}
streamCtx = GetCodecStreamContext(stream);
ASSERT(streamCtx);
if (pinCtx->CodecPinType == CodecPinTypeKeyword)
{
PCODEC_KEYWORDSPOTTER_CONTEXT keywordSpotterCtx;
keywordSpotterCtx = GetCodecKeywordSpotterContext(circuitCtx->KeywordSpotter);
streamEngine = new(NonPagedPoolNx, DRIVER_TAG) CBufferedCaptureStreamEngine(stream, StreamFormat, (CKeywordDetector *) keywordSpotterCtx->KeywordDetector);
if (streamEngine == NULL)
{
status = STATUS_INSUFFICIENT_RESOURCES;
ASSERT(FALSE);
goto exit;
}
}
else
{
streamEngine = new(NonPagedPoolNx, DRIVER_TAG) CCaptureStreamEngine(stream, StreamFormat);
if (streamEngine == NULL)
{
status = STATUS_INSUFFICIENT_RESOURCES;
ASSERT(FALSE);
goto exit;
}
}
streamCtx->StreamEngine = (PVOID)streamEngine;
streamEngine = NULL;
//
// Post stream creation initialization.
// Create any custom stream-elements.
// Add stream elements
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 | acxcircuit.h |
IRQL | PASSIVE_LEVEL |