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étodoIConfig.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 usandoIFactory.queryEffects
e todos os processamentos de efeitos usandoIFactory.queryProcessing
.Para evitar confusão com o uso do termo dispositivo para tipos de dispositivos de áudio,
IDevice
no HIDL Audio HAL foi renomeado paraIModule
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ânciaIModule
. Parâmetros relacionados à conexão síncrona Bluetooth orientada (BT SCO) e ao perfil mãos-livres (HFP) são tratados por uma interfaceIBluetooth
dedicada. Uma interfaceITelephony
dedicada fornece controles específicos de telefonia. As instâncias de ambas as interfaces podem ser recuperadas da instância primária da interfaceIModule
. 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 interfaceIModule
) agora são registrados diretamente no Service Manager usando seus nomes para nomes de instância, comobluetooth
our_submix
. A única exceção é o móduloprimary
que é registrado com o nome de instânciadefault
.
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.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> <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 |
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:
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.Os serviços HAL são necessários para reiniciar quando o valor da propriedade do sistema
sys.audio.restart.hal
é definido como1
. A reinicialização é realizada através deaudioserver.rc
. Ao implementar o HAL, use o nome de serviço HAL apropriado listado no arquivoaudioserver.rc
. No Android 14, o nomevendor.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 ouIEffect.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 |