O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Áudio HAL

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

A camada de abstração de hardware de áudio (HAL) do Android conecta as APIs de estrutura específicas de áudio de nível superior em android.media aos drivers de áudio e hardware subjacentes. O Audio HAL define a interface padrão para a qual os serviços de áudio chamam. Ele deve ser implementado para que o hardware de áudio funcione corretamente.

Esta página fornece uma visão geral do áudio HAL e fornece detalhes de sua API e requisitos de implementação.

Interface de áudio HAL

A interface de áudio HAL é definida usando HIDL em arquivos .hal e esquemas XSD para os arquivos de configuração, mostrados a seguir.

audio_hal

Figura 1. Interface de áudio HAL

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 HAL. Esses arquivos devem estar em conformidade com seus esquemas e a conformidade é verificada por testes VTS.

Como parte da implementação do HAL de áudio, você deve criar um arquivo de configuração de política de áudio que descreva a topologia de áudio. Os recursos de HAL de áudio devem ser declarados no arquivo audio_policy_configuration.xml para que a estrutura os use.

API HAL de áudio

O HAL de áudio contém as seguintes APIs:

  • Núcleo HAL
  • Efeitos HAL
  • HAL Comum

Cada uma dessas APIs é descrita nas seções a seguir.

Núcleo HAL

O Core HAL é a API principal usada pelo AudioFlinger para reproduzir áudio e controlar o roteamento de áudio. Algumas das principais interfaces são as seguintes:

  • IDeviceFactory.hal é o ponto de entrada na API.
  • IDevice.hal e IPrimaryDevice.hal contêm métodos como setMasterVolume ou openInputStream .
  • Os fluxos são unidirecionais e são usados ​​pelo AudioFlinger para enviar ou receber áudio de e para o HAL por meio de IStream.hal , IStreamOut.hal e IStreamIn.hal .

A tabela a seguir lista a localização dos componentes úteis do Core HAL.

Componente principal HAL Localização
Versão mais recente da API /hardware/interfaces/audio/6.0
Tipos específicos para a 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 em torno da implementação pré-Treble HAL usando bibliotecas compartilhadas herdadas . 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 os drivers do kernel.

Efeitos HAL

A API Effects HAL é usada pela estrutura de efeitos para controlar os efeitos de áudio. Você também pode configurar efeitos de pré -processamento, como controle automático de ganho e supressão de ruído por meio da API Effects HAL.

A tabela a seguir lista a localização dos componentes úteis do Effects HAL.

Componente de efeitos HAL Localização
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 obter mais informações, consulte um exemplo de implementação da API Effects HAL ( /hardware/interfaces/audio/effect/all-versions/default/ ) e a seção de efeitos de áudio .

HAL Comum

O Common HAL é uma biblioteca de tipos de dados comuns usados ​​pelas APIs Core e Effects HAL. Não possui interfaces nem testes VTS associados, pois apenas define estruturas de dados. A API HAL comum 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 codificar contra APIs HIDL para implementações, clientes e testes

Requisitos

Além de implementar o HAL de áudio e criar o arquivo de configuração da política de áudio, os seguintes requisitos do HAL devem ser atendidos:

  • Se a captura para o Sound Trigger (captura do hotword DSP buffer) for suportada por um perfil de entrada, a implementação deve suportar o número de fluxos ativos neste perfil correspondente ao número de sessões simultâneas suportadas pelo Sound Trigger HAL.
  • Simultaneidade de TX de chamada de voz e captura do processador do aplicativo, conforme detalhado na página Captura simultânea .

Atualizações para o Audio HAL V7

Para resolver problemas de compatibilidade com versões anteriores, o Stable AIDL é obrigatório para todas as alterações de HAL a partir do Android 13. Para oferecer suporte e aprimorar a adoção de AIDL no Android 13 e superior, o Audio HAL V7 faz o seguinte:

  • Unifica os modelos de dados usados ​​pela estrutura e HAL.
  • Minimiza a duplicação entre tipos de dados HIDL (enums) e o esquema XML usado para configuração de política de áudio.

