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étodoIConfig.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 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 y la rotación de la pantalla actuales se envían a cada instancia deIModule
. 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 interfazIBluetooth
dedicada. Una interfazITelephony
dedicada proporciona controles específicos para la telefonía. Las instancias de ambas interfaces se pueden recuperar desde la instancia principal de la interfazIModule
. 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 interfazIModule
) ahora se registran directamente con el Administrador de servicios usando sus nombres como nombres de instancia, comobluetooth
or_submix
. La única excepción es el móduloprimary
, que se registra con el nombre de la instanciadefault
.
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.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> <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 |
-
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:
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.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 sistema HAL, usa el nombre de servicio de HAL apropiado que se indica en el archivoaudioserver.rc
. En Android 14, el nombrevendor.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 |