No Android 14 e versões mais recentes, os parceiros e fornecedores de SoC são incentivados a substituir a implementação atual da HAL de HIDL por uma implementação da HAL de AIDL.
Para facilitar uma transição tranquila 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 as estruturas HIDL e AIDL são as seguintes:
Na HAL de áudio AIDL Core, a interface
IConfig
é apresentada como uma substituição para os parâmetros em todo o sistema em arquivos XML na HAL 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 ambiente que são apresentados para controle do usuário é fornecida pelo métodoIConfig.getSurroundSoundConfig
na HAL principal.Na HAL de efeitos de áudio da AIDL, a lógica
effectProxy
definida em arquivos XML na HAL de efeitos da HIDL é movida para o framework de áudio. O framework de áudio consulta todas as instâncias de efeito no sistema usandoIFactory.queryEffects
e todos os processamentos de efeito usandoIFactory.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 paraIModule
na HAL de áudio AIDL.IPrimaryDevice
é substituído na HAL de áudio AIDL. Atualizações sobre o modo de áudio atual e a rotação da tela são enviadas para todas as instâncias deIModule
. Os parâmetros relacionados à conexão síncrona orientada por Bluetooth (BT SCO) e ao perfil viva-voz (HFP) são processados por uma interfaceIBluetooth
dedicada. Uma interfaceITelephony
dedicada oferece controles específicos de telefonia. As instâncias dessas duas interfaces podem ser recuperadas da instância principal da interfaceIModule
. Consulte as tabelas de comparação em HAL principal e Funcionalidade relacionada a recursos para mais informações.O
IDevicesFactory
foi removido na HAL de áudio AIDL para evitar redundância. Os módulos HAL (ou seja, instâncias de interfaceIModule
) agora são registrados diretamente no Service Manager usando os nomes deles para nomes de instâncias, comobluetooth
our_submix
. A única exceção é o móduloprimary
, que é registrado com o nome da instânciadefault
.
Mapeamento da HAL de áudio AIDL e HIDL
As tabelas nas seções a seguir mostram o mapeamento entre as interfaces HIDL e AIDL Audio HAL. 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
indica a versão Major.Minor. Todas as interfaces AIDL estão no pacote
android.hardware.audio.core
.
Interfaces de API HIDL e arquivos de configuração | Interfaces de 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 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.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 streams 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 pela 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 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 para todo o sistema
A configuração em todo o sistema, que antes era definida 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 antes para definir a configuração em 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 do HIDL | Métodos de interface da API AIDL |
---|---|
<globalConfiguration>
<speaker_drc_enabled> <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 |
-
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 o DRC ativado. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
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 (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 apenas na
inicialização bem-sucedida. Nesse ponto, ela é considerada permanente e não pode ser fechada. |
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 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 em ParcelableHolders
.
Outras mudanças
Outras mudanças gerais são:
Para melhorar a capacidade de teste das APIs HAL, na versão AIDL, apresentamos opções de depuração usadas pelos testes do VTS e disponíveis pelo pacote
ModuleDebug
. Essas opções instruem a HAL a emular determinadas funcionalidades (por exemplo, conexão de dispositivos externos), que, de outra forma, exigem intervenção manual e uso de equipamentos de teste externos.Os serviços HAL precisam ser reiniciados quando o valor da propriedade do sistema
sys.audio.restart.hal
é definido como1
. O reinício é feito usandoaudioserver.rc
. Ao implementar a HAL, use o nome do serviço HAL apropriado listado no arquivoaudioserver.rc
. No Android 14, o nomevendor.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 de API HIDL e arquivos de configuração | Interfaces de 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 de 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 |
Mapeie para IEffect.command ,
IEffect.setParameter ou
IEffect.getParameter com base no tipo de comando HIDL
legado.
|
N/A | IEffect.getState |
IEffect.setParameter |
IEffect.setParameter |
IEffect.getParameter |
IEffect.getParameter |
Comandos de efeito
Interfaces de 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 de efeitos AIDL |
EFFECT_CMD_SET_PARAM_COMMIT |
Descontinuado 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 trocas de modo de descarga e não descarga são processadas no framework. |
EFFECT_CMD_DUMP |
Processado pela transação de binder integrada AIBinder_dump . |
Definição de 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 de API HIDL (android.hardware.audio.effect@X.X) |
Interfaces da API AIDL (android.hardware.audio.effect) |
---|---|
I$EffectType$.hal |
$EffectType$.aidl |