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

Áudio HAL

Hardware de áudio Camada de Abstração do Android (HAL) conecta os de nível superior, APIs quadro específicos de áudio em android.media para os drivers de áudio subjacentes e hardware. O HAL de áudio define a interface padrão para a qual os serviços de áudio chamam. Deve ser implementado para que o hardware de áudio funcione corretamente.

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

Interface de áudio HAL

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

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 HAL de áudio. 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 política de áudio que descreve a topologia de áudio. Capacidades de áudio HAL deve ser declarado na audio_policy_configuration.xml arquivo para o quadro de usá-los.

API HAL de áudio

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

  • HAL central
  • Efeitos HAL
  • HAL comum

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

HAL central

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

  • IDeviceFactory.hal é o ponto de entrada na API.
  • IDevice.hal e IPrimaryDevice.hal conter métodos tais como setMasterVolume ou openInputStream .
  • Fluxos são unidirecionais e são usados por AudioFlinger para enviar ou receber áudio de e para o HAL através IStream.hal , IStreamOut.hal e IStreamIn.hal .

A tabela a seguir lista a localização de componentes úteis do Core HAL:

Componente HAL principal 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 de política de áudio /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

A implementação padrão da API Núcleo HAL ( /hardware/interfaces/audio/core/all-versions/default/ ) é um invólucro em torno implementação pré-Treble HAL usando bibliotecas legado compartilhado . 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.

Efeitos HAL

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

A tabela a seguir lista a localização de componentes úteis do Effects HAL:

Componente HAL de efeitos 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 mais informações, veja um exemplo de implementação da API Effects ( /hardware/interfaces/audio/effect/all-versions/default/ ) ea Efeitos de Áudio seção.

HAL comum

O HAL comum é uma biblioteca de tipos de dados comuns usados ​​pelas APIs HAL Core e Effects. Ele não tem interfaces e nenhum teste VTS associado, pois ele apenas define estruturas de dados. A API HAL comum contém o seguinte:

  • Definições ( /hardware/interfaces/audio/common/6.0/types.hal ) compartilhada pela Core e APIs efeito.
  • Utilities ( /hardware/interfaces/audio/common/all-versions ) usado para ajudar a codificação 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 de HAL devem ser cumpridos:

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

Atualizações para o Áudio 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 T. Para oferecer suporte e aprimorar a adoção de AIDL no Android T e superior, o Audio HAL V7 faz o seguinte:

  • Unifica os modelos de dados usados ​​pela estrutura e HAL.
  • Minimiza a duplicação entre os tipos de dados HIDL (enums) e o esquema XML usado para a configuração da 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.

Em áudio HAL V6, valores de enum tipos (como AudioFormat ) em types.hal também são definidos na configuração política esquema de arquivo XSD áudio, criando uma duplicação. Para evitar isso na V7, os enum tipos são alterados para string e todos os valores de enumeração possíveis estão listados no esquema XSD vez.

Veja a figura 1 para uma comparação de algumas das alterações para o AudioFormat enum digite V7:

audioformat-change

Figura 1: Comparação de algumas das alterações à AudioFormat enum

Consulte a lista a seguir para os enum tipos que foram convertidos para String :

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

Passando String valores enum

Valores de string são usados ​​para transferir informações como valores de enumeração através do limite da interface HAL. Tanto o quadro eo HAL invólucro valores enum uso inteiros para a implementação de lógica de negócios e empregam a abordagem de conversão representado na figura 2 .

audio-passing-values

Figura 2: Passar string enum valores

Por exemplo, para passar um valor de tipo de formato de áudio da estrutura para o fornecedor:

  1. A enum valor de AudioFormat é convertida para uma string valor em libaudiohal e é passado para o HAL.
  2. No lado do HAL, o default wrapper converte a string a um enum valor que é passado para o HAL legado.

Mudanças no esquema XML

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

Na V7, um padrão caracteres (espaço) é usado para listas de valores delimitar em atributos (como taxas de amostragem, máscaras de canais e bandeiras), em vez de a , (vírgula) e | (barra vertical) símbolos usados ​​em V6 e abaixo. Como 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 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 no V7 para minimizar definições duplicadas. As 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, em V6 e abaixo, um triplo de <format, sampling rate, channel mask> é frequentemente utilizado nas interfaces HIDL e tipos. Para remover esta redundância, em V7, o AudioConfigBase tipo de dados e outros tipos de dados são definidos como se segue:

  • AudioConfigBase := <format, sampling rate, channel mask>

  • AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>

    utilizado por AudioConfig , AudioOffloadInfo , AudioPortConfig

  • AudioProfile := <format, {sampling rates}, {channel masks}>

    substitui coleções soltos na AudioPort/PortConfig

  • AudioPortExtendedInfo := device | mix | session

    substitui uniões em AudioPort/PortConfig

Etiquetas de fornecedor

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

Para reproduzir e gravar metadados de trilha, 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.

Tags de fornecedor para metadados de faixa de reprodução são adicionadas conforme visto no exemplo a seguir:

struct PlaybackTrackMetadata {
…
    /** Tags from AudioTrack audio attributes */
    vec<AudioTag> tags;
};

O RecordTrackMetadata estrutura é implementado de forma semelhante, adicionando tags específicas para os metadados faixa de gravação.

Espaçamento de nomes de extensões de fornecedores

A partir de HAL V7, extensões vendedor exigem um adicional de {vendor} prefixo que não é necessária em V6. Para o {vendor} prefixo para ser válido, deve ser três ou mais caracteres alfanuméricos.

Use o seguinte formato no V7:

VX_ {vendor} _ {letras / números / _}

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 Android Versão HAL
Android 12 7,0
Android 11 6,0
Android 10 5.0
Android 9 4,0
Android 8 2.0