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

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

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

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

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

  • En la HAL de AIDL Audio Core, el elemento Se presenta la interfaz IConfig como reemplazo de la interfaz de todo el sistema. parámetros en archivos XML en la HAL de HIDL. El framework lee estos parámetros de la HAL principal en lugar del archivo de configuración del proveedor. Por ejemplo, la lista de formatos envolventes que se muestran para el control del usuario proporcionado por el IConfig.getSurroundSoundConfig en la HAL principal.

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

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

  • Se reemplazó IPrimaryDevice en la HAL de audio del AIDL. Actualizaciones sobre el audio actual y la rotación de pantalla se envían a cada instancia de IModule. Parámetros relacionadas con la conexión Bluetooth síncrona orientada (BT SCO) y el modo de manos libres Un IBluetooth dedicado controla el perfil (HFP) interfaz de usuario. Una interfaz ITelephony dedicada brinda funciones específicas de telefonía, controles de seguridad. Las instancias de ambas interfaces pueden recuperarse desde el La instancia principal de la interfaz IModule Consulta las tablas de comparación en HAL principal y Funcionalidad relacionada con las funciones para obtener más información.

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

Asignación de HAL de audio de AIDL y HIDL

En las tablas de las siguientes secciones, se muestra la correspondencia entre el HIDL y el AIDL Interfaces de HAL de audio Consulta Archivo README de audio de la HAL para obtener más información sobre la estructura del directorio.

HAL principal

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

Interfaces y archivos de configuración 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 usando corchetes angulares.

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, latencia nominal y búfer mínimo son parte de la estructura AudioPatch que muestra la HAL. El tamaño real del búfer en fotogramas forma parte de StreamDescriptor. junto con el tamaño del marco en bytes. El tamaño del búfer en bytes puede ser se calcula multiplicando 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 de todo el sistema

Configuración en todo el sistema que se definió anteriormente en el XML de la política de audio de configuración de Terraform (es decir, audio_policy_configuration.xml y audio_policy_engine_configuration.xml) debe proporcionarse a través de IConfig. Sin embargo, para facilitar la transición al AIDL, los proveedores aún tienen la opción de usar los mismos archivos XML que usaron antes para establecer la configuración de todo el sistema. El la implementación de referencia para IConfig contiene el código necesario para que representan información del archivo en formato XML con los tipos de datos AIDL, que y 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>
Se divide en dos métodos diferentes:
ITelephony.getSupportedAudioModes IConfig.getEngineConfig de
<volumes>, O
<volumeGroups> y <ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled se quita del archivo de configuración como este elemento de configuración no se usa en el sistema. Todos los dispositivos deben tener DRC habilitado<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 en 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 desvío es obligatoria.
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
Obsoleto.

Extensiones de proveedores

En la API de HIDL, las extensiones de proveedores se implementan usando getParameters o Métodos setParameters de las interfaces IDevice y IStream Estos aceptan cadenas arbitrarias. En la API de AIDL, hay métodos correspondientes, como getVendorParameters o setVendorParameters, que toman instancias de Parcelable arbitrarias con encapsulamiento en ParcelableHolders.

Otros cambios

Estos son otros cambios generales:

  1. Para mejorar la capacidad de prueba de las APIs de HAL, en la versión del AIDL, presentar opciones de depuración que se usan en las pruebas de VTS y que están disponibles a través del objeto parcelable ModuleDebug. Estas opciones le indican a la HAL emular ciertas funcionalidades (por ejemplo, conexión de dispositivos externos) que, de lo contrario, requieren la intervención manual y el uso de pruebas externas o equipamiento.

  2. Los servicios HAL deben reiniciarse cuando el valor de la propiedad del sistema sys.audio.restart.hal se configura como 1. El reinicio se logra a través de audioserver.rc Cuando implementes la HAL, usa el nombre de servicio de HAL que corresponda el archivo audioserver.rc. En Android 14, el nombre Se agregó vendor.audio-hal-aidl específicamente para la versión del AIDL del HAL.

HAL de efectos

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

Fábrica de efectos

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 parámetro 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 Mapa a IEffect.command,
IEffect.setParameter o
IEffect.getParameter según el tipo de HIDL heredado comando
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 Obsoleto en la HAL del AIDL de Effects
EFFECT_CMD_SET_PARAM_COMMIT Obsoleto en la HAL del AIDL de Effects
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 el AIDL, los interruptores de modo de descarga y sin descarga se controlan en la en un framework de nube.
EFFECT_CMD_DUMP Controlado por la transacción de Binder integrada AIBinder_dump.

Definición de parámetros comunes de Effect

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