A partir do Android 14, recomendamos que parceiros e fornecedores de SoC substituam a implementação atual da HAL de HIDL por uma implementação da HAL de AIDL.
Para facilitar a transição 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 a estrutura HIDL e a AIDL são as seguintes:
Na HAL de núcleo de áudio AIDL, a interface
IConfig
é introduzida como uma substituição para os parâmetros do sistema em arquivos XML na HAL de HIDL. O framework lê esses parâmetros do HAL principal em vez do arquivo de configuração do fornecedor. Por exemplo, a lista de formatos surround que são exibidos para o controle do usuário é fornecida pelo métodoIConfig.getSurroundSoundConfig
no HAL principal.Na HAL de efeitos de áudio AIDL, a lógica
effectProxy
definida em arquivos XML na HAL de efeitos 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
foi substituído na HAL de áudio AIDL. As atualizações sobre o modo de áudio atual e a rotação da tela são enviadas para cada instância deIModule
. Os parâmetros relacionados à conexão síncrona do 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 de ambas as interfaces podem ser recuperadas da instância principal da interfaceIModule
. Consulte as tabelas de comparação em HAL principal e Funcionalidade relacionada ao recurso para mais informações.O
IDevicesFactory
foi removido na HAL de áudio AIDL para evitar redundância. Os módulos da HAL, ou seja, instâncias de interfaceIModule
, agora são registrados diretamente com o gerenciador de serviços 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 abaixo mostram o mapeamento entre as interfaces HAL de áudio HIDL e AIDL. 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
denota a versão Major.Minor. Todas as interfaces da AIDL estão no
pacote android.hardware.audio.core
.
Interfaces e arquivos de configuração da API HIDL | Interfaces da 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.
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 |
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
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 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 sonoros
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
A configuração do sistema que foi definida anteriormente 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 anteriormente para definir a configuração do 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 de 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 |
-
O
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 DRC ativado. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
Funcionalidade relacionada ao recurso
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 se publica com o ServiceManager somente
quando a inicialização é bem-sucedida. Nesse ponto, ela é considerada permanente
e não pode ser encerrada. |
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain |
O suporte a patches, pausa, retomada e esgotamento é 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 no ParcelableHolders
.
Outras mudanças
Outras mudanças gerais são as seguintes:
Para melhorar a capacidade de teste das APIs da HAL, na versão AIDL, introduzimos opções de depuração usadas por testes VTS e disponíveis no parcelable
ModuleDebug
. Essas opções instruem o HAL a emular determinadas funcionalidades (por exemplo, conexão de dispositivos externos), que, de outra forma, exigem intervenção manual e o 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 peloaudioserver.rc
. Ao implementar a HAL, use o nome de serviço da 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 e arquivos de configuração da API HIDL | Interfaces da 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 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 comando
herdado do HIDL
|
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 |
Descontinuado na HAL da AIDL de efeitos |
EFFECT_CMD_SET_PARAM_COMMIT |
Descontinuado na HAL da AIDL de efeitos |
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 mudanças de modo de transferência e não transferência são processadas no framework. |
EFFECT_CMD_DUMP |
Processada pela transação de vinculação integrada AIBinder_dump . |
Definição de parâmetros de efeito comuns
Definição 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 |