Compartilhar via


Composição de vários circuitos ACX

Este tópico discute a composição de vários circuitos do ACX. Para obter uma visão geral do ACX e da lista de termos ACX, consulte a 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 completo 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

O ACX associa 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 ACX é convertido em um filtro KS, e esses filtros KS são detectados pelo AEB (Construtor de Pontos de Extremidade de Áudio), que é executado como serviço de modo de usuário. AEB verifica o grafo de filtro KS detectado e cria o ponto de extremidade de áudio de software que representa a infraestrutura de áudio subjacente quando detecta um caminho de áudio completo.

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

Diagrama que ilustra 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 estão listados aqui apenas para fins ilustrativos. Não há garantia de que os tipos internos permaneçam iguais ou estejam disponíveis em diferentes versões do ACX e não devem ser chamados ou usados diretamente.

O gerenciador do ACX analisa os modelos de circuito no momento da inicialização do driver quando os drivers ACX os registram no gerenciador do ACX. Os drivers ACX registram modelos de composição/associação usando ACXCIRCUTTEMPLATES (nº 1).

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

Para os modelos de instância, o ACX cria um ACXCOMPOSITEMANAGER (#4), e para os modelos de classe genéricos, o ACX cria uma ACXCOMPOSITEFACTORY (#2), que é responsável por criar itens ACXCOMPOSITEMANAGER (#3) quando detecta o circuito 'core' do composto. Circuitos principais 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 (nº 5) para representar o ponto de extremidade de áudio composto sublinhado. O gerenciador de composição é responsável por monitorar qualquer segmento de circuito opcional que possa surgir após a criação/inicialização da composição.

O ACXCOMPOSITE, por sua vez, cria um ACXCIRCUITMANAGER (nº 6) para cada circuito que faz parte da composição. O ACXCIRCUITMANAGER é responsável por criar, monitorar e controlar um único circuito (nº 7).

Pode ser possível que um circuito seja marcado como "sob demanda", nesse caso, o ACXCIRCUITMANAGER localiza sua fábrica de circuitos e solicita um novo circuito para a composição (nº 8). O ACXCIRCUITFACTORY cria um ACXCIRCUIT conforme solicitado (nº 9).

Quando todos os ACXCIRCUITs são detectados e ativos, o ACXCOMPOSITE também se torna ativo e instrui o 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 associados para criar um caminho de áudio completo, que é representado pelo AEB (construtor de pontos de extremidade de áudio) 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 chamadas com setas de fluxo entre as colunas.

Negociação de formato de múltiplos 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 várias pilhas do ACX.

Pinos de ponte de nível inferior

Os pinos de ponte de nível inferior são os pinos que enviam dados para (renderizar) ou recebem dados de (capturar) um dispositivo de áudio físico direta ou indiretamente. Esse tipo de pinos 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.

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, "uplevel" e "downlevel" são usados para descrever a direção do fluxo, pois a direção do fluxo ascendente ou descendente depende de os pinos estarem enviando dados para renderização ou recebendo 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 (por meio do painel de controle de som) ou outra entidade de software não poderá controlar/especificar diretamente o formato de áudio desse pin 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. Esses circuitos não alteram a taxa de amostragem de dados dos fluxos 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 modificam 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 formato de dados implica que o formato de dados do fluxo proveniente desse pin é compatível com um dos formatos de dados do pin 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 formato de modo estiverem disponíveis em um pino de ponte inferior, um usuário (por meio do painel de controle de som) ou outra entidade de software poderá controlar ou especificar diretamente o formato de áudio desse pino e dos fluxos associados.

Estes são alguns cenários válidos em que essas listas no formato de modo são usadas:

  • Circuitos DSP – normalmente esse tipo de circuito dá suporte a vários fluxos em execução a taxas de exemplo diferentes, esses fluxos são convertidos internamente em uma taxa de exemplo comum e misturados antes que os dados sejam movidos para o próximo circuito. A lista de formato de dado controla/especifica a taxa de amostragem final (para este circuito).

Quando a lista de formato de dados está presente, esses formatos de dados precisam corresponder a exemplos de formato de dados no pino de nível superior do pino do próximo circuito. Observe que os modos não precisam corresponder, consulte a discussão de modos nas seções abaixo.

O formato downlevel lista, oferece a oportunidade para o usuário/camada superior controlar o formato do fluxo de dados resultante. Nesse 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 formato, consulte o cabeçalho acxdataformat.h.

Pinos de nivelamento de ponte

Os 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. Esses tipos de pinos devem ter ACXMODEFORMATLISTs associados a eles. Esses pinos de ponte são do 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.

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 de captura indo para a direita.

Atualizar pinos [Bridge] sem ACXMODEFORMATLIST(s)

Os 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 endpoint não está visível do ponto de vista do usuário.

Elevar pinos [Bridge] com ACXMODEFORMQATLIST(s)

Os pinos de nível superior sempre devem 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. Modos diferentes podem ter diferentes conjuntos de taxas de amostragem. A taxa de exemplo padrão é a taxa de exemplo preferencial para esse modo.

Modos e circuitos

Pinos de nível superior de circuitos de fluxo único ou circuitos de vários fluxos podem dar suporte a uma ou mais listas de formato de modo. Circuitos de fluxo único têm um modo ativo ao mesmo tempo, enquanto circuitos de vários fluxos podem ter dois ou mais fluxos em execução 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 RAW: o fluxo/circuito não aplica efeitos no fluxo (exceto por possíveis restrições de volume, mudo e segurança, como a proteção do alto-falante).

Modo PADRÃO: o fluxo/circuito realiza um 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 ofereçam suporte ao modo raw e/ou padrão. É opcional que os pinos de streaming ofereçam suporte a qualquer outro <mode_name> modes.

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

Exemplo em um ponto de extremidade de dois circuitos:

  • O pin de nível inferior do circuito de nível superior dá suporte aos 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 superior seja um circuito de fluxo único.

  • O pin de nível superior do circuito de nível inferior dá suporte ao 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 exemplo.

m1/f1 para o > padrão/f1

m1/f2 para > default/f2

m2/f3 para > default/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 com suporte. Observe que isso poderia ter acontecido no 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, o default-f4 era suportado, mas o default-f5 não era. Nesse caso, é o pino superior do circuito de nível inferior o responsável por não listar m?/f5 como opção em sua lista. Outras seções abaixo explicam esse processo.

Formatos de negociações

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 composta em todos os circuitos da composição. A sequência é de nível inferior (lado do dispositivo) a 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 de formato do dispositivo

A lógica atual do painel de controle de som mostra a lista de formato do dispositivo da seguinte maneira:

  • Se o dispositivo de áudio der suporte a um elemento de mecanismo de áudio, a lista de formatos de dados exibidos no painel de controle será a lista de formato de dados do dispositivo, ou seja, a lista de formato 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 der suporte a um elemento de motor de áudio, a lista de formatos de dados exibidos no Painel de Controle será a lista de formato de dados do pin de streaming, ou seja, a lista de formato de dados anexada ao pin de nível superior.

Criação automática de fluxo de nível reduzido para múltiplos circuitos

O ACX usa objetos ACXSTREAMBRIDGE associados a um pino de ponte de nível inferior para propagar automaticamente a solicitação create-stream para circuitos remotos.

Quando um aplicativo cliente cria um fluxo, essa solicitação é recebida pela primeira vez por um pino de streaming. O ACX notifica o driver responsável pelo pino de streaming sobre a solicitação create-stream através do retorno de chamada especificado e fornecido no momento da criação do circuito. No retorno de chamada, o driver cria um objeto ACXSTREAM que representa o fluxo e retorna o controle ao ACX. Quando o ACX recebe de volta o controle, ele verifica se ele 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 sua função de chamada de criação de fluxo. A última opção permite que o driver execute operações posteriores após os circuitos de nível inferior terem tido 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, tudo pronto.
  • Se o driver já tiver associado manualmente o fluxo a um ACXSTREAMBRIDGE, tudo concluído.
  • Se o pino de 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 vários fluxos de entrada/um único de saída. Desde que haja um fluxo de entrada, o ACXSTREAMBRIDGE mantém um fluxo de saída ativo. O fluxo de saída é excluído somente quando o último fluxo de entrada é removido. 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 do fluxo externo e o formato de dados:

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

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

  • Se o MODE for NULL_GUID, verifique se há uma lista de formatos associada ao MODE do primeiro elemento no fluxo.

  • Se MODE 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, ACXSTREAMBRIDGE usará o formato do primeiro fluxo.

  • 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 MODE tiver sido especificado, esse MODO será usado.
    • Se MODE tiver sido NULL_GUID, o MODO do primeiro no fluxo será usado.
    • Caso contrário, nenhum modo é usado.

O ACX tem o cuidado de excluir/fechar o fluxo de destino quando o último fluxo é 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 da 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 'create-stream' EVT_ACX_CIRCUIT_CREATE_STREAM.

Para circuitos que usam vários pinos de captura/renderização, como host/descarregamento/loopback/kws, ou seja, quando há suporte para o elemento de mecanismo de áudio, o driver deve criar uma ponte de fluxo sem nenhum(s) modo(s) 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 streaming, consulte:

Propagação de estado de fluxo automático de vários circuitos para fluxos de nível inferior

ACXSTREAMBRIDGE propaga automaticamente uma solicitação de estado de fluxo de nível inferior para circuitos remotos. Quando o estado de um fluxo é alterado, 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 junto com o ACXSTREAMBRIDGE usa a seguinte lógica:

  • Altere inicialmente os estados dos fluxos de nível superior nestes cenários:

    • Renderizar && passando de Stop-Run
    • Capturar e mudar de Run para Stop>
    • Outros &&& indo de Run-Stop>
  • Altere por último os estados dos fluxos de nível superior nestes cenários:

    • Renderizar && passando de Run-Stop>
    • Capturar && passando de Stop-Run>
    • Outros && passando de Stop->Run

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

Observação

É um requisito para que um driver/circuito/fluxo sempre tenha êxito nas transições de fluxo de execução para parada. Por outro lado, é permitido que um controlador mude do modo de parada para o modo de execução.

Consulte também

Circuitos ACX

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

Comunicações entre driver de várias pilhas do ACX

Resumo dos objetos ACX