Partilhar via


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 pino de saída (ACXPIN), e pode agregar um ou mais objetos semelhantes a AcxElements. Para obter informações gerais, consulte Circuitos ACX.

Composição do circuito ACX

ACX liga circuitos juntos até que eles formem um caminho de áudio completo. O ACX usa ligações de áudio para conectar circuitos de áudio. Ao mesmo tempo, cada circuito ACX é convertido em um filtro KS, esses filtros KS são então detetados pelo Audio Endpoint Builder (AEB) que é executado como serviço de modo de usuário. A AEB analisa o gráfico de filtro KS detetado e cria o ponto de extremidade de áudio do software que representa a infraestrutura de áudio subjacente quando deteta um caminho de áudio completo.

O diagrama a seguir mostra os objetos ACX usados pelo ACX para detetar, construir e monitorar os circuitos que compõem o ponto de extremidade de áudio composto.

Diagrama ilustrando a arquitetura de destino ACX com ACXCIRCUITTEMPLATE, ACXCOMPOSITEMANAGER, ACXMANAGER, ACXCIRCUITFACTORY e ACXCIRCUIT.

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 versões diferentes do ACX, e não devem ser chamados ou usados diretamente.

O gestor ACX analisa os modelos de circuito durante a inicialização do driver, quando os drivers ACX os registam com o gestor ACX. Os drivers ACX registam modelos compostos ou associação usando ACXCIRCUTEMPLATES (#1).

Quando o gerenciador ACX recebe um modelo de circuito, ele verifica se este é um modelo de instância ou um modelo de classe genérico.

Para modelos de exemplo, o ACX cria um ACXCOMPOSITEMANAGER; para modelos de classe genéricos, o ACX cria um ACXCOMPOSITEFACTORY, que é responsável por criar itens ACXCOMPOSITEMANAGER quando deteta o circuito ‘core’ do composto. Os circuitos principais são os circuitos que dão a identidade a um ponto final de áudio composto.

O ACXCOMPOSITEMANAGER, por sua vez, cria o ACXCOMPOSITE para representar o endpoint de áudio composto subjacente. O gestor de compósitos é responsável por monitorizar qualquer segmento de circuito opcional que possa surgir após a criação/inicialização do composto.

O ACXCOMPOSTO, por sua vez, cria um ACXCIRCUITMANAGER (#6) para cada circuito que faz parte do composto. O ACXCIRCUITMANAGER é responsável por criar, monitorizar e controlar um único circuito (#7).

Pode ser possível que um circuito seja marcado como 'a pedido'; nesse caso, o ACXCIRCUITMANAGER encontra a sua fábrica de circuitos e solicita um novo circuito para o composto (#8). O ACXCIRCUITFACTORY cria um ACXCIRCUIT conforme a solicitação (#9).

Quando todos os ACXCIRCUITs são detetados e estão ativos, o ACXCOMPOSITE também se torna ativo e instrui os ACXCIRCUITMANAGERS a ativar as interfaces de 'áudio' para os seus circuitos.

O diagrama de sequência a seguir mostra como dois circuitos ACX (Circuito A e B) estão ligados entre si para criar um caminho de áudio completo, que é representado pelo construtor de pontos finais de áudio (AEB) com um dispositivo de áudio de software.

Diagrama com colunas rotuladas Driver A, Driver B, ACX Interface B, Circuit Manager A e B, ACX Composite e ACX Manager, ilustrando a sequência de chamada com setas de fluxo entre as colunas.

Negociação em formato multicircuito

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 os circuitos ACX, consulte comunicações de multi-stack e driver cruzado ACX.

Pinos de ponte de nível inferior

Os 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. Este tipo de pinos de conexão pode ou não ter ACXMODEFORMATLISTs associados. Esses pinos de ponte têm um tipo 'AcxPinQualifierBridgeB' ou 'AcxPinQualifierBridgeDevice'. Para obter mais informações sobre ACXMODEFORMATLIST, consulte o cabeçalho acxdataformat.h.

Diagrama mostrando o fluxo de dados de renderização e captura entre um pino de streaming, dois circuitos e um dispositivo.

Neste diagrama e artigo, os termos "uplevel" e "downlevel" são usados para descrever a direção do fluxo, pois a direção do fluxo para cima ou para baixo depende de se os pinos estão a enviar dados para renderização ou a receber dados para captura.

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 (via painel de controle de som) ou outra entidade de software não poderá controlar/especificar diretamente o formato de áudio desse pino e fluxos associados. Estes são alguns cenários em que essas listas não são necessárias:

  • Circuitos somente 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. Estes circuitos não alteram a taxa de amostragem de dados do(s) fluxo(s) de entrada/saída. Neste caso, as listas de formato de modo estã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 de 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 deste pino é compatível com um dos formatos de dados do pino de nível superior do circuito anexado.

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 formatos de modo estiverem disponíveis em um pino de ponte de nível inferior, um usuário (via painel de controle de som) ou outra entidade de software pode controlar/especificar diretamente o formato de áudio desse pino e fluxos associados.

Estes são alguns cenários válidos em que estas listas de formatos de modo são usadas:

  • Circuitos DSP - normalmente este tipo de circuitos suportam vários fluxos rodando em diferentes taxas de amostragem, esses fluxos são convertidos internamente para 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 este circuito).

Quando a lista de formatos de dados está presente, esses formatos de dados precisam coincidir com as amostras de formato de dados no pino acima do circuito seguinte. Observe que os modos não precisam corresponder, veja a discussão dos modos, nas seções abaixo.

As listas de formatos de nível inferior, dá a oportunidade ao usuário/camada superior para 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 tomada para alterar o formato neste 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 (renderização) ou enviam dados para (capturar) um módulo de software direta ou indiretamente. Esse tipo de pinos deve ter ACXMODEFORMATLISTs associados a eles. Estes pinos de ponte têm o tipo 'AcxPinQualifierBridgeA'.

O diagrama anterior mostrado aqui novamente, também pode ser usado para mostrar a renderização e capturar o fluxo de dados entre um pino de streaming, dois circuitos e um dispositivo.

Diagrama mostrando o fluxo de dados de renderização e captura entre um pino de streaming, dois circuitos e um dispositivo. As setas mostram o fluxo de dados de renderização indo para a direita e capturando para a direita.

Pinos Uplevel [Bridge] sem ACXMODEFORMATLIST(s)

Pinos de nível avançado sem listas de formato de modo não são uma combinação válida e isso resulta num endpoint mal configurado. O ponto de extremidade não é visível do ponto de vista do usuário.

Atualizar os pinos [Bridge] com ACXMODEFORMQATLIST(s)

Os pinos de nível superior devem sempre ter uma ou mais ACXMODEFORMATLISTs. As mode-format-lists 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 preferida para esse modo.

Modos e circuitos

Pinos de nível elevado de circuitos de fluxo único ou circuitos multifluxo podem suportar uma ou mais listas de formatos de modos. Os circuitos de fluxo único têm um modo ativo ao mesmo tempo, enquanto os circuitos multifluxo podem ter dois ou mais fluxos funcionando ao mesmo tempo, usando modos diferentes.

Mapeamento de configurações

Esta seção fornece uma breve introdução dos modos padrão e explica por que o mapeamento de "modo" é usado.

Modo RAW: o fluxo/circuito não aplica quaisquer efeitos sobre o fluxo (exceto possivelmente para restrições de volume, mudo e segurança, como proteção de alto-falante).

Modo padrão: o fluxo/circuito aplica 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 raw e/ou modo padrão. É opcional que os pinos de streaming suportem qualquer outro <mode_name> modes.

Em um ponto de extremidade composto, pode ser possível que o circuito de nível superior suporte vários modos e que os circuitos de nível inferior suportem apenas RAW e/ou DEFAULT.

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. Isto 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}.

Neste caso, o modo do fluxo é convertido de <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 do 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 foi suportado, mas default-f5 não. Nesse caso, é o pino de nível elevado do circuito de nível rebaixado responsável por não listar m?/f5 como uma opção na sua lista. Outras seções abaixo explicam esse processo.

Negociações de formato

Antes do ACX ativar as interfaces de áudio dos circuitos que compõem o dispositivo combinado, assegura que os circuitos negociem os modos/formatos dos dados de áudio. ACX executa essa notificação de circuito invocando o callback de inicialização de composto em todos os circuitos do componente composto. A sequência é do nível inferior (lado do dispositivo) para o nível superior (lado do sistema). Os circuitos têm a oportunidade de atualizar os seus formatos durante esta 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 motor de áudio, a lista de formatos de dados apresentada no painel de controlo é 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á ligado ao pino de saída do elemento do motor de áudio).
  • Se o dispositivo de áudio não suportar um elemento do mecanismo de áudio, a lista de formatos de dados exibida no painel de controle é a lista de formatos de dados do pino de streaming, ou seja, a lista de formatos de dados atacada ao pino de nível superior.

