Composição de vários circuitos ACX
Este tópico discute a composição de vários circuitos ACX. Para obter uma visão geral do ACX e uma lista de termos do ACX, consulte Visão geral das extensões de classe de áudio ACX.
Conforme descrito em Resumo de objetos ACX, um AcxCircuit representa um caminho de áudio parcial ou total para um dispositivo de áudio percebido pelo usuário (alto-falantes, microfone etc.). Um AcxCircuit tem pelo menos um pino de entrada e um de saída (ACXPIN) e pode agregar um ou mais objetos do tipo AcxElements. Para obter informações gerais, consulte Circuitos ACX.
Composição de circuitos ACX
O ACX associa os circuitos até que eles formem um caminho de áudio completo. O ACX usa associações de áudio para conectar circuitos de áudio juntos. Ao mesmo tempo, cada circuito do ACX é convertido em um filtro KS, esses filtros KS são então detectados pelo construtor de ponto de extremidade de áudio (AEB) que é executado como serviço de modo de usuário. O AEB verifica o gráfico do filtro KS detectado e cria o ponto de extremidade de áudio do software que representa a infraestrutura de áudio sublinhada quando detecta um caminho de áudio completo.
O diagrama a seguir mostra os objetos ACX usados pelo ACX para detectar, construir e monitorar os circuitos que compõem o ponto de extremidade de áudio composto.
Importante
Observe que apenas os tipos mostrados em azul são públicos: ACXCIRCUITTEMPLATE, ACXCOMPOSITETEMPLATE (não mostrado), ACXMANAGER, ACXCIRCUITFACTORY e ACXCIRCUIT. Todos os tipos mostrados em violeta são internos, e eles são listados aqui apenas para fins de ilustração. Não é garantido que os tipos internos permaneçam os mesmos ou estejam disponíveis em diferentes versões do ACX, eles não devem ser chamados nem usados diretamente.
O gerenciador do ACX analisa os modelos de circuito no momento da inicialização do driver, quando os drivers do ACX os registram no gerenciador do ACX. Os drivers do ACX registram modelos/associação compostos usando ACXCIRCUTTEMPLATES (#1).
Quando o gerenciador do ACX recebe um modelo de circuito, ele verifica se é um modelo de instância ou um modelo de classe genérico.
Para modelos de instância, o ACX cria um ACXCOMPOSITEMANAGER (#4), para modelos de classe genéricos, o ACX cria um ACXCOMPOSITEFACTORY (#2), que é responsável por criar itens ACXCOMPOSITEMANAGER (#3) quando detecta o circuito central da composição. Os circuitos centrais são os circuitos que dão a identidade a um ponto de extremidade de áudio composto.
O ACXCOMPOSITEMANAGER, por sua vez, cria o ACXCOMPOSITE (#5) para representar o ponto de extremidade de áudio composto sublinhado. O gerenciador composto é responsável por monitorar qualquer segmento de circuito opcional que possa surgir após a composição ter sido criada/inicializada.
O ACXCOMPOSITE, por sua vez, cria um ACXCIRCUITMANAGER (#6) para cada circuito que faz parte da composição. O ACXCIRCUITMANAGER é responsável por criar, monitorar e controlar um único circuito (#7).
É possível que um circuito seja marcado como "sob demanda", nesse caso, o ACXCIRCUITMANAGER encontra sua fábrica de circuitos e solicita um novo circuito para a composição (#8). O ACXCIRCUITFACTORY cria um ACXCIRCUIT como solicitação (#9).
Quando todos os ACXCIRCUITs são detectados e ativados, o ACXCOMPOSITE torna-se ativo também e instrui os ACXCIRCUITMANAGERS a ativar as interfaces de "áudio" para seus circuitos.
O diagrama de sequência a seguir mostra como dois circuitos ACX (circuito A e B) são ligados entre si para criar um caminho de áudio completo, que é representado pelo construtor de ponto de extremidade de áudio (AEB) com um dispositivo de áudio de software.
Negociação de formato de vários circuitos
Esta seção descreve a negociação de formato que ocorre quando o ponto de extremidade de áudio é composto por dois ou mais circuitos. Para obter informações gerais sobre Circuitos ACX, consulte Comunicações entre drivers de pilha múltipla ACX.
Pinos de ponte de nível inferior
Pinos de ponte de nível inferior são os pinos que enviam dados para (renderizam) ou recebem dados de (capturam) um dispositivo de áudio físico direta ou indiretamente. Esse tipo de pino pode ou não ter ACXMODEFORMATLISTs associados a eles. Esses pinos de ponte têm um tipo "AcxPinQualifierBridgeB" ou "AcxPinQualifierBridgeDevice". Para obter mais informações sobre ACXMODEFORMATLIST, consulte o cabeçalho acxdataformat.h.
Neste diagrama e artigo, os níveis superior e inferior são usados para descrever a direção do fluxo, pois a direção do fluxo para cima ou para baixo depende se os pinos estão enviando dados (renderizando) ou recebendo dados (capturando).
Pinos de ponte de nível inferior sem ACXMODEFORMATLIST(s)
Um driver pode optar por não expor listas de formato de modo em seu pino de nível inferior. Se as listas de formato de modo não estiverem disponíveis em um pino de ponte de nível inferior, um usuário (por meio do painel de controle de som) ou outra entidade de software não poderá controlar/especificar diretamente o formato de áudio desse pino e dos fluxos associados. Estes são alguns cenários em que essas listas não são necessárias:
Circuitos somente de streaming que podem ser conectados a um circuito DSP, a um circuito CODEC ou diretamente ao dispositivo de áudio. Esses circuitos simplesmente movem os dados do ponto A para o ponto B sem modificá-los. Esses circuitos não alteram a taxa de amostragem de dados do(s) fluxo(s) de entrada/saída. Nesse caso, as listas de formato de modo são associadas ao pino de nível superior.
Circuitos de fluxo único sem elementos que modifiquem a taxa de amostragem de entrada/saída. Um exemplo disso é o circuito do dispositivo de áudio USB. Nesse cenário, as listas de formato de modo são associadas ao pino de nível superior.
A ausência da lista de formatos de dados implica que o formato de dados do fluxo originado desse pino é compatível com um dos formatos de dados do pino de nível superior do circuito conectado.
Pinos de ponte de nível inferior com ACXMODEFORMATLIST(s)
Um driver pode optar por expor listas de formato de modo em seus pinos de nível inferior. Se as listas de formato de modo estiverem disponíveis em um pino de ponte de nível inferior, um usuário (por meio do painel de controle de som) ou outra entidade de software poderá controlar/especificar diretamente o formato de áudio desse pino e dos fluxos associados.
Estes são alguns cenários válidos em que essas listas de formato de modo são usadas:
- Circuitos DSP - normalmente, esse tipo de circuito suporta vários fluxos sendo executados em diferentes taxas de amostragem. Esses fluxos são convertidos internamente em uma taxa de amostragem comum e misturados antes que os dados se movam para o próximo circuito. A lista de formato de dados controla/especifica a taxa de amostragem final (para esse circuito).
Quando a lista de formatos de dados está presente, esses formatos de dados precisam corresponder a amostras de formato de dados no pino de nível superior do pino do próximo circuito. Note que os modos não precisam corresponder. Veja a discussão dos modos nas seções abaixo.
As listas de formato de nível inferior dão a oportunidade ao usuário/camada superior de controlar o formato do fluxo resultante, neste caso, o valor padrão da lista é a taxa de amostragem usada até que uma ação explícita seja realizada para alterar o formato nesse pino.
Para obter mais informações sobre listas de formatos, consulte o cabeçalho acxdataformat.h.
Pinos de ponte de nível superior
Pinos de ponte de nível superior são os pinos que recebem dados de (renderizam) ou enviam dados para (capturam) um módulo de software direta ou indiretamente. Esse tipo de pino deve ter ACXMODEFORMATLISTs associados a eles. Esses pinos de ponte têm um tipo "AcxPinQualifierBridgeA".
O diagrama anterior mostrado aqui novamente também pode ser usado para mostrar o fluxo de dados de renderização e captura entre um pino de streaming, dois circuitos e um dispositivo.
Pinos [de ponte] de nível superior sem ACXMODEFORMATLIST(s)
Pinos de nível superior sem listas de formato de modo não são uma combinação válida, e isso resulta em um ponto de extremidade configurado incorretamente. O ponto de extremidade não é visível do ponto de vista do usuário.
Pinos [de ponte] de nível superior com ACXMODEFORMQATLIST(s)
Os pinos de nível superior devem sempre ter um ou mais ACXMODEFORMATLISTs. As listas de formato de modo especificam todas as taxas de amostragem possíveis para um modo e sua taxa de amostragem padrão. Diferentes modos podem ter diferentes conjuntos de taxas de amostragem. A taxa de amostragem padrão é a taxa de amostragem preferencial para esse modo.
Modos e circuitos
Pinos de nível superior de circuitos de fluxo único ou circuitos de fluxo múltiplo podem suportar uma ou mais listas de formato de modo. Circuitos de fluxo único têm um modo ativo uma única vez, enquanto circuitos de fluxo múltiplo podem ter dois ou mais fluxos funcionando ao mesmo tempo usando modos diferentes.
Mapeamento de modo
Esta seção fornece uma breve introdução dos modos padrão e explica por que o mapeamento de "modo" é usado.
Modo BRUTO: o fluxo/circuito não aplica nenhum efeito no fluxo (exceto por restrições de volume, mudo e segurança, como proteção de alto-falante).
Modo PADRÃO: o fluxo/circuito faz algum efeito padrão.
<mode_name> mode
: o fluxo/circuito aplica efeitos específicos ao modo <mode_name> selecionado.
É obrigatório que os pinos de streaming suportem o modo bruto e/ou padrão. É opcional para pinos de streaming suportar qualquer outro <mode_name> modes
.
Em um ponto de extremidade composto, pode ser possível para o circuito de nível superior suportar vários modos e, para os circuitos de nível inferior, suportar apenas BRUTO e/ou PADRÃO.
Exemplo em um ponto de extremidade de dois circuitos:
O pino de nível inferior do circuito de nível superior suporta os modos e formatos associados m1{f1,f2} e m2{f3,f4}, ou seja, isso significa que o fluxo do pino tem um formato de f1 ou f2 quando m1 é usado ou um formato de f3 ou f4 quando m2 é usado. Isso pressupõe que o circuito de nível superior é um circuito de fluxo único.
O pino de nível superior do circuito de nível inferior suporta o modo padrão{f1,f2,f3}.
Nesse caso, o modo do fluxo é convertido do modo <mode_name> para o modo padrão, mantendo as mesmas taxas de amostragem.
m1/f1 para > padrão/f1
m1/f2 para > padrão/f2
m2/f3 para > padrão/f3
Entrada inválida: m2/f4 para > nenhum
O mapeamento de modo é feito pelo driver com a ajuda do ACX. Na tabela acima, a última entrada é inválida, o pino de nível inferior do circuito de nível superior deve remover o m2/f4 como opção para seus formatos suportados. Note que isso poderia ter acontecido no sentido inverso, ou seja, o pino de nível superior do circuito de nível inferior poderia ter suportado também f4 e f5. Nesse caso, default-f4 era suportado, mas o default-f5 não era. Nesse caso, é o pino de nível superior do circuito de nível inferior responsável por não listar m?/f5 como opção de sua lista. Outras seções abaixo explicam esse processo.
Negociações de formatos
Antes que o ACX habilite as interfaces de áudio dos circuitos que compõem o dispositivo composto, ele garante que os circuitos possam negociar o modo/formatos dos dados de áudio. O ACX executa essa notificação de circuito invocando o retorno de chamada de inicialização composto em todos os circuitos da composição. A sequência é de nível inferior (lado do dispositivo) para nível superior (lado do sistema). Os circuitos têm a oportunidade de atualizar seus formatos durante essa fase.
Exibição do painel de controle do formato do dispositivo
A lógica atual do painel de controle de som mostra a lista de formatos do dispositivo da seguinte maneira:
- Se o dispositivo de áudio suportar um elemento do mecanismo de áudio, a lista de formatos de dados exibida no painel de controle será a lista de formatos de dados do dispositivo, ou seja, a lista de formatos de dados anexada ao pino de nível inferior (que está conectado ao pino de saída do elemento do mecanismo de áudio).
- Se o dispositivo de áudio não suportar um elemento de mecanismo de áudio, a lista de formatos de dados exibida no painel de controle será a lista de formatos de dados do pino de streaming, ou seja, a lista de formatos de dados atacada no pino de nível superior.
Criação automática de fluxo de nível inferior de vários circuitos
O ACX usa objeto(s) ACXSTREAMBRIDGE associado(s) a um pino de ponte de nível inferior para propagar automaticamente a solicitação create-stream(s) para circuitos remotos.
Quando um aplicativo cliente cria um fluxo, essa solicitação é recebida primeiro por um pino de streaming. O ACX notifica o driver que possui o pino de streaming sobre a solicitação de fluxo de criação por meio do retorno de chamada fornecido especificado no momento da criação do circuito. No retorno de chamada, o driver cria um objeto ACXSTREAM que representa o fluxo e, em seguida, retorna o controle de volta para o ACX. Quando o ACX recebe de volta o controle, ele verifica se precisa encaminhar essa solicitação de criação para o próximo circuito (nível inferior). Opcionalmente, o driver pode encaminhar a solicitação de criação para o próximo circuito (nível inferior) antes de retornar de seu retorno de chamada de fluxo de criação. A última opção permite que o driver faça quaisquer pós-operações depois que os circuitos de nível inferior tiveram a oportunidade de processar suas solicitações de criação.
O ACX usa a seguinte lógica padrão para a criação de fluxo:
- Se não houver nenhum pino de ponte de nível inferior, está pronto.
- Se o driver já tiver associado manualmente o fluxo a um ACXSTREAMBRIDGE, está tudo pronto.
- Se o pino da ponte de nível inferior não tiver um ACXSTREAMBRIDGE para o MODO especificado, falhe na solicitação.
- O ACX adiciona o novo fluxo que o driver criou com o ACXSTREAMBRIDGE recuperado.
O ACXSTREAMBRIDGE atua como um entrada múltipla/saída única. Enquanto houver um fluxo de entrada, o ACXSTREAMBRIDGE manterá um fluxo de saída presente. O fluxo de saída é excluído somente quando o último fluxo de entrada é removido. ACXSTREAMBRIDGE usa os ACXDATAFORMATLISTs associados ao pino da ponte de nível inferior ao decidir o modo e o formato a serem usados para o circuito remoto.
O ACXSTREAMBRIDGE usa a seguinte lógica para selecionar o modo e o formato de dados do fluxo de saída:
Se o MODO do fluxo de saída não for especificado, verifique se há uma lista de formatos "padrão".
Se o MODO do fluxo de saída não for especificado, e a lista de formatos "padrão" não estiver presente, verifique se há uma lista de formatos "brutos".
Se o MODO for NULL_GUID, verifique se há uma lista de formatos associada ao MODO do primeiro fluxo de entrada.
Se o MODO for especificado, verifique se há uma lista de formatos para esse MODO.
Se a lista de formatos for encontrada, obtenha o formato padrão na lista de formatos.
Se o formato não for encontrado, o ACXSTREAMBRIDGE usará o formato do primeiro fluxo de entrada.
O ACXSTREAMBRIDGE cria uma solicitação de criação de fluxo usando o ACXTARGETSTREAM usando o MODO recuperado e o formato de dados da seguinte maneira:
- Se o MODO foi especificado, esse MODO é usado.
- Se o MODO foi NULL_GUID, o MODO do primeiro fluxo de entrada é usado.
- Caso contrário, nenhum modo é usado.
O ACX tem o cuidado de excluir/fechar o fluxo de destino quando o último fluxo de entrada é removido.
Outro trabalho do ACXSTREAMCIRCUIT é propagar automaticamente um estado de fluxo ao longo da cadeia de streaming.
Um driver tem a oportunidade de desativar a criação de ponte de fluxo remoto do circuito padrão chamando AcxCircuitInitDisableDefaultStreamBridgeHandling ou associando manualmente o objeto ACXSTREAM a um ACXSTREAMBRIDGE antes de retornar o controle ao ACX. No último caso, o fluxo remoto é criado antes que o driver retorne da função de retorno de chamada EVT_ACX_CIRCUIT_CREATE_STREAM do "fluxo de criação".
Para circuitos que usam vários pinos de captura/renderização, como host/offload/loopback/kws, ou seja, quando o elemento do mecanismo de áudio é suportado, o driver deve criar uma ponte de fluxo sem nenhum modo especificado e adicionar manualmente os objetos ACXSTREAM de entrada à ponte de fluxo ao processar o retorno de chamada de fluxo de criação.
Para obter mais informações sobre a criação de pontes de fluxo, consulte:
A propagação automática do estado do fluxo de vários circuitos para fluxos de nível inferior
O ACXSTREAMBRIDGE propaga automaticamente uma solicitação de estado de fluxo para circuitos remotos em nível inferior. Quando o estado de um fluxo muda, o ACXSTREAMBRIDGE calcula o estado misto do fluxo de saída e envia essa nova solicitação de "estado de fluxo" para o fluxo remoto usando o ACXTARGETSTREAM.
O ACXSTREAM juntamente com o ACXSTREAMBRIDGE usam a seguinte lógica:
Altere os estados dos fluxos de nível superior primeiro nestes cenários:
- Renderização && que vai de parar até > executar
- Capturar && que vai de executar para >parar
- Outros && que vão de executar até > parar
Altere os estados dos fluxos de nível superior por último nestes cenários:
- Renderização && que vai de executar até >parar
- Captura && que vai de parar até > executar
- Outros && que vão de parar até > executar
Os drivers têm a opção de inverter essa ordem por meio de uma configuração.
Observação
Um driver/circuito/fluxo precisa sempre ter êxito nas transições de fluxo de executar para parar. Por outro lado, é permitido que um driver falhe na reversão, ou seja, de parar para executar.
Confira também
Visão geral de extensões de classe de áudio ACX