Comparación entre el AIDL y la HAL de audio del HIDL

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

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

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

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

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

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

  • Para evitar confusiones con el uso del término dispositivo para los tipos de dispositivos de audio, IDevice en la HAL de audio de HIDL se cambió a IModule en la HAL de audio de AIDL.

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

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

Asignación de HAL de audio de AIDL y HIDL

En las tablas de las siguientes secciones, se muestra la asignación entre las interfaces de la HAL de audio del HIDL y el AIDL. Consulta el archivo readme de HAL de audio para obtener más información sobre la estructura del directorio.

HAL principal

Todas las interfaces de HIDL se encuentran dentro del paquete android.hardware.audio@N.M, en el que N.M denota la versión Major.Minor. Todas las interfaces del AIDL se encuentran dentro del paquete android.hardware.audio.core.

Archivos de configuración y de interfaz de la API de HIDL Interfaces de la API de AIDL
IDevicesFactory Registro de IModule en 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 Usa la implementación de HIDL para Android 14.

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

En esta tabla, los elementos de los archivos en formato XML se designan con corchetes.

Métodos de interfaz de la API de HIDL y elementos de archivos de configuración Métodos de interfaz de la API de 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 de la API de HIDL Métodos de interfaz de la API de 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 y 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 forman parte de la estructura AudioPatch que muestra el sistema HAL. El tamaño real del búfer en tramas forma parte de la estructura StreamDescriptor, junto con el tamaño de la trama en bytes. Para calcular el tamaño del búfer en bytes, умножаем estos dos números.

Conexión de efectos de audio

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

Configuración del sistema

La configuración para todo el sistema que se definió anteriormente 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 aún tienen la opción de usar los mismos archivos en formato XML que usaban anteriormente para establecer la configuración del sistema. La implementación de referencia para IConfig contiene el código necesario para representar la información del archivo en formato XML con 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 de la API de 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 quita del archivo de configuración, ya que este elemento de configuración no se usa dentro del sistema. Todos los dispositivos deben tener habilitado el DRC. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

Funcionalidad relacionada con las funciones

Métodos de interfaz de la API de HIDL Interfaz de la API de 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 de la API de HIDL Comentarios
IDevice.initCheck
IDevice.close
El módulo de HAL se publica solo con el ServiceManager solo después de que se inicializa correctamente. En ese momento, se considera que es permanente y no se puede cerrar.
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
La compatibilidad con parches, pausas, reanudaciones y drenajes es obligatoria.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Obsoleto.

Extensiones de proveedores

En la API de HIDL, las extensiones del proveedor se implementan con los métodos getParameters o setParameters de las interfaces IDevice y IStream. Estos métodos aceptan cadenas arbitrarias. En la API de AIDL, hay métodos correspondientes, como getVendorParameters o setVendorParameters, que toman instancias Parcelable arbitrarias mediante el encapsulamiento dentro de ParcelableHolders.

Otros cambios

Estos son otros cambios generales:

  1. Para mejorar la capacidad de prueba de las APIs de HAL, en la versión de AIDL, presentamos opciones de depuración que usan las pruebas de VTS y están disponibles a través del elemento parcelable ModuleDebug. Estas opciones le indican al HAL que emule ciertas funciones (por ejemplo, la conexión de dispositivos externos), que de otro modo requerirían intervención manual y el uso de equipos de prueba externos.

  2. Los servicios de 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. Cuando implementes el sistema HAL, usa el nombre de servicio de HAL apropiado que se indica en el archivo audioserver.rc. En Android 14, el nombre vendor.audio-hal-aidl se agrega específicamente para la versión de AIDL del HAL.

HAL de efectos

Todas las interfaces HIDL están dentro del paquete android.hardware.audio.effect@N.M*, en el que N.M es la versión Major.Minor. Todas las interfaces de AIDL se encuentran dentro del paquete android.hardware.audio.effect.

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

Effect Factory

Interfaces de la API de HIDL
(android.hardware.audio.effect@X.X)
Interfaces de la API de AIDL
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors IFactory.queryEffects con un parámetro de UUID nulo
IEffectsFactory.getDescriptor IFactory.queryEffects con el parámetro UUID
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

Interfaces de efectos

Interfaces de la API de HIDL
(android.hardware.audio.effect@X.X)
Interfaces de la API de 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 Asigna a IEffect.command,
IEffect.setParameter o
IEffect.getParameter según el tipo de comando HIDL heredado.
N/A IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

Comandos de efectos

Interfaces de la API de HIDL
(android.hardware.audio.effect@X.X)
Interfaces de la API de 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 Se dio de baja en el HAL de AIDL de efectos
EFFECT_CMD_SET_PARAM_COMMIT Se dio de baja en el HAL de AIDL de efectos
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 interruptores de modo de descarga y no descarga se controlan en el framework.
EFFECT_CMD_DUMP Controlado por la transacción de Binder integrada AIBinder_dump.

Definición de los parámetros de efectos comunes

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

Definición de efectos específicos

Interfaces de la API de HIDL
(android.hardware.audio.effect@X.X)
Interfaces de la API de AIDL
(android.hardware.audio.effect)
I$EffectType$.hal $EffectType$.aidl