O Android 10 inclui uma refatoração significativa do gerenciador de políticas de áudio para oferecer mais flexibilidade ao suporte a casos de uso automotivos complexos:
- Estratégias de roteamento específicas do OEM.
- Grupos de volume personalizáveis para grupos de tipos de transmissão legados que usam as mesmas curvas de volume.
- Estratégias de roteamento declaradas pelo mecanismo de 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, além de 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íticas.
O Android 7.0 introduziu um formato de arquivo de configuração de política de áudio (XML) para descrevê-la.
As versões anteriores do Android exigiam o uso de
device/<company>/<device>/audio/audio_policy.conf
para declarar os dispositivos de áudio presentes no produto. Você pode conferir um exemplo desse arquivo para o hardware de áudio do Galaxy Nexus em
device/samsung/tuna/audio/audio_policy.conf
. No entanto, o CONF é um
formato simples e proprietário que é muito limitado para descrever topologias complexas para
verticais como televisões e automóveis.
O Android 7.0 suspendeu o uso de audio_policy.conf
e adicionou suporte
à definição de uma topologia de áudio usando um formato de arquivo XML que é mais
legível por humanos, tem 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
flag de build USE_XML_AUDIO_POLICY_CONF
para escolher o formato
XML dos arquivos de configuração.
Vantagens do formato XML
Assim como no arquivo CONF, o arquivo XML permite definir o número e os tipos de perfis de stream de saída e de entrada, dispositivos utilizáveis para reprodução e captura e atributos de áudio. Além disso, o formato XML oferece os seguintes aprimoramentos:
- No Android 10, mais de um app de gravação ativo é
permitido simultaneamente.
- A inicialização da gravação nunca é rejeitada devido a uma situação de simultaneidade.
- O callback
registerAudioRecordingCallback(AudioManager.AudioRecordingCallback cb)
notifica os clientes sobre 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 uma interface em primeiro plano.
- As funções especiais são reconhecidas pela política:
- Serviço de acessibilidade: pode gravar mesmo se um caso de uso que envolve privacidade estiver ativo.
- Assistente: considerado sensível à privacidade se a IU estiver na parte de cima.
- Um caso de uso sensível à privacidade (por exemplo,
- Os perfis de áudio têm uma estrutura semelhante aos descritores de áudio simples HDMI, permitindo um conjunto diferente 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 transmissões. Antes, uma regra implícita possibilitava a conexão de todos os dispositivos conectados ao mesmo módulo HAL, impedindo a política de áudio de controlar as conexões solicitadas com APIs de patch de áudio. No formato XML, a descrição da topologia define limitações de conexão.
- O suporte a includes evita a repetição de definições padrão de envio de A2DP, USB ou redirecionamento.
- As curvas de volume são personalizáveis. Antes, as tabelas de volume eram fixadas no código. No formato 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 de política de áudio simples no
formato de arquivo XML para o Android 12 e para as versões anteriores ao
Android 12.
Mostrar exemplo de política de áudio para o Android 12
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <audioPolicyConfiguration version="7.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <globalConfiguration speaker_drc_enabled="true"/> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>Speaker</item> <item>Earpiece</item> <item>Built-In Mic</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="primary input" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address=""> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000 16000 48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> </devicePorts> <routes> <route type="mix" sink="Earpiece" sources="primary output"/> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Wired Headset" sources="primary output"/> <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/> </routes> </module> <xi:include href="a2dp_audio_policy_configuration.xml"/> </modules> <xi:include href="audio_policy_volumes.xml"/> <xi:include href="default_volume_tables.xml"/> </audioPolicyConfiguration>
Mostrar exemplo de política de áudio para versões anteriores ao Android 12
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <globalConfiguration speaker_drc_enabled="true"/> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>Speaker</item> <item>Earpiece</item> <item>Built-In Mic</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="primary input" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address=""> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </devicePort> <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/> </devicePort> </devicePorts> <routes> <route type="mix" sink="Earpiece" sources="primary output"/> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Wired Headset" sources="primary output"/> <route type="mix" sink="primary input" sources="Built-In Mic,Wired Headset Mic"/> </routes> </module> <xi:include href="a2dp_audio_policy_configuration.xml"/> </modules> <xi:include href="audio_policy_volumes.xml"/> <xi:include href="default_volume_tables.xml"/> </audioPolicyConfiguration>
A estrutura de nível superior contém módulos que correspondem a cada módulo de hardware HAL de áudio, em que cada módulo tem uma lista de portas de mixagem, portas de dispositivo e rotas:
- As portas de mixagem descrevem os possíveis perfis de configuração para streams que podem ser abertos no HAL de áudio para reprodução e captura.
- As portas de dispositivo descrevem os dispositivos que podem ser conectados com o tipo deles (e, opcionalmente, endereço e propriedades de áudio, se relevantes).
- Routes é separado do descritor de porta de mixagem, permitindo a descrição de rotas de dispositivo para dispositivo ou de streaming para dispositivo.
As tabelas de volume são listas simples de pontos que definem a curva usada para converter de um índice da interface em um volume em dB. Um arquivo de inclusão separado fornece curvas padrão, mas cada curva para um determinado caso de uso e categoria de dispositivo pode ser substituída.
Mostrar exemplo de tabela de volumes
<?xml version="1.0" encoding="UTF-8"?> <volumes> <reference name="FULL_SCALE_VOLUME_CURVE"> <point>0,0</point> <point>100,0</point> </reference> <reference name="SILENT_VOLUME_CURVE"> <point>0,-9600</point> <point>100,-9600</point> </reference> <reference name="DEFAULT_VOLUME_CURVE"> <point>1,-4950</point> <point>33,-3350</point> <point>66,-1700</point> <point>100,0</point> </reference> </volumes>
Exemplo de exibição de volumes
<?xml version="1.0" encoding="UTF-8"?> <volumes> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_VOICE_CALL" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_SYSTEM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_RING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA"ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_SPEAKER"> <point>1,-5500</point> <point>20,-4300</point> <point>86,-1200</point> <point>100,0</point> </volume> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_MUSIC" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ALARM" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_NOTIFICATION" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_BLUETOOTH_SCO" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ENFORCED_AUDIBLE" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_DTMF" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_TTS" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="SILENT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_ACCESSIBILITY" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_REROUTING" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_HEADSET" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EARPIECE" ref="FULL_SCALE_VOLUME_CURVE"/> <volume stream="AUDIO_STREAM_PATCH" deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="FULL_SCALE_VOLUME_CURVE"/> </volumes>
Inclusões de arquivos
O método de inclusões de XML (XInclude) pode ser usado para incluir informações de configuração de política de áudio localizadas em outros arquivos XML. Todos os arquivos incluídos precisam seguir 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 includes para evitar copiar informações de configurações de módulo HAL de áudio do Android Open Source Project (AOSP) padrão para todos os arquivos de configuração de política de áudio, que são propensos a erros. Um arquivo XML de configuração de política de áudio padrão é fornecido para os 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 de
frameworks/av/services/audiopolicy
inclui os
módulos a seguir.
Módulo | Descrição |
---|---|
/managerdefault |
Inclui a implementação de interfaces genéricas e comportamentos comuns a todos os
apps. Semelhante a AudioPolicyManager.cpp com a funcionalidade
do mecanismo e conceitos comuns abstraídos. |
/common |
Define classes básicas (por exemplo, estruturas de dados para perfis de stream de áudio de entrada e saída,
descriptores de dispositivos de áudio, patches de áudio e portas de áudio). Isso foi definido anteriormente
dentro de AudioPolicyManager.cpp . |
/engine |
Implementa as regras que definem quais dispositivos e volumes devem ser usados para um determinado caso de uso. Ele implementa uma interface padrão com a parte genérica, como para conseguir o dispositivo apropriado para um determinado caso de uso de reprodução ou captura ou para definir dispositivos conectados ou estado externo (ou seja, um estado de chamada de uso forçado) que pode alterar a decisão de roteamento. Disponível em duas versões: configurável e padrão. Para saber como selecionar a versão, consulte Configuração usando o parâmetro Framework. |
/engineconfigurable |
Implementação do mecanismo de políticas que depende do parâmetro framework (confira abaixo). A configuração é baseada no framework de parâmetros e onde a política é definida por arquivos XML. |
/enginedefault |
Implementação do mecanismo de política com base em implementações anteriores do Gerenciador de Políticas de Áudio do Android. Esse é o padrão e inclui regras fixadas 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 a interface para o restante do framework. |
Configuração usando o framework de parâmetro
O código de política de áudio é organizado para facilitar o entendimento e a manutenção, além de oferecer suporte a uma política de áudio definida inteiramente por arquivos de configuração. O design da organização e da política de áudio é baseado no Framework de Parâmetros da Intel, um framework baseado em plug-ins e regras para processar 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 os parâmetros descritos.
- Defina (em XML ou em uma linguagem específica do domínio) as condições/regras em que um determinado parâmetro precisa ter um determinado valor.
O AOSP inclui um exemplo de um arquivo de configuração de política de áudio que usa o Framework
de parâmetros em Frameworks/av/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/PolicyConfigurableDomains.xml
. Para
mais detalhes, consulte a documentação da Intel sobre o
Parameter Framework.
No Android 10 ou versões anteriores, a política de áudio configurável
é selecionada usando a opção de build USE_CONFIGURABLE_AUDIO_POLICY
.
No Android 11 ou mais recente, a versão do mecanismo de política
de áudio é selecionada no arquivo audio_policy_configuration.xml
.
Para selecionar o mecanismo da política de áudio configurável, defina o valor do atributo engine_library
do elemento globalConfiguration
como 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 de enumeração e seleção pública que fica acima da infraestrutura de patch/porta de áudio e permite que os desenvolvedores de apps indiquem uma preferência para uma saída ou entrada de dispositivo específica para registros ou faixas de áudio conectados.
No Android 7.0, a API Enumeration and Selection é verificada pelos testes do CTS e é estendida 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 para as classes AudioTrack
e
AudioRecord
.
Para ver detalhes sobre a API Enumeration and Selection, consulte
Interfaces de configuração
do Android e OpenSLES_AndroidConfiguration.h
.
Para detalhes sobre o roteamento de áudio, consulte
AudioRouting.
Suporte a vários canais
Se o hardware e o driver oferecerem suporte a áudio multicanal via HDMI, você vai poder
enviar o stream de áudio diretamente para o hardware de áudio. Isso vai ignorar o
mixer do AudioFlinger para que ele não seja reduzido para dois canais. A HAL de áudio
precisa expor se um perfil de stream de saída oferece suporte a recursos de áudio
multicanal. Se o HAL expor os recursos, o gerenciador de políticas padrão
permitirá a reprodução multicanal por HDMI. Para detalhes de implementação, consulte
device/samsung/tuna/audio/audio_hw.c
.
Para especificar que o produto tem uma saída de áudio multicanal, edite o
arquivo de configuração da política de áudio para descrever a saída multicanal do
produto. O exemplo a seguir de
frameworks/av/services/audiopolicy/config/primary_audio_policy_configuration_tv.xml
mostra uma máscara de canal dinâmica, o que significa que o gerenciador de políticas de áudio consulta as máscaras
de canal aceitas pelo sink HDMI após a conexão.
Mostrar exemplo de configuração de dispositivo HDMI
<module name="primary" halVersion="2.0"> <attachedDevices> <item>Speaker</item> </attachedDevices> <defaultOutputDevice>Speaker</defaultOutputDevice> <mixPorts> <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> <mixPort name="direct" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT" /> <mixPort name="tunnel" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_HW_AV_SYNC" /> </mixPorts> <devicePorts> <devicePort tagName="Speaker" type="AUDIO_DEVICE_OUT_SPEAKER" role="sink" /> <devicePort tagName="Out Aux Digital" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink" encodedFormats="AUDIO_FORMAT_AC3 AUDIO_FORMAT_IEC61937" /> </devicePorts> <routes> <route type="mix" sink="Speaker" sources="primary output"/> <route type="mix" sink="Out Aux Digital" sources="primary output,direct,tunnel"/> </routes> </module>
Também é possível especificar uma máscara de canal estática, como
AUDIO_CHANNEL_OUT_5POINT1
. O mixer do AudioFlinger faz o downmix do
conteúdo para estéreo automaticamente quando enviado a um dispositivo de áudio que não
oferece suporte ao áudio multicanal.
Codecs de mídia
Verifique se os codecs de áudio compatíveis com hardware e drivers foram declarados corretamente para o produto. Para mais detalhes, consulte Exposição de codecs ao framework.