No Android 13 e versões anteriores, a interface HAL de áudio é
definida usando HIDL em arquivos HIDL HAL (com a
extensão .hal) e
XSD esquemas para
os arquivos de configuração, conforme mostrado abaixo.
Figura 1. Interface HAL de áudio.
Arquivos de configuração
Os arquivos de configuração XML de política de áudio e efeitos de áudio são considerados parte da interface Audio HIDL HAL. Esses arquivos precisam estar em conformidade com os esquemas, e a conformidade é verificada por testes VTS.
Como parte da implementação da HAL de áudio HIDL, você precisa 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 HIDL HAL
Esta seção descreve as APIs Core, Effects e Common HAL para HIDL.
Core HAL
Confira algumas das principais interfaces da Core HAL, usando HIDL:
IDeviceFactory.halé o ponto de entrada na API.IDevice.haleIPrimaryDevice.halcontêm métodos comosetMasterVolumeouopenInputStream.- Os streams são unidirecionais e usados pelo AudioFlinger para enviar ou receber áudio para e da HAL por meio de
IStream.hal,IStreamOut.haleIStreamIn.hal.
A tabela a seguir lista o local dos componentes HIDL da Core HAL úteis:
| Componente Core 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 da 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 da implementação HAL pré-Treble usando
bibliotecas compartilhadas legadas.
A implementação padrão também pode ser considerada uma referência ao implementar novas versões de HALs de áudio que interagem diretamente com drivers de kernel.
Effects HAL
A tabela a seguir lista o local dos componentes Effects HAL úteis usando HIDL:
| Componente Effects HAL | Local |
|---|---|
| Versão mais recente da API | /hardware/interfaces/audio/effect/6.0/
|
| Esquema XSD do arquivo de configuração de efeito | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
Para mais informações, consulte um exemplo de implementação da
API Effects HAL em /hardware/interfaces/audio/effect/all-versions/default/ e a seção Efeitos de áudio.
Common HAL
A API Common HAL usando 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 na codificação em 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 pela HAL.
- Minimiza a duplicação entre os tipos de dados HIDL (enumerações) e o esquema XML usado para a configuração da política de áudio.
Especificamente, as mudanças são feitas nas seguintes áreas na HAL de áudio V7:
Essas mudanças são discutidas com mais detalhes nas respectivas seções.
Enumerações
A partir da HAL de áudio 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 no HIDL.
Na HAL de áudio V6, os valores de 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 na enumeração AudioFormat.
Consulte a lista a seguir para conferir os tipos de enumeração que foram convertidos em string:
AudioChannelMaskAudioContentTypeAudioDevice: extensível pelo fornecedorAudioFormat: extensível pelo fornecedorAudioGainModeAudioSourceAudioStreamTypeAudioUsage
Transmitir valores de enumeração de string
Os valores de string são usados para transferir informações como valores de enumeração no limite da interface HAL. O framework e o wrapper HAL usam valores de enumeração inteiros para implementar a lógica de negócios e empregam a abordagem de conversão mostrada na Figura 3:
Figura 3. Transmitir valores de enumeração de string.
Por exemplo, para transmitir um valor de tipo de formato de áudio do framework para o fornecedor:
- O valor de enumeração de
AudioFormaté convertido em um valor de string emlibaudiohale transmitido para a HAL. - No lado da HAL, o wrapper padrão converte a string em um valor de enumeração, que é transmitido para a HAL legada.
Mudanças no esquema XML
Ter listas completas de valores de enumeração na definição do esquema XML (XSD) permite uma melhor validação do arquivo XML de configuração da política de áudio pelo VTS. Fizemos mudanças no arquivo de configuração da política de áudio usado com a 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 flags), em vez dos símbolos , (vírgula) e | (barra vertical) usados na V6 e versões anteriores. Como mostrado no exemplo a seguir, 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 de 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 HIDL mais recentes, como uniões seguras.
Por exemplo, na V6 e versões anteriores, uma tupla de <format, sampling rate, channel mask>
é usada com frequência nas interfaces e tipos HIDL. Para remover essa redundância, na 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,AudioPortConfigAudioProfile := <format, {sampling rates}, {channel masks}>substitui coleções soltas em
AudioPort/PortConfigAudioPortExtendedInfo := device | mix | sessionsubstitui uniões em
AudioPort/PortConfig
Tags do fornecedor
Além dos tipos e formatos de dispositivos, os fornecedores podem adicionar tags personalizadas para metadados de faixa de áudio.
Para metadados de faixa de reprodução e gravação, 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 a 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.
Namespacing de extensões do fornecedor
A partir da 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 formato a seguir na V7:
VX_{vendor}_{letters/numbers}
Confira alguns exemplos de extensões de fornecedor V7 válidas:
VX_GOOGLE_VRVX_QCI_AMBIENT_MIC
Informações da versão
A tabela a seguir lista o número da versão HAL para cada versão do Android:
| Versão do Android | Versão HIDL HAL |
|---|---|
| Android 13 | 7.1 |
| Android 12 | 7.0 |
| Android 11 | 6.0 |
| Android 10 | 5.0 |
| Android 9 | 4.0 |
| Android 8 | 2.0 |