Especificamente, as alterações são feitas nas seguintes áreas no áudio HAL V7:

Essas mudanças são discutidas com mais detalhes em suas respectivas seções.

Enumerações

A partir do Audio HAL V7, os tipos enumerados usados ​​no arquivo Audio Policy Configuration são definidos apenas no esquema XSD e não no HIDL.

No áudio HAL V6, os valores de tipos de enum (como AudioFormat ) em types.hal também são definidos no esquema XSD do arquivo de configuração de 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.

Consulte a Figura 2 para obter uma comparação de algumas das alterações no tipo de enumeração AudioFormat na V7.

audioformat-change

Figura 2. Comparação de algumas das mudanças na enumeração AudioFormat

Consulte a lista a seguir para os tipos de enumeração que foram convertidos em String :

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : extensível pelo fornecedor
  • AudioFormat : extensível pelo fornecedor
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

Passar valores de enumeração de string

Os valores de string são usados ​​para transferir informações como valores de enumeração através do limite da interface HAL. Tanto a estrutura quanto o wrapper HAL usam valores inteiros de enumeração para implementar a lógica de negócios e empregam a abordagem de conversão descrita na figura 3 .

audio-passing-values

Figura 3. Passando valores de enumeração de string

Por exemplo, para passar um valor de tipo de formato de áudio do framework para o fornecedor:

  1. O valor enum de AudioFormat é convertido em um valor de string em libaudiohal e é passado para o HAL.
  2. No lado HAL, o wrapper padrão converte a string em um valor enum, que é passado para o HAL herdado.

Alterações no esquema XML

Ter listas completas de valores de enumeração na definição de esquema XML (XSD) permite uma melhor validação de arquivo XML de configuração de política de áudio pelo VTS. As alterações são feitas no arquivo de configuração de política de áudio usado com HAL V7 para estar em conformidade com XSD.

No V7, um caractere (espaço) padrão é usado para delimitar listas de valores em atributos (como taxas de amostragem, máscaras de canal e sinalizadores), em vez de , (vírgula) e | (barra vertical) símbolos usados ​​na V6 e abaixo. Conforme visto no exemplo a seguir, um espaço é usado para delimitar a lista de valores para channelMasks :

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

Para fazer as alterações de símbolo, use um script de conversão automática chamado update_audio_policy_config.sh . Consulte o seguinte comando 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

Algumas estruturas de dados são redefinidas 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, no V6 e abaixo, um triplo de <format, sampling rate, channel mask> é usado frequentemente 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 forma:

  • 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 uniões em AudioPort/PortConfig

Etiquetas do fornecedor

Além dos tipos e formatos de dispositivos, os fornecedores podem adicionar tags personalizadas para metadados de faixas de áudio.

Para metadados de faixa de reprodução e gravação, os fornecedores podem passar suas próprias tags, que são usadas para adicionar atributos a fluxos de E/S de áudio, dos aplicativos para o HAL.

As tags do fornecedor para metadados da faixa de reprodução são adicionadas conforme o 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.

Namespace das extensões do fornecedor

A partir do HAL V7, as extensões do fornecedor exigem um prefixo {vendor} adicional que não é necessário no V6. Para que o prefixo {vendor} seja válido, ele deve ter três ou mais caracteres alfanuméricos.

Use o seguinte formato na V7:

VX_{ vendor }_{ letters/numbers }

A seguir estão alguns exemplos de extensões de fornecedor V7 válidas:

  • VX_ GOOGLE _VR
  • VX_ QCI _AMBIENT_MIC

Versão informaçã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 HAL
Androide 13 7.1
Androide 12 7,0
Android 11 6.0
Android 10 5,0
Android 9 4.0
Android 8 2.0