Configurar políticas de áudio

O lançamento do Android 10 inclui uma refatoração significativa do Gerenciador de políticas para oferecer mais flexibilidade e oferecer suporte a casos de uso automotivos complexos:

  • Estratégias de roteamento específicas do OEM.
  • Grupos de volumes personalizáveis para grupos de tipos de stream legados que usam as mesmas curvas de volume.
  • Estratégias de roteamento declaradas pelo mecanismo da política de áudio em vez de serem codificadas.
  • Grupos e curvas de volume gerenciados pelo mecanismo da política de áudio.
  • Refatoração interna que prepara para uma divisão futura entre código comum e código configurável e oferecer um gerenciamento de dispositivos de áudio mais avançado. Por exemplo, o uso de todas as propriedades do dispositivo não apenas o tipo dele nas regras de política.

O Android 7.0 introduziu um formato de arquivo de configuração de política de áudio (XML) para descrevendo sua topologia de áudio.

As versões anteriores do Android eram necessárias usando o device/<company>/<device>/audio/audio_policy.conf para declarar os dispositivos de áudio presentes no seu produto. Confira um exemplo esse arquivo para o hardware de áudio do Galaxy Nexus device/samsung/tuna/audio/audio_policy.conf). No entanto, CONF é uma simples e reservado que é muito limitado para descrever topologias complexas para verticais como televisões e automóveis.

O Android 7.0 descontinuou o audio_policy.conf e adicionou suporte para definir uma topologia de áudio usando um formato de arquivo XML que é mais legível por humanos, possui uma ampla variedade de ferramentas de edição e análise e é flexível o suficiente para descrever topologias de áudio complexas. O Android 7.0 usa a Sinalização de build USE_XML_AUDIO_POLICY_CONF para escolher o XML dos arquivos de configuração.

Vantagens do formato XML

Como no arquivo CONF, o arquivo XML permite definir o número e os tipos de perfis de stream de saída e entrada, dispositivos utilizáveis para reprodução e captura e audio. Além disso, o formato XML oferece as seguintes melhorias:

  • No Android 10, há mais de um app de gravação ativo ao mesmo tempo.
    • O início da gravação nunca é rejeitado devido a uma situação de simultaneidade.
    • O registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb) o callback notifica os clientes sobre as mudanças no caminho de captura.
  • Nas seguintes situações, um cliente recebe amostras de áudio silenciosas:
    • Um caso de uso sensível à privacidade (por exemplo, VOICE_COMMUNICATION) está ativo.
    • O cliente não tem um serviço ou interface de primeiro plano.
    • Os papéis especiais são reconhecidos pela política:
      • Serviço de acessibilidade: pode gravar mesmo se um caso de uso que envolve privacidade estiver ativo.
      • Google Assistente: considera a privacidade quando a interface está na parte de cima.
  • Os perfis de áudio têm uma estrutura semelhante aos descritores de áudio simples HDMI, permitindo um conjunto de taxas de amostragem/máscaras de canal para cada formato de áudio.
  • Há definições explícitas para todas as conexões possíveis entre dispositivos e streams. Antes, uma regra implícita possibilitava conectar todos os dispositivos conectados à mesma HAL. impedindo que a política de áudio controle as conexões solicitadas com o patch de áudio APIs de terceiros. No formato XML, a descrição da topologia define limitações de conexão.
  • O suporte para inclui evita a repetição de envios de A2DP, USB ou redirecionamento padrão. e definições.
  • As curvas de volume são personalizáveis. Antes, as tabelas de volume eram fixadas no código. No XML as tabelas de volume são descritas e podem ser personalizadas.

O modelo em frameworks/av/services/audiopolicy/config/audio_policy_configuration.xml mostra muitos desses recursos em uso.

Formato do arquivo e localização

O novo arquivo de configuração da política de áudio audio_policy_configuration.xml e está localizado em /system/etc. Os exemplos a seguir mostram uma configuração simples de política de áudio na Formato de arquivo XML para o Android 12 e para as versões abaixo Android 12

A estrutura de nível superior contém módulos que correspondem a cada HAL de áudio. módulo de hardware, em que cada módulo tem uma lista de portas de mix, portas de dispositivos e rotas:

  • As portas de mix descrevem os possíveis perfis de configuração para streams que pode ser aberta na HAL de áudio para reprodução e captura.
  • As portas do dispositivo descrevem os dispositivos que podem ser conectados o tipo (e, opcionalmente, propriedades de endereço e áudio, se relevante).
  • Routes são separados do descritor da porta de combinação, ativando a descrição de trajetos de um dispositivo para outro ou de um stream para outro.

As tabelas de volume são listas simples de pontos que definem a curva usada para converter de um índice de IU para um volume em dB. Um arquivo de inclusão separado fornece padrões mas cada curva para um determinado caso de uso e categoria de dispositivo pode ser substituída.

Inclusões de arquivos

O método de inclusões XML (XInclude) pode ser usado para incluir a política de áudio informações de configuração localizadas em outros arquivos XML. Todos os arquivos incluídos devem siga a estrutura descrita acima com as seguintes restrições:

  • Os arquivos podem conter apenas elementos de nível superior.
  • Os arquivos não podem conter elementos XInclude.

Use inclusões para evitar a cópia do Android Open Source Project (AOSP) padrão informações de configurações do módulo HAL de áudio para todas as configurações da política de áudio (que é propenso a erros). Um arquivo XML de configuração de política de áudio padrão é fornecido para as seguintes HALs de áudio:

  • A2DP:a2dp_audio_policy_configuration.xml
  • Redirecionar submixagem: rsubmix_audio_policy_configuration.xml
  • USB:usb_audio_policy_configuration.xml