Criação automática de fluxo de nível inferior multi-circuito

O ACX usa objeto(s) ACXSTREAMBRIDGE associados 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 responsável pelo pino de streaming sobre a solicitação de criação de fluxo 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 para o ACX. Quando o ACX retoma o controlo, verifica se precisa encaminhar essa solicitação de criar para o próximo circuito (nível inferior). Opcionalmente, o driver pode encaminhar a solicitação de criação para o próximo circuito (downlevel) antes de retornar de seu retorno de chamada create-stream. Esta última opção permite que o driver realize quaisquer operações pós-processamento depois que os circuitos de nível inferior tenham tido a oportunidade de processar as 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, tudo feito.
  • Se o driver já tiver associado manualmente o fluxo a um ACXSTREAMBRIDGE, tudo pronto.
  • Se o pino da ponte de nível inferior não tiver um ACXSTREAMBRIDGE para o MODO especificado, falhará a solicitação.
  • O ACX adiciona o novo fluxo que o driver criou com o ACXSTREAMBRIDGE recuperado.

O ACXSTREAMBRIDGE atua como um multi-entrada/única-saída. Enquanto houver uma entrada ativa, o ACXSTREAMBRIDGE mantém uma saída presente. O out-stream é excluído somente quando o último in-stream é removido. O ACXSTREAMBRIDGE usa as ACXDATAFORMATLISTs associadas ao pino de 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 de saída e o formato de dados:

  • Se o modo para out-stream não for especificado, verifique se há uma lista de formatos 'padrão'.

  • Se o modo para transmissão de saída não estiver especificado e a lista de formatos 'padrão' não estiver presente, verifique se há uma lista de formatos 'raw'.

  • Se o MODE estiver NULL_GUID, verifique se há uma lista de formatos associada ao MODE do primeiro in-stream.

  • Se MODE for especificado, verifique se há uma lista de formatos para este 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 constrói uma solicitação de criação de fluxo utilizando o ACXTARGETSTREAM com o MODE e o data-format recuperados da seguinte forma:

    • Se o Modo foi especificado, esse Modo é usado.
    • Se o MODE foi NULL_GUID, o MODE do primeiro in-stream é 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 possibilidade de desativar a criação padrão de uma ponte de fluxo remoto no circuito, chamando AcxCircuitInitDisableDefaultStreamBridgeHandling ou associando manualmente o objeto ACXSTREAM a um ACXSTREAMBRIDGE antes de devolver o controle ao ACX. Neste último caso, o fluxo remoto é criado antes que o driver retorne da função callback 'create-stream' EVT_ACX_CIRCUIT_CREATE_STREAM.

