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étodoIConfig.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 usandoIFactory.queryEffects
y todos los procesamientos de efectos usandoIFactory.queryProcessing
.Para evitar confusiones con el uso del término dispositivo para tipos de dispositivos de audio,
IDevice
en HIDL Audio HAL pasa a llamarseIModule
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 instanciaIModule
. Los parámetros relacionados con la conexión síncrona Bluetooth orientada (BT SCO) y el perfil manos libres (HFP) son manejados por una interfazIBluetooth
dedicada. Una interfazITelephony
dedicada proporciona controles específicos de telefonía. Las instancias de ambas interfaces se pueden recuperar desde la instancia principal de la interfazIModule
. 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 interfazIModule
) ahora se registran directamente con el Administrador de servicios usando sus nombres, por ejemplo, nombres de instancia, comobluetooth
or_submix
. La única excepción es el móduloprimary
que se registra con el nombre de instanciadefault
.
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.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> <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 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:
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.Los servicios 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
. Al implementar HAL, utilice el nombre de servicio HAL apropiado que figura en el archivoaudioserver.rc
. En Android 14, el nombrevendor.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 oIEffect.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 |