Comparação AIDL e HIDL Audio HAL

A partir do Android 14, os parceiros e fornecedores de SoC são incentivados a substituir a implementação atual do HIDL HAL por uma implementação do AIDL HAL.

Para facilitar uma transição suave de HIDL Audio HAL para um AIDL Audio HAL, 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 o Audio HAL.

Diferença entre a implementação AIDL e HIDL Audio HAL

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

  • No AIDL Audio Core HAL , a interface IConfig é introduzida como um substituto para os parâmetros de todo o sistema em arquivos XML no HIDL HAL. A estrutura lê esses parâmetros do Core HAL em vez do arquivo de configuração do fornecedor. Por exemplo, a lista de formatos surround exibidos para controle do usuário é fornecida pelo método IConfig.getSurroundSoundConfig no Core HAL.

    No AIDL Audio Effects HAL , a lógica effectProxy definida em arquivos XML no HIDL Effects HAL é movida para a estrutura de áudio. A estrutura de áudio consulta todas as instâncias de efeitos no sistema usando IFactory.queryEffects e todos os processamentos de efeitos usando IFactory.queryProcessing .

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

  • IPrimaryDevice é substituído no AIDL Audio HAL. Atualizações sobre o modo de áudio atual e rotação da tela são enviadas para cada instância IModule . Parâmetros relacionados à conexão síncrona Bluetooth orientada (BT SCO) e ao perfil mãos-livres (HFP) são tratados por uma interface IBluetooth dedicada. Uma interface ITelephony dedicada fornece controles específicos de telefonia. As instâncias de ambas as interfaces podem ser recuperadas da instância primária da interface IModule . Consulte as tabelas de comparação sobre Core HAL e funcionalidades relacionadas a recursos para obter mais informações.

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

Mapeamento HAL de áudio AIDL e HIDL

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

Núcleo HAL

Todas as interfaces HIDL estão dentro do pacote android.hardware.audio@NM , onde NM denota a versão Major.Minor . Todas as interfaces AIDL estão no pacote android.hardware.audio.core .

Interfaces API HIDL e arquivos de configuração Interfaces API AIDL
IDevicesFactory Registro do 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 Android 14.

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

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

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

Configurações e fluxos de portas 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 quadros faz parte da estrutura StreamDescriptor , juntamente com o tamanho do quadro em bytes. O tamanho do buffer em bytes pode ser calculado 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 de todo o sistema

A configuração de todo o sistema que foi definida anteriormente nos arquivos de configuração XML da política de áudio (ou seja, audio_policy_configuration.xml e audio_policy_engine_configuration.xml ) deve ser fornecida por meio de 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. 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 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> , <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled é removido do arquivo de configuração porque este item de configuração não é usado no sistema. Todos os dispositivos devem ter o DRC ativado.

Funcionalidade relacionada 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 (retornos de chamada 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-se com o ServiceManager somente após uma inicialização bem-sucedida. Nesse ponto, é considerado permanente e não pode ser fechado.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
Suporte para patches, pausa, retomada e drenagem é obrigatório.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Obsoleto.

Extensões de 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, existem métodos correspondentes, como getVendorParameters ou setVendorParameters , que utilizam instâncias arbitrárias Parcelable usando encapsulamento em ParcelableHolders .

Outras mudanças

Outras mudanças gerais são as seguintes:

  1. Para melhorar a testabilidade das APIs HAL, na versão AIDL, introduzimos opções de depuração que são utilizadas pelos testes VTS e estão disponíveis através do parcelable ModuleDebug . Estas opções instruem o HAL a emular determinadas funcionalidades (por exemplo, conexão de dispositivos externos), que de outra forma requerem intervenção manual e uso de equipamento de teste externo.

  2. Os serviços HAL são necessários para reiniciar quando o valor da propriedade do sistema sys.audio.restart.hal é definido como 1 . A reinicialização é realizada através de audioserver.rc . Ao implementar o HAL, use o nome de serviço HAL apropriado listado no arquivo audioserver.rc . No Android 14, o nome vendor.audio-hal-aidl é adicionado especificamente para a versão AIDL do HAL.

Efeitos HAL

Todas as interfaces HIDL estão dentro do pacote android.hardware.audio.effect@NM* , onde NM é a versão Major.Minor . Todas as interfaces AIDL estão dentro do pacote android.hardware.audio.effect .

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

Fábrica de Efeitos

Interfaces API HIDL
(android.hardware.audio.efeito@XX)
Interfaces API AIDL
(android.hardware.audio.efeito)
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 efeitos

Interfaces API HIDL
(android.hardware.audio.efeito@XX)
Interfaces API AIDL
(android.hardware.audio.efeito)
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 HIDL legado
N / D IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

Comandos de Efeito

Interfaces API HIDL
(android.hardware.audio.efeito@XX)
Interfaces API AIDL
(android.hardware.audio.efeito)
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 Obsoleto nos efeitos AIDL HAL
EFFECT_CMD_SET_PARAM_COMMIT Obsoleto nos efeitos AIDL HAL
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 Descontinuada.
No AIDL, as opções de modo de descarregamento e não descarregamento são tratadas na estrutura.
EFFECT_CMD_DUMP Manipulado pela transação de fichário integrada AIBinder_dump .

Definição de parâmetros de efeito comum

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

Definição de efeitos específicos

Interfaces API HIDL
(android.hardware.audio.efeito@XX)
Interfaces API AIDL
(android.hardware.audio.efeito)
I $EffectType$ .hal $EffectType$ .aidl