Para circuitos que utilizam múltiplos pinos de captura/reprodução, como host/offload/loopback/kws, ou seja, quando o elemento do motor de áudio é suportado, o driver deve criar uma ponte de fluxo sem especificar nenhum modo de entrada e adicionar manualmente os objetos ACXSTREAM recebidos à ponte de fluxo ao processar o retorno de chamada para criar fluxo.

Para obter mais informações sobre a criação de pontes de fluxo, consulte:

Propagação automática do estado de 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. 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 primeiro os estados dos streams de nível superior nestes cenários:

    • Renderizar && indo de Stop-Run>
    • Captura e indo de Run-Stop>
    • Outros && passando de Executar-Stop>
  • Nestes cenários, altere os estados dos fluxos de nível superior por último.

    • Renderizar && indo de Run-Stop>
    • Capture && passar de Stop-Run>
    • Outros e a transição de Stop-Run>

Os drivers têm a opção de inverter essa ordem por meio de uma configuração.

Observação

É um requisito que um driver/circuito/fluxo consiga sempre realizar com sucesso transições de execução para paragem. Por outro lado, é permitido que um condutor falhe na transição de paragem para funcionamento.

Ver também

Circuitos ACX

Visão geral das extensões de classe de áudio ACX

Comunicações entre controladores de multicamadas ACX

Resumo dos objetos ACX