Comparación HAL de audio AIDL y HIDL

A partir de Android 14, se recomienda a los socios y proveedores de SoC que reemplacen la implementación actual de HIDL HAL con una implementación de AIDL HAL.

Para facilitar una transición fluida de HIDL Audio HAL a AIDL Audio HAL, algunas de las diferencias clave se destacan en esta página. Esta página también muestra el mapeo entre las interfaces AIDL y HIDL para Audio HAL.

Diferencia entre la implementación de AIDL y HIDL Audio HAL

Las principales diferencias entre la estructura HIDL y la estructura AIDL son las siguientes:

  • En AIDL Audio Core HAL , la interfaz IConfig se introduce como reemplazo de los parámetros de todo el sistema en archivos XML en HIDL HAL. El marco lee estos parámetros del Core HAL en lugar del archivo de configuración del proveedor. Como ejemplo, la lista de formatos envolventes que aparecen para el control del usuario la proporciona el método IConfig.getSurroundSoundConfig en Core HAL.

    En AIDL Audio Effects HAL , la lógica effectProxy definida en archivos XML en HIDL Effects HAL se mueve al marco de audio. El marco de audio consulta todas las instancias de efectos en el sistema usando IFactory.queryEffects y todos los procesamientos de efectos usando IFactory.queryProcessing .

  • Para evitar confusiones con el uso del término dispositivo para tipos de dispositivos de audio, IDevice en HIDL Audio HAL pasa a llamarse IModule en AIDL Audio HAL.

  • IPrimaryDevice se reemplaza en AIDL Audio HAL. Las actualizaciones sobre el modo de audio actual y la rotación de la pantalla se envían a cada instancia IModule . Los parámetros relacionados con la conexión síncrona Bluetooth orientada (BT SCO) y el perfil manos libres (HFP) son manejados por una interfaz IBluetooth dedicada. Una interfaz ITelephony dedicada proporciona controles específicos de telefonía. Las instancias de ambas interfaces se pueden recuperar desde la instancia principal de la interfaz IModule . Consulte las tablas de comparación sobre Core HAL y la funcionalidad relacionada con funciones para obtener más información.

  • IDevicesFactory se elimina en AIDL Audio HAL para evitar redundancia. Los módulos HAL (es decir, instancias de interfaz IModule ) ahora se registran directamente con el Administrador de servicios usando sus nombres, por ejemplo, nombres de instancia, como bluetooth o r_submix . La única excepción es el módulo primary que se registra con el nombre de instancia default .

Mapeo AIDL y HIDL Audio HAL

Las tablas de las siguientes secciones muestran la asignación entre las interfaces HIDL y AIDL Audio HAL. Consulte el archivo Audio HAL README para obtener más información sobre la estructura del directorio.

Núcleo HAL

Todas las interfaces HIDL están dentro del paquete android.hardware.audio@NM , donde NM indica la versión Major.Minor . Todas las interfaces AIDL están dentro del paquete android.hardware.audio.core .

Interfaces API HIDL y archivos de configuración Interfaces API AIDL
IDevicesFactory Registro de IModule con ServiceManager .
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
Archivos de política de audio configurables Utilice la implementación HIDL para Android 14.

Puertos de audio, perfiles dinámicos, rutas y parches.

En esta tabla, los elementos de los archivos XML se designan mediante corchetes angulares.

Métodos de interfaz API HIDL y elementos de archivos de configuración Métodos de interfaz 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
Especificación del dispositivo en IDevice.openInputStream
IDevice.openOutputStream
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch

Configuraciones y transmisiones de puertos de audio

Métodos de interfaz API HIDL Métodos de interfaz 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 , la latencia nominal y el tamaño mínimo del búfer son parte de la estructura AudioPatch devuelta por HAL. El tamaño real del búfer en fotogramas forma parte de la estructura StreamDescriptor , junto con el tamaño del fotograma en bytes. El tamaño del búfer en bytes se puede calcular multiplicando estos dos números.

Conexión de efectos de audio

Métodos de interfaz API HIDL Métodos de interfaz API AIDL
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

Configuración de todo el sistema