Organização do código da política de áudio

O AudioPolicyManager.cpp é dividido em vários módulos. para facilitar a manutenção e a configuração. A organização frameworks/av/services/audiopolicy inclui o módulos a seguir.

Module Descrição
/managerdefault Inclui a implementação de interfaces genéricas e comportamentos comuns a todos apps. Semelhante a AudioPolicyManager.cpp com mecanismo e conceitos comuns abstraídos.
/common Define classes de base (por exemplo, estruturas de dados para stream de áudio de entrada e saída) perfis, descritores de dispositivos de áudio, patches de áudio e portas de áudio). Anteriormente, isso era definidos em AudioPolicyManager.cpp.
/engine

implementa as regras que definem quais dispositivos e volumes devem ser usados em um determinado caso de uso. Ele implementa uma interface padrão com a parte genérica, como sobre como conseguir o dispositivo apropriado para um determinado caso de uso de reprodução ou captura, ou definem os dispositivos conectados ou um estado externo (ou seja, um estado de chamada de uso forçado) que pode alterar a decisão do trajeto.

Disponível em duas versões: configurável e padrão. Para mais informações sobre como selecionar a versão, consulte Configuração usando a estrutura de parâmetros.

/engineconfigurable Implementação do mecanismo de política que se baseia na estrutura de parâmetros (veja abaixo). A configuração é baseada na estrutura de parâmetros e no local em que a política é definidos por arquivos XML.
/enginedefault Implementação do mecanismo de política com base no Gerenciador de políticas de áudio do Android e implementações. Esse é o padrão e inclui regras codificadas que correspondem às implementações do Nexus e do AOSP.
/service Inclui interfaces de vinculação, linhas de execução e implementação de bloqueio com da interface para o restante do framework.

Configuração usando a estrutura de parâmetros

O código da política de áudio é organizado para facilitar o entendimento e manter e, ao mesmo tempo, oferecer suporte a uma política de áudio definida inteiramente pela configuração . O design da política de áudio e organização é baseado nos parâmetros da Intel Framework, um framework com base em plug-ins e regras para lidar com parâmetros.

O uso da política de áudio configurável permite que os OEMs dos fornecedores:

  • Descrever a estrutura e os parâmetros de um sistema em XML.
  • Escreva (em C++) ou reutilize um back-end (plug-in) para acessar o conteúdo parâmetros.
  • Defina (em XML ou em um idioma específico do domínio) condições/regras sobre as quais um determinado parâmetro deve ter um determinado valor.

O AOSP inclui um exemplo de arquivo de configuração de política de áudio que usa o parâmetro Framework em Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml. Para mais detalhes, consulte a documentação da Intel Estrutura de parâmetros.

No Android 10 ou versões anteriores, a política de áudio configurável é selecionado usando a opção de build USE_CONFIGURABLE_AUDIO_POLICY. No Android 11 ou mais recente, a versão da política de áudio está selecionado no arquivo audio_policy_configuration.xml. Para selecionar o mecanismo da política de áudio configurável, defina o valor de engine_library atributo do elemento globalConfiguration para configurable como no exemplo a seguir:

<audioPolicyConfiguration>
    <globalConfiguration engine_library="configurable" />
...
</audioPolicyConfiguration>

APIs de roteamento de política de áudio

O Android 6.0 introduziu uma API Enumeration and Selection pública localizada no da infraestrutura de patch/porta de áudio e permite que o app os desenvolvedores a indicar sua preferência por uma saída ou entrada específica do dispositivo gravações ou faixas de áudio conectadas.

No Android 7.0, a API Enumeration and Selection é verificada por testes CTS e é estendido para incluir o roteamento de streams de áudio C/C++ (OpenSL ES) nativos. O roteamento de streams nativos continua sendo feito em Java, com a adição de uma interface AudioRouting que substitui, combina e descontinua os métodos de roteamento explícitos que eram específicos dos métodos AudioTrack e AudioRecord.

Para mais detalhes sobre a API Enumeration e Selection, consulte No Android de configuração do Terraform e OpenSLES_AndroidConfiguration.h. Para detalhes sobre o roteamento de áudio, consulte AudioRoteamento.

Suporte a vários canais

Se o hardware e o driver forem compatíveis com áudio multicanal via HDMI, será possível envia o stream de áudio diretamente para o hardware de áudio (isso ignora a Mixer do AudioFlinger para que ele não seja reduzido a dois canais. A HAL de áudio precisa mostrar se um perfil de stream de saída oferece suporte a áudio multicanal. recursos. Se a HAL expor seus recursos, o gerenciador de políticas padrão permite a reprodução multicanal por HDMI. Para detalhes de implementação, consulte device/samsung/tuna/audio/audio_hw.c:

Para especificar que seu produto contém uma saída de áudio multicanal, edite as do arquivo de configuração da política de áudio para descrever a saída multicanal do seu produto. O exemplo a seguir frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml exibe uma máscara de canal dinâmica, o que significa que o gerenciador de políticas de áudio consulta o canal máscaras compatíveis com o coletor HDMI após a conexão.

Também é possível especificar uma máscara de canal estática, como AUDIO_CHANNEL_OUT_5POINT1: O mixer do AudioFlinger faz downmix conteúdo para estéreo automaticamente quando enviado a um dispositivo de áudio que não são compatíveis com áudio multicanal.

Codecs de mídia

Verifique se os codecs de áudio compatíveis com hardware e drivers estão corretos declaradas para seu produto. Para mais detalhes, consulte Como expor codecs ao Framework.