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étodo- IConfig.getSurroundSoundConfigna HAL principal.- Na HAL de efeitos de áudio da AIDL, a lógica - effectProxydefinida 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 usando- IFactory.queryEffectse todos os processamentos de efeito usando- IFactory.queryProcessing.
- Para evitar confusão com o uso do termo dispositivo para tipos de dispositivos de áudio, - IDevicena HAL de áudio HIDL foi renomeado para- IModulena HAL de áudio AIDL.
- A HAL de áudio AIDL substitui - IPrimaryDevice. A biblioteca envia atualizações sobre o modo de áudio atual e a rotação da tela para todas as instâncias de- IModule. Uma interface- IBluetoothdedicada processa parâmetros relacionados à conexão síncrona orientada a Bluetooth (BT SCO) e ao perfil viva-voz (HFP). Uma interface- ITelephonydedicada oferece controles específicos de telefonia. É possível recuperar instâncias dessas duas interfaces da instância principal da interface- IModule. Consulte as tabelas de comparação em HAL principal e Funcionalidade relacionada a recursos para mais informações.
- O - IDevicesFactoryfoi removido na HAL de áudio AIDL para evitar redundância. Os módulos HAL (ou seja, instâncias de interface- IModule) agora são registrados diretamente com o Service Manager usando os nomes das instâncias de módulo, como- bluetoothou- 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 a seguir mostram o mapeamento entre as interfaces HIDL e AIDL Audio HAL. Consulte HAL de áudio para mais informações sobre a estrutura de diretórios.
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 IModulecomServiceManager. | 
| IDevice | IModule | 
| IPrimaryDevice | ITelephonyIBluetooth | 
| IStreamIStreamInIStreamOut | StreamDescriptorIStreamInIStreamCommonIStreamOut | 
| audio_policy_configuration.xmlaudio_policy_engine_configuration.xml | IConfigIModule | 
| 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.getAudioPortIDevice.setConnectedState | IModule.connectExternalDeviceIModule.disconnectExternalDevice | 
| IStream.getSupportedProfiles | IModule.connectExternalDevice | 
| < routes> | IModule.getAudioRoutes | 
| IDevice.createAudioPatchIDevice.updateAudioPatchIDevice.releaseAudioPatchIStream.getDevicesIStream.setDevicesEspecificação do dispositivo em IDevice.openInputStreamIDevice.openOutputStream | IModule.setAudioPatchIModule.setAudioPortConfigIModule.resetAudioPatch | 
Configurações e streams de porta de áudio
| Métodos de interface da API HIDL | Métodos de interface da API AIDL | 
|---|---|
| IStream.getAudioPropertiesIStream.setAudioPropertiesIStreamIn.getAudioSource | IModule.getAudioPortConfigsIModule.setAudioPortConfig | 
| IDevice.openInputStreamIDevice.openOutputStreamIStreamIn.prepareForReadingIStreamOut.prepareForWritingIStream.createMmapBuffer | IModule.openInputStreamIModule.openOutputStream | 
| IStream.close | IStreamCommon.close | 
| IStreamIn.updateSinkMetadataIStreamOut.updateSourceMetadata | IStreamIn.updateMetadataIStreamOut.updateMetadata | 
| IStream.standby | StreamDescriptor.Command.standby | 
| IStream.pauseIStream.resume | StreamDescriptor.Command.pause.start | 
| IStream.startIStream.stop(streams MMAP) | StreamDescriptor.Command.startou.burst.pause(entrada) e/ou.flush(saída) | 
| IStreamOut.drainIStreamOut.flush | StreamDescriptor.Command.drain.flush | 
| IStreamOut.setCallbackIStreamOut.clearCallback | IModule.openOutputStreamIStreamCommon.close | 
| IStreamOut.getPresentationPositioneIStreamIn.getCapturePositionIStreamOut.getLatencyIStream.getMmapPositionIStreamIn.getInputFramesLost | StreamDescriptor.Reply.observableStreamDescriptor.Reply.latencyMsStreamDescriptor.Reply.hardwareStreamDescriptor.Reply.xrunFrames | 
| IDevice.getInputBufferSizeIStreamOut.getLatencyIStream.getBufferSizeIStream.getFrameSizeIStream.getFrameCount | IModule.setAudioPatch, latência nominal e tamanho mínimo do buffer fazem parte da estruturaAudioPatchretornada pela HAL.
      O tamanho real do buffer em frames faz parte da estruturaStreamDescriptor, 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.addDeviceEffectIDevice.removeDeviceEffect | IModule.addDeviceEffectIModule.removeDeviceEffect | 
