Comparação entre a HAL de áudio AIDL e HIDL

A partir do Android 14, recomendamos que parceiros e fornecedores de SoC substituam a implementação atual da HAL de HIDL por uma implementação da HAL de AIDL.

Para facilitar a transição da HAL de áudio HIDL para uma HAL de áudio AIDL, algumas das principais diferenças são destacadas nesta página. Esta página também mostra o mapeamento entre as interfaces AIDL e HIDL para a HAL de áudio.

Diferença entre a implementação da HAL de áudio AIDL e HIDL

As principais diferenças entre a estrutura HIDL e a AIDL são as seguintes:

  • Na HAL de núcleo de áudio AIDL, a interface IConfig é introduzida como uma substituição para os parâmetros do sistema em arquivos XML na HAL de HIDL. O framework lê esses parâmetros do HAL principal em vez do arquivo de configuração do fornecedor. Por exemplo, a lista de formatos surround que são exibidos para o controle do usuário é fornecida pelo método IConfig.getSurroundSoundConfig no HAL principal.

    Na HAL de efeitos de áudio AIDL, a lógica effectProxy definida em arquivos XML na HAL de efeitos HIDL é movida para o framework de áudio. O framework de áudio consulta todas as instâncias de efeito no sistema usando IFactory.queryEffects e todos os processamentos de efeito usando IFactory.queryProcessing.

  • Para evitar confusão com o uso do termo dispositivo para tipos de dispositivos de áudio, IDevice na HAL de áudio HIDL foi renomeado para IModule na HAL de áudio AIDL.

  • IPrimaryDevice foi substituído na HAL de áudio AIDL. As atualizações sobre o modo de áudio atual e a rotação da tela são enviadas para cada instância de IModule. Os parâmetros relacionados à conexão síncrona do Bluetooth (BT SCO) e ao perfil viva-voz (HFP) são processados por uma interface IBluetooth dedicada. Uma interface ITelephony dedicada oferece controles específicos de telefonia. As instâncias de ambas as interfaces podem ser recuperadas da instância principal da interface IModule. Consulte as tabelas de comparação em HAL principal e Funcionalidade relacionada ao recurso para mais informações.

  • O IDevicesFactory foi removido na HAL de áudio AIDL para evitar redundância. Os módulos da HAL, ou seja, instâncias de interface IModule, agora são registrados diretamente com o gerenciador de serviços usando os nomes deles para nomes de instâncias, como bluetooth ou r_submix. A única exceção é o módulo primary, que é registrado com o nome da instância default.

Mapeamento da HAL de áudio AIDL e HIDL

As tabelas nas seções abaixo mostram o mapeamento entre as interfaces HAL de áudio HIDL e AIDL. Consulte o arquivo README do HAL de áudio para mais informações sobre a estrutura do diretório.

HAL principal

Todas as interfaces HIDL estão no pacote android.hardware.audio@N.M, em que N.M denota a versão Major.Minor. Todas as interfaces da AIDL estão no pacote android.hardware.audio.core.

Interfaces e arquivos de configuração da API HIDL Interfaces da API AIDL
IDevicesFactory Registro de IModule com ServiceManager.
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
Arquivos de política de áudio configuráveis Use a implementação HIDL para o Android 14.

Portas de áudio, perfis dinâmicos, rotas e patches

Nesta tabela, os elementos de arquivos XML são designados usando colchetes.

Métodos de interface da API HIDL e elementos de arquivos de configuração Métodos de interface da API AIDL
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts>
IModule.getAudioPorts
IDevice.getAudioPort
IDevice.setConnectedState
IModule.getAudioPort
IModule.connectExternalDevice
IModule.disconnectExternalDevice
IStream.getSupportedProfiles IModule.connectExternalDevice
<routes> IModule.getAudioRoutes
IDevice.createAudioPatch
IDevice.updateAudioPatch
IDevice.releaseAudioPatch
IStream.getDevices
IStream.setDevices
Especificação do dispositivo em IDevice.openInputStream
IDevice.openOutputStream
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch

Streams e configurações de porta de áudio

