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 de AIDL.
Para facilitar una transición sin problemas de la HAL de audio de HIDL a una HAL de audio de 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 de AIDL y HIDL para el HAL de audio.
Diferencia entre la implementación de la HAL de audio de AIDL y HIDL
Las principales diferencias entre la estructura de HIDL y la de AIDL son las siguientes:
En la HAL de Audio Core de AIDL, se presenta la interfaz
IConfig
como reemplazo de los parámetros de todo el sistema en los archivos XML de la HAL de HIDL. El framework lee estos parámetros del HAL de Core en lugar del archivo de configuración del proveedor. Como ejemplo, el métodoIConfig.getSurroundSoundConfig
en el HAL principal proporciona la lista de formatos de sonido envolvente que se muestran para el control del usuario.En la HAL de efectos de audio de AIDL, la lógica de
effectProxy
definida en los archivos 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 conIFactory.queryEffects
y todos los procesamientos de efectos conIFactory.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ó aIModule
en la HAL de audio de AIDL.IPrimaryDevice
se reemplaza en la HAL de audio de AIDL. Las actualizaciones sobre el modo de audio actual y la rotación de la pantalla se envían a cada instancia deIModule
. Una interfazIBluetooth
dedicada controla los parámetros relacionados con la conexión síncrona orientada a la conexión Bluetooth (BT SCO) y el perfil de manos libres (HFP). Una interfazITelephony
dedicada proporciona controles específicos de telefonía. Las instancias de ambas interfaces se pueden recuperar de la instancia principal de la interfazIModule
. Para obtener más información, consulta las tablas de comparación en HAL principal y Funcionalidad relacionada con las funciones.Se quitó
IDevicesFactory
en el HAL de audio de AIDL para evitar redundancias. Los módulos HAL (es decir, las instancias de la interfazIModule
) ahora se registran directamente en el Service Manager con sus nombres para los nombres de instancia, comobluetooth
or_submix
. La única excepción es el móduloprimary
, que se registra con el nombre de instanciadefault
.
Asignación de la HAL de audio de AIDL y HIDL
En las tablas de las siguientes secciones, se muestra la asignación entre las interfaces de HIDL y AIDL de HAL de audio. Consulta el archivo README del 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 de Major.Minor. Todas las interfaces de AIDL se encuentran dentro del paquete android.hardware.audio.core
.
Interfaces de API de HIDL y archivos de configuración | Interfaces de API de 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 | Usa la implementación del HIDL para Android 14. |
Puertos de audio, perfiles dinámicos, rutas y parches
En esta tabla, los elementos de los archivos XML se designan con corchetes angulares.
Métodos de interfaz de la API de HIDL y elementos de archivos de configuración | Métodos de la interfaz de la API de 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
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 la interfaz de la API de HIDL | Métodos de la 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 devuelve el 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 la interfaz de la API de HIDL | Métodos de la interfaz de la API de AIDL |
---|---|
IDevice.addDeviceEffect
IDevice.removeDeviceEffect |
IModule.addDeviceEffect
IModule.removeDeviceEffect |
IStream.addEffect
IStream.removeEffect |
IStreamCommon.addEffect
IStreamCommon.removeEffect |
Configuración en todo el sistema
La configuración de todo el sistema que antes se definía 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 XML que usaban anteriormente para establecer la configuración en todo el sistema. La implementación de referencia para IConfig
contiene el código necesario para representar la información del archivo XML con tipos de datos de AIDL, lo que facilita la conversión de XML a AIDL.
Elementos del archivo de configuración de HIDL | Métodos de la interfaz de la API de AIDL |
---|---|
<globalConfiguration>
<speaker_drc_enabled> <call_screen_mode_supported>
<engine_library> |
Se separó en dos métodos diferentes:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> O
<volumeGroups> , <ProductStrategies>
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
speaker_drc_enabled
se quita del archivo de configuración, ya que este elemento de configuración no se usa en el sistema. Todos los dispositivos deben tener habilitado el DRC. <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
Funcionalidad relacionada con las funciones
Métodos de la interfaz de la API de HIDL | Interfaz de 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 la interfaz de la API de HIDL | Comentarios |
---|---|
IDevice.initCheck IDevice.close |
El módulo HAL se publica con ServiceManager solo si la inicialización se realiza correctamente. En ese momento, se considera permanente y no se puede cerrar. |
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain |
Es obligatorio admitir parches, pausas, reanudaciones y drenaje. |
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 usando la encapsulación dentro de ParcelableHolders
.
Otros cambios
Otros cambios generales son los siguientes:
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 que están disponibles a través del objeto
ModuleDebug
parcelable. Estas opciones indican al HAL que emule ciertas funcionalidades (por ejemplo, la conexión de dispositivos externos), que, de otro modo, requerirían la intervención manual y el uso de equipos de prueba externos.Los servicios de HAL deben reiniciarse cuando el valor de la propiedad del sistema
sys.audio.restart.hal
se establece en1
. El reinicio se logra a través deaudioserver.rc
. Cuando implementes el HAL, usa el nombre de servicio del HAL adecuado que se indica en el archivoaudioserver.rc
. En Android 14, se agrega el nombrevendor.audio-hal-aidl
específicamente para la versión de AIDL de la HAL.
HAL de efectos
Todas las interfaces de HIDL se encuentran dentro del paquete android.hardware.audio.effect@N.M*
, en el que N.M
es la versión de Major.Minor. Todas las interfaces de AIDL se encuentran dentro del paquete android.hardware.audio.effect
.
Interfaces de API de HIDL y archivos de configuración | Interfaces de API de AIDL |
---|---|
IEffectsFactory |
IFactory |
IEffect |
IEffect |
audio_effects.xml |
IEffect |
Effect Factory
Interfaces de 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 parámetro UUID |
IEffectsFactory.createEffect |
IFactory.createEffect |
audio_effects.xml |
IFactory.queryProcessing
IFactory.queryEffects |
Interfaces de efectos
Interfaces de 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 |
Se 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 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 la HAL de AIDL de Effects |
EFFECT_CMD_SET_PARAM_COMMIT |
Se dio de baja en la HAL de 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 AIDL, los cambios de modo de descarga y de no descarga se controlan en el framework. |
EFFECT_CMD_DUMP |
Se controla con la transacción de Binder integrada AIBinder_dump . |
Definición de los parámetros de Common 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 API de HIDL (android.hardware.audio.effect@X.X) |
Interfaces de la API de AIDL (android.hardware.audio.effect) |
---|---|
I$EffectType$.hal |
$EffectType$.aidl |