| IStream.addEffectIStream.removeEffect | IStreamCommon.addEffectIStreamCommon.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.getSupportedAudioModesIConfig.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.setMasterVolumeIDevice.getMasterVolumeIDevice.setMicMuteIDevice.getMicMuteIDevice.setMasterMuteIDevice.getMasterMute | IModule.\* | 
| IPrimaryDevice.getTtyModeIPrimaryDevice.setTtyModeIPrimaryDevice.getHacEnabledIPrimaryDevice.setHacEnabledIPrimaryDevice.setVoiceVolume | ITelephony.TelecomConfig.\* | 
| IPrimaryDevice.setBtScoHeadsetDebugNameIPrimaryDevice.getBtScoNrecEnabledIPrimaryDevice.setBtScoNrecEnabledIPrimaryDevice.getBtScoWidebandEnabledIPrimaryDevice.setBtScoWidebandEnabled,IPrimaryDevice.getBtHfpEnabledIPrimaryDevice.setBtHfpEnabledIPrimaryDevice.setBtHfpSampleRateIPrimaryDevice.setBtHfpVolume | IBluetooth.ScoConfig.\*IBluetooth.HfpConfig.\* | 
| IPrimaryDevice.setModeIPrimaryDevice.updateRotation | ITelephony.switchAudioModeIModule.updateAudioModeIModule.updateScreenRotation | 
| IDevice.setScreenStateIDevice.getMicrophones | IModule.updateScreenStateIModule.getMicrophones | 
| IDevice.getHwAvSyncIStream.setHwAvSync | IModule.generateHwAvSyncIdIStreamCommon.updateHwAvSyncId | 
| IStreamIn.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | 
| IStreamOut.getDualMonoModeIStreamOut.setDualMonoModeIStreamOut.getPlaybackRateParametersIStreamOut.setPlaybackRateParametersIStreamOut.selectPresentationIStreamOut.getAudioDescriptionMixLevelIStreamOut.setAudioDescriptionMixLevelIStreamOut.setLatencyModeIStreamOut.getRecommendedLatencyModes | IStreamOut.\* | 
| IStreamOut.setEventCallbackIStreamOut.setLatencyModeCallback | IModule.openOutputStream(callbacks são combinados emIStreamOutEventCallback) | 
| IDevice.get/setParametersIStream.get/setParameters | IModule.get/setVendorParametersIStreamCommon.get/setVendorParameters | 
Métodos obsoletos
| Métodos de interface da API HIDL | Comentários | 
|---|---|
| IDevice.initCheckIDevice.close | O módulo HAL se publica com o ServiceManagerapenas na
    inicialização bem-sucedida. Nesse ponto, ela é considerada permanente e não pode ser fechada. | 
| IDevice.supportsAudioPatchesIStreamOut.supportsPauseAndResumeIStreamOut.supportsDrain | O suporte para patches, pausa, retomada e drenagem é obrigatório. | 
| IStreamOut.getRenderPositionIStreamOut.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.
- Quando o framework ou o VTS define a propriedade do sistema - sys.audio.restart.halcomo- 1, os serviços HAL precisam ser reiniciados. O arquivo- audioserver.rcprocessa a reinicialização. Ao implementar a 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 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.queryEffectscom parâmetro UUID nulo | 
| IEffectsFactory.getDescriptor | IFactory.queryEffectscom parâmetro UUID | 
| IEffectsFactory.createEffect | IFactory.createEffect | 
| audio_effects.xml | IFactory.queryProcessingIFactory.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.setParameterouIEffect.getParametercom 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_CONFIGEFFECT_CMD_SET_PARAMEFFECT_CMD_SET_DEVICEEFFECT_CMD_SET_VOLUMEEFFECT_CMD_SET_AUDIO_MODEEFFECT_CMD_SET_CONFIG_REVERSEEFFECT_CMD_SET_INPUT_DEVICEEFFECT_CMD_SET_FEATURE_CONFIGEFFECT_CMD_SET_AUDIO_SOURCE | IEffect.setParameter | 
| EFFECT_CMD_GET_PARAMEFFECT_CMD_GET_CONFIGEFFECT_CMD_GET_CONFIG_REVERSEEFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGSEFFECT_CMD_GET_FEATURE_CONFIGVISUALIZER_CMD_MEASUREEFFECT_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.aidlParameter.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 | 