Métodos de interface da API HIDL Métodos de interface da API AIDL
IStream.getAudioProperties
IStream.setAudioProperties
IStreamIn.getAudioSource
IModule.getAudioPortConfigs
IModule.setAudioPortConfig
IDevice.openInputStream
IDevice.openOutputStream
IStreamIn.prepareForReading
IStreamOut.prepareForWriting
IStream.createMmapBuffer
IModule.openInputStream
IModule.openOutputStream
IStream.close IStreamCommon.close
IStreamIn.updateSinkMetadata
IStreamOut.updateSourceMetadata
IStreamIn.updateMetadata
IStreamOut.updateMetadata
IStream.standby StreamDescriptor.Command.standby
IStream.pause
IStream.resume
IStream.start
IStream.stop
StreamDescriptor.Command.pause
.start
.start
.drain
IStreamOut.drain
IStreamOut.flush
StreamDescriptor.Command.drain
.flush
IStreamOut.setCallback
IStreamOut.clearCallback
IModule.openOutputStream
IStreamCommon.close
IStreamOut.getPresentationPosition e IStreamIn.getCapturePosition
IStreamOut.getLatency
IStream.getMmapPosition
IStreamIn.getInputFramesLost
StreamDescriptor.Reply.observable
StreamDescriptor.Reply.latencyMs
StreamDescriptor.Reply.hardware
StreamDescriptor.Reply.xrunFrames
IDevice.getInputBufferSize
IStreamOut.getLatency
IStream.getBufferSize
IStream.getFrameSize
IStream.getFrameCount
IModule.setAudioPatch, latência nominal e tamanho mínimo do buffer fazem parte da estrutura AudioPatch retornada pelo HAL. O tamanho real do buffer em frames faz parte da estrutura StreamDescriptor, junto com o tamanho do frame em bytes. O tamanho do buffer em bytes pode ser calculado multiplicando esses dois números.

Conexão de efeitos sonoros

Métodos de interface da API HIDL Métodos de interface da API AIDL
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

Configuração do sistema

A configuração do sistema que foi definida anteriormente em arquivos de configuração XML de política de áudio (ou seja, audio_policy_configuration.xml e audio_policy_engine_configuration.xml) precisa ser fornecida por IConfig. No entanto, para facilitar a transição para AIDL, os fornecedores ainda têm a opção de usar os mesmos arquivos XML que usavam anteriormente para definir a configuração do sistema. A implementação de referência para IConfig contém o código necessário para representar informações do arquivo XML usando tipos de dados AIDL, o que facilita a conversão de XML para AIDL.

Elementos do arquivo de configuração de HIDL Métodos de interface da API AIDL
<globalConfiguration>
<speaker_drc_enabled>1

<call_screen_mode_supported>
<engine_library>
Separados em dois métodos diferentes:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> OU
<volumeGroups>, <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. O speaker_drc_enabled é removido do arquivo de configuração porque esse item de configuração não é usado no sistema. Todos os dispositivos precisam ter DRC ativado. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

Funcionalidade relacionada ao recurso

Métodos de interface da API HIDL Interface da API AIDL
IDevice.setMasterVolume
IDevice.getMasterVolume
IDevice.setMicMute
IDevice.getMicMute
IDevice.setMasterMute
IDevice.getMasterMute
IModule.\*
IPrimaryDevice.getTtyMode
IPrimaryDevice.setTtyMode
IPrimaryDevice.getHacEnabled
IPrimaryDevice.setHacEnabled
IPrimaryDevice.setVoiceVolume
ITelephony.TelecomConfig.\*
IPrimaryDevice.setBtScoHeadsetDebugName
IPrimaryDevice.getBtScoNrecEnabled
IPrimaryDevice.setBtScoNrecEnabled
IPrimaryDevice.getBtScoWidebandEnabled
IPrimaryDevice.setBtScoWidebandEnabled,
IPrimaryDevice.getBtHfpEnabled
IPrimaryDevice.setBtHfpEnabled
IPrimaryDevice.setBtHfpSampleRate
IPrimaryDevice.setBtHfpVolume
IBluetooth.ScoConfig.\*
IBluetooth.HfpConfig.\*
IPrimaryDevice.setMode
IPrimaryDevice.updateRotation
ITelephony.switchAudioMode
IModule.updateAudioMode
IModule.updateScreenRotation
IDevice.setScreenState
IDevice.getMicrophones
IModule.updateScreenState
IModule.getMicrophones
IDevice.getHwAvSync
IStream.setHwAvSync
IModule.generateHwAvSyncId
IStreamCommon.updateHwAvSyncId
IStreamIn.setGain
IStreamIn.setMicrophoneDirection
IStreamIn.setMicrophoneFieldDimension
IStreamIn.setHwGain
IStreamIn.setMicrophoneDirection
IStreamIn.setMicrophoneFieldDimension
IStreamOut.getDualMonoMode
IStreamOut.setDualMonoMode
IStreamOut.getPlaybackRateParameters
IStreamOut.setPlaybackRateParameters
IStreamOut.selectPresentation
IStreamOut.getAudioDescriptionMixLevel
IStreamOut.setAudioDescriptionMixLevel
IStreamOut.setLatencyMode
IStreamOut.getRecommendedLatencyModes
IStreamOut.\*
IStreamOut.setEventCallback
IStreamOut.setLatencyModeCallback
IModule.openOutputStream (os callbacks são combinados em IStreamOutEventCallback)
IDevice.get/setParameters
IStream.get/setParameters
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters

Métodos obsoletos

Métodos de interface da API HIDL Comentários
IDevice.initCheck
IDevice.close
O módulo HAL se publica com o ServiceManager somente quando a inicialização é bem-sucedida. Nesse ponto, ela é considerada permanente e não pode ser encerrada.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
O suporte a patches, pausa, retomada e esgotamento é obrigatório.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Obsoleto.

Extensões do fornecedor

Na API HIDL, as extensões do fornecedor são implementadas usando os métodos getParameters ou setParameters das interfaces IDevice e IStream. Esses métodos aceitam strings arbitrárias. Na API AIDL, há métodos correspondentes, como getVendorParameters ou setVendorParameters, que usam instâncias Parcelable arbitrárias usando encapsulamento no ParcelableHolders.

Outras mudanças

Outras mudanças gerais são as seguintes:

  1. Para melhorar a capacidade de teste das APIs da HAL, na versão AIDL, introduzimos opções de depuração usadas por testes VTS e disponíveis no parcelable ModuleDebug. Essas opções instruem o HAL a emular determinadas funcionalidades (por exemplo, conexão de dispositivos externos), que, de outra forma, exigem intervenção manual e o uso de equipamentos de teste externos.

  2. Os serviços HAL precisam ser reiniciados quando o valor da propriedade do sistema sys.audio.restart.hal é definido como 1. O reinício é feito pelo audioserver.rc. Ao implementar a HAL, use o nome de serviço da HAL apropriado listado no arquivo audioserver.rc. No Android 14, o nome vendor.audio-hal-aidl é adicionado especificamente para a versão AIDL da HAL.

HAL de efeitos

Todas as interfaces HIDL estão no pacote android.hardware.audio.effect@N.M*, em que N.M é a versão Major.Minor. Todas as interfaces AIDL estão no pacote android.hardware.audio.effect.

Interfaces e arquivos de configuração da API HIDL Interfaces da API AIDL
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

Effect Factory

Interfaces de API HIDL
(android.hardware.audio.effect@X.X)
Interfaces da API AIDL
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors IFactory.queryEffects com parâmetro UUID nulo
IEffectsFactory.getDescriptor IFactory.queryEffects com parâmetro UUID
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

Interfaces de efeito

Interfaces da API HIDL
(android.hardware.audio.Effect@X.X)
Interfaces da API AIDL
(android.hardware.audio.effect)
IEffect.init IEffect.open
IEffect.setConfig IEffect.setParameter
IEffect.enable IEffect.command(CommandId::START)
IEffect.disable IEffect.command(CommandId::STOP)
IEffect.reset IEffect.command(CommandId::RESET)
IEffect.getDescriptor IEffect.getDescriptor
IEffect.command Mapear para IEffect.command,
IEffect.setParameter ou
IEffect.getParameter com base no tipo de comando herdado do HIDL
N/A IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

Comandos de efeito

Interfaces da API HIDL
(android.hardware.audio.Effect@X.X)
Interfaces da API AIDL
(android.hardware.audio.effect)
EFFECT_CMD_INIT IEffect.open
EFFECT_CMD_RESET CommandId.RESET
EFFECT_CMD_ENABLE IEffect.command(CommandId::START)
EFFECT_CMD_DISABLE IEffect.command(CommandId::STOP)
EFFECT_CMD_SET_PARAM_DEFERRED Descontinuado na HAL da AIDL de efeitos
EFFECT_CMD_SET_PARAM_COMMIT Descontinuado na HAL da AIDL de efeitos
EFFECT_CMD_SET_CONFIG
EFFECT_CMD_SET_PARAM
EFFECT_CMD_SET_DEVICE
EFFECT_CMD_SET_VOLUME
EFFECT_CMD_SET_AUDIO_MODE
EFFECT_CMD_SET_CONFIG_REVERSE
EFFECT_CMD_SET_INPUT_DEVICE
EFFECT_CMD_SET_FEATURE_CONFIG
EFFECT_CMD_SET_AUDIO_SOURCE
IEffect.setParameter
EFFECT_CMD_GET_PARAM
EFFECT_CMD_GET_CONFIG
EFFECT_CMD_GET_CONFIG_REVERSE
EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS
EFFECT_CMD_GET_FEATURE_CONFIG
VISUALIZER_CMD_MEASURE
EFFECT_CMD_FIRST_PROPRIETARY
(igual a VISUALIZER_CMD_CAPTURE)
IEffect.getParameter
EFFECT_CMD_OFFLOAD Obsoleto.
Na AIDL, as mudanças de modo de transferência e não transferência são processadas no framework.
EFFECT_CMD_DUMP Processada pela transação de vinculação integrada AIBinder_dump.

Definição de parâmetros de efeito comuns

Definição HIDL
(android.hardware.audio.effect@X.X)
Definição de AIDL
Types.hal Flags.aidl
Parameter.aidl

Definição de efeitos específicos

Interfaces da API HIDL
(android.hardware.audio.Effect@X.X)
Interfaces da API AIDL
(android.hardware.audio.effect)
I$EffectType$.hal $EffectType$.aidl