No Android 13 e versões anteriores, a interface da HAL de áudio é
definida usando HIDL em arquivos HAL de HIDL (com a
extensão .hal
) e
esquemas XSD para
os arquivos de configuração, conforme mostrado a seguir.
Figura 1. Interface HAL de áudio.
Arquivos de configuração
Os arquivos de configuração XML de políticas e efeitos de áudio são considerados parte da interface HAL de áudio HIDL. Esses arquivos precisam estar em conformidade com os esquemas, e a conformidade é verificada pelos testes do VTS.
Como parte da implementação do HAL de áudio HIDL, é necessário criar um
arquivo de configuração de política de áudio
que descreva a topologia de áudio. Os recursos da HAL de áudio precisam ser declarados no
arquivo audio_policy_configuration.xml
para que o framework os use.
API Audio HAL HIDL
Esta seção descreve as APIs Core, Effects e Common HAL para HIDL.
HAL principal
Algumas das principais interfaces do Core HAL, usando HIDL, são as seguintes:
IDeviceFactory.hal
é o ponto de entrada na API.IDevice.hal
eIPrimaryDevice.hal
contêm métodos comosetMasterVolume
ouopenInputStream
.- Os streams são unidirecionais e são usados pelo AudioFlinger para enviar ou receber
áudio do HAL e vice-versa usando
IStream.hal
,IStreamOut.hal
eIStreamIn.hal
.
A tabela a seguir lista o local de componentes úteis do Core HAL HIDL:
Componente principal do HAL | Local |
---|---|
Versão mais recente da API | /hardware/interfaces/audio/6.0
|
Tipos específicos da API Core HAL mais recente | /hardware/interfaces/audio/6.0/types.hal
|
Esquema XSD do arquivo de configuração de política de áudio | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
A implementação padrão da API Core HAL (/hardware/interfaces/audio/core/all-versions/default/
)
é um wrapper em torno da implementação HAL anterior ao Treble usando
bibliotecas compartilhadas legadas.
A implementação padrão também pode ser considerada como uma referência ao
implementar novas versões de HALs de áudio que interagem diretamente com os drivers do kernel.
HAL de efeitos
A tabela a seguir lista o local de componentes HAL de efeitos úteis usando HIDL:
Componente HAL de efeitos | Local |
---|---|
Versão mais recente da API | /hardware/interfaces/audio/effect/6.0/
|
Esquema XSD do arquivo de configuração do efeito | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
Para mais informações, consulte um exemplo de implementação da
API HAL de efeitos em /hardware/interfaces/audio/effect/all-versions/default/
e a seção Efeitos de áudio.
HAL comum
A API HAL comum que usa HIDL contém o seguinte:
- Definições (
/hardware/interfaces/audio/common/6.0/types.hal
) compartilhadas pelas APIs Core e Effect. - Utilitários (
/hardware/interfaces/audio/common/all-versions
) usados para ajudar a programar com APIs HIDL para implementações, clientes e testes.
Atualizações para a HAL de áudio V7
Há mudanças significativas na versão 7 da HAL de áudio no Android 12, conforme descrito nesta seção. A HAL de áudio V7 faz o seguinte:
- Unifica os modelos de dados usados pelo framework e pelo HAL.
- Minimiza a duplicação entre os tipos de dados (enums) do HIDL e o esquema XML usado para a configuração da política de áudio.
Especificamente, as mudanças foram feitas nas seguintes áreas da HAL de áudio V7:
- Tipos de enumeração
- Tipos de dados
- Tags do fornecedor
- Atribuição de namespace de extensões de fornecedores
Essas mudanças são discutidas com mais detalhes nas respectivas seções.
Enumerações
A partir da Audio HAL V7, os tipos enumerados usados no arquivo de configuração da política de áudio são definidos apenas no esquema XSD, e não na HIDL.
No Audio HAL V6, os valores dos tipos de enumeração (como AudioFormat
) em types.hal
também
são definidos no esquema XSD do arquivo de configuração da política de áudio, criando uma
duplicação. Para evitar isso na V7, os tipos de enumeração são alterados para string
e
todos os valores de enumeração possíveis são listados no esquema XSD.
A Figura 2 compara algumas das mudanças no tipo de enumeração AudioFormat
na V7:
Figura 2. Comparação de algumas das mudanças no tipo enumerado AudioFormat.
Consulte a lista a seguir para ver os tipos de enumeração que foram convertidos em
string
:
AudioChannelMask
AudioContentType
AudioDevice
: extensível pelo fornecedorAudioFormat
: extensível pelo fornecedorAudioGainMode
AudioSource
AudioStreamType
AudioUsage
Transmitir valores de tipo enumerado de string
Os valores de string são usados para transferir informações como valores de enumeração em todo o limite da interface HAL. O framework e o wrapper HAL usam valores de enumeração de números inteiros para implementar a lógica de negócios e empregam a abordagem de conversão mostrada na Figura 3:
Figura 3. Como transmitir valores de tipo enumerado de string.
Como exemplo, para transmitir um valor do tipo de formato de áudio do framework para o fabricante:
- O valor do tipo enumerado de
AudioFormat
é convertido em um valor de string emlibaudiohal
e é transmitido para o HAL. - No lado do HAL, o wrapper padrão converte a string em um valor de tipo enumerado, que é transmitido para o HAL legado.
Mudanças no esquema XML
Ter listas completas de valores de tipo enumerado na definição de esquema XML (XSD) permite uma melhor validação de arquivos XML de configuração de política de áudio pelo VTS. Fizemos mudanças no arquivo de configuração da política de áudio usado com o HAL V7 para obedecer ao XSD.
Na V7, um caractere ␣
(espaço) padrão é usado para delimitar listas de valores em
atributos (como taxas de amostragem, máscaras de canal e sinalizações), em vez dos símbolos ,
(vírgula) e |
(barra vertical) usados na V6 e versões anteriores. Como mostrado no
exemplo abaixo, um espaço é usado para delimitar a lista de valores de
channelMasks
:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Para fazer as mudanças no símbolo, use um script de conversão automática chamado
update_audio_policy_config.sh
. Consulte o comando a seguir para converter um arquivo de configuração de política de áudio
V6 em uma versão V7 para o dispositivo Pixel 5 (Redfin):
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
Tipos de dados
Redefinimos algumas estruturas de dados na V7 para minimizar definições duplicadas. Tuplas repetidas de itens de dados são agrupadas em estruturas reutilizáveis. Essas estruturas de dados usam os recursos mais recentes do HIDL, como uniões seguras.
Por exemplo, na V6 e versões anteriores, um triplo de <format, sampling rate, channel mask>
é usado com frequência nas interfaces e tipos HIDL. Para remover essa redundância, no
V7, o tipo de dados AudioConfigBase
e outros tipos de dados são definidos da seguinte maneira:
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
Usado por
AudioConfig
,AudioOffloadInfo
,AudioPortConfig
AudioProfile := <format, {sampling rates}, {channel masks}>
substitui coleções soltas em
AudioPort/PortConfig
AudioPortExtendedInfo := device | mix | session
substitui as uniões em
AudioPort/PortConfig
Tags do fornecedor
Além dos tipos e formatos de dispositivo, os fornecedores podem adicionar tags personalizadas para metadados de faixas de áudio.
Para metadados de reprodução e gravação de faixas, os fornecedores podem transmitir as próprias tags, que são usadas para adicionar atributos a streams de E/S de áudio, dos apps para o HAL.
As tags do fornecedor para metadados de faixa de reprodução são adicionadas conforme mostrado no exemplo a seguir:
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
A estrutura RecordTrackMetadata
é implementada de maneira semelhante,
adicionando tags específicas para os metadados da faixa de gravação.
Espaço de nomes das extensões de fornecedor
A partir do HAL V7, as extensões do fornecedor exigem um prefixo {vendor}
adicional
que não é necessário na V6. Para que o prefixo {vendor}
seja válido, ele precisa ter
três ou mais caracteres alfanuméricos.
Use o seguinte formato na V7:
VX_{vendor}_{letters/numbers}
Confira a seguir alguns exemplos de extensões de fornecedor V7 válidas:
VX_GOOGLE_VR
VX_QCI_AMBIENT_MIC
Informações da versão
A tabela a seguir lista o número da versão do HAL para cada versão do Android:
Versão do Android | Versão HAL do HIDL |
---|---|
Android 13 | 7.1 |
Android 12 | 7.0 |
Android 11 | 6.0 |
Android 10 | 5.0 |
Android 9 | 4.0 |
Android 8 | 2.0 |