La configuración de todo el sistema que se definió previamente en los archivos de configuración XML de la política de audio (es decir, audio_policy_configuration.xml y audio_policy_engine_configuration.xml ) se debe proporcionar a través de IConfig . Sin embargo, para facilitar la transición a AIDL, los proveedores todavía tienen la opción de utilizar los mismos archivos XML que utilizaban anteriormente para establecer la configuración de todo el sistema. La implementación de referencia para IConfig contiene el código necesario para representar información del archivo XML utilizando tipos de datos AIDL, lo que facilita la conversión de XML a AIDL.

Elementos del archivo de configuración HIDL Métodos de interfaz API AIDL
<globalConfiguration>
<speaker_drc_enabled> 1

<call_screen_mode_supported>
<engine_library>
Separado en dos métodos diferentes:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> , O
<volumeGroups> , <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled se elimina del archivo de configuración ya que este elemento de configuración no se utiliza dentro del sistema. Todos los dispositivos deben tener DRC habilitado.

Funcionalidad relacionada con funciones

Métodos de interfaz API HIDL Interfaz 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 (las devoluciones de llamada se combinan en IStreamOutEventCallback )
IDevice.get/setParameters
IStream.get/setParameters
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters

Métodos obsoletos

Métodos de interfaz API HIDL Comentarios
IDevice.initCheck
IDevice.close
El módulo HAL se publica con ServiceManager solo tras una inicialización exitosa. En ese momento, se considera permanente y no se puede cerrar.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
La compatibilidad con parches, pausa, reanudación y drenaje es obligatoria.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Obsoleto.

Extensiones de proveedores

En la API HIDL, las extensiones de proveedores se implementan utilizando los métodos getParameters o setParameters de las interfaces IDevice e IStream . Estos métodos aceptan cadenas arbitrarias. En la API AIDL, existen métodos correspondientes, como getVendorParameters o setVendorParameters , que toman instancias Parcelable arbitrarias mediante el uso de encapsulación dentro de ParcelableHolders .

Otros cambios

Otros cambios generales son los siguientes:

  1. Para mejorar la capacidad de prueba de las API HAL, en la versión AIDL, introducimos opciones de depuración que utilizan las pruebas VTS y están disponibles a través del paquete ModuleDebug . Estas opciones le indican al HAL que emule cierta funcionalidad (por ejemplo, conexión de dispositivos externos), que de otro modo requeriría intervención manual y el uso de equipos de prueba externos.

  2. Los servicios HAL deben reiniciarse cuando el valor de la propiedad del sistema sys.audio.restart.hal se establece en 1 . El reinicio se logra a través de audioserver.rc . Al implementar HAL, utilice el nombre de servicio HAL apropiado que figura en el archivo audioserver.rc . En Android 14, el nombre vendor.audio-hal-aidl se agrega específicamente para la versión AIDL de HAL.

Efectos HAL

Todas las interfaces HIDL están dentro del paquete android.hardware.audio.effect@NM* , donde NM es la versión Major.Minor . Todas las interfaces AIDL están dentro del paquete android.hardware.audio.effect .

Interfaces API HIDL y archivos de configuración Interfaces API AIDL
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

Fábrica de efectos

Interfaces API HIDL
(android.hardware.audio.effect@XX)
Interfaces API AIDL
(android.hardware.audio.efecto)
IEffectsFactory.getAllDescriptors IFactory.queryEffects con parámetro UUID nulo
IEffectsFactory.getDescriptor IFactory.queryEffects con parámetro UUID
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

Interfaces de efectos

Interfaces API HIDL
(android.hardware.audio.effect@XX)
Interfaces API AIDL
(android.hardware.audio.efecto)
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 Asignar a IEffect.command ,
IEffect.setParameter o
IEffect.getParameter basado en el tipo de comando HIDL heredado
N / A IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

Comandos de efectos

Interfaces API HIDL
(android.hardware.audio.effect@XX)
Interfaces API AIDL
(android.hardware.audio.efecto)
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 en Efectos AIDL HAL
EFFECT_CMD_SET_PARAM_COMMIT Obsoleto en Efectos 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 que VISUALIZER_CMD_CAPTURE )
IEffect.getParameter
EFFECT_CMD_OFFLOAD Obsoleto.
En AIDL, los cambios de modo de descarga y no descarga se manejan en el marco.
EFFECT_CMD_DUMP Manejado por la transacción de carpeta incorporada AIBinder_dump .

Definición de parámetros de efectos comunes

Definición de HIDL
(android.hardware.audio.effect@XX)
definición de AIDL
Types.hal Flags.aidl
Parameter.aidl

Definición de efectos específicos

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