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

No Android 14 e versões mais recentes, parceiros e fornecedores de SoC são incentivados a substituir a implementação atual da HAL de HIDL por uma HAL da AIDL implementação.

Para facilitar a transição da HAL de áudio HIDL para uma HAL de áudio AIDL, algumas das principais diferenças estão destacadas nesta página. Esta página também mostra o mapeamento entre as interfaces AIDL e HIDL para o 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 segue:

  • Na HAL de núcleo de áudio AIDL, a A interface IConfig foi introduzida para substituir a interface em arquivos XML na HAL de HIDL. O framework lê esses parâmetros da HAL principal em vez do arquivo de configuração do fornecedor. Por exemplo, a lista de formatos de som surround que são exibidos para controle do usuário é fornecido pela IConfig.getSurroundSoundConfig na HAL principal.

    Em HAL de efeitos de áudio da AIDL, a lógica effectProxy definida em arquivos XML na HAL de efeitos HIDL é movida para a estrutura de áudio. A estrutura de áudio consulta todas as instâncias de efeito na 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, O IDevice na HAL de áudio HIDL foi renomeado como IModule na HAL de áudio AIDL.

  • O IPrimaryDevice foi substituído na HAL de áudio AIDL. Atualizações sobre o áudio atual modo e rotação de tela são enviados a cada instância de IModule. Parâmetros relacionadas à conexão síncrona orientada por Bluetooth (BT SCO) e ao Hands-Free Os perfis (HFP) são gerenciados por um IBluetooth dedicado interface gráfica do usuário. Uma interface ITelephony dedicada oferece recursos específicos para controles de segurança. Instâncias de ambas as interfaces podem ser recuperadas do instância principal da interface IModule. Consulte as tabelas de comparação HAL de núcleo e Funcionalidades relacionadas a recursos para mais informações.

  • IDevicesFactory foi removido na HAL de áudio AIDL para evitar redundância. HAL módulos (ou seja, instâncias de interface IModule) agora são registrados diretamente com o Service Manager usando os nomes delas nos nomes de instâncias, como bluetooth ou r_submix. A única exceção é o módulo primary, que é registrada com o nome de instância default.

Mapeamento de HAL de áudio AIDL e HIDL

As tabelas nas seções a seguir mostram o mapeamento entre o HIDL e a AIDL Interfaces HAL de áudio. Consulte Arquivo README da HAL de áudio para saber mais sobre a estrutura de diretórios.

HAL principal

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

Interfaces e arquivos de configuração da API HIDL Interfaces da API AIDL
IDevicesFactory Registro do domínio IModule no 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 Usar 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 por sinais de maior e menor.

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
e 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 buffer mínimo fazem parte da estrutura AudioPatch retornada pela HAL. O tamanho real do buffer em frames faz parte do StreamDescriptor com o tamanho do frame em bytes. O tamanho do buffer em bytes pode ser calculada multiplicando esses dois números.

Conexão de efeitos de áudio

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

Configuração geral do sistema definida anteriormente no XML da política de áudio arquivos de configuração (ou seja, audio_policy_configuration.xml e audio_policy_engine_configuration.xml) precisam ser fornecidas pelo app IConfig. No entanto, para facilitar a transição para AIDL, os fornecedores ainda têm a opção de usar os mesmos arquivos XML usados anteriormente para definir a configuração de todo o sistema. O implementação de referência para IConfig contém o código necessário para que representam informações do arquivo XML usando tipos de dados AIDL, facilita a conversão de XML para AIDL.

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

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

  1. speaker_drc_enabled é removido do arquivo de configuração como este item de configuração não é usado no sistema. Todos os dispositivos devem ter DRC ativada.<ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

Funcionalidades relacionadas a recursos

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 publica a si mesmo com o ServiceManager apenas em inicialização bem-sucedida. O conteúdo é considerado permanente e não pode ser fechado.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
O suporte para patches, pausa, retomada e drenagem é obrigatório.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Obsoleto.

Extensões do fornecedor

Na API HIDL, as extensões do fornecedor são implementadas usando as APIs 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 tomam instâncias de Parcelable arbitrárias usando em 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, nós apresentar opções de depuração usadas pelos testes VTS e disponíveis pelo parcelable ModuleDebug. Essas opções instruem a HAL a emular determinados recursos (por exemplo, a conexão de dispositivos externos), o que requer intervenção manual e uso de testes externos equipamentos.

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

HAL de efeitos

Todas as interfaces HIDL estão dentro do android.hardware.audio.effect@N.M* em que N.M é a versão Major.Minor. Todas as interfaces AIDL sã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

Fábrica de efeitos

Interfaces da 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 HIDL legado comando
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 Descontinuada na HAL de efeitos AIDL
EFFECT_CMD_SET_PARAM_COMMIT Descontinuada na HAL de efeitos AIDL
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 chaves do modo de descarga e de não descarga são tratadas na de análise de dados em nuvem.
EFFECT_CMD_DUMP Processada pela transação de vinculação integrada AIBinder_dump.

Definição dos parâmetros de efeito comum

Definição de 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