AIDL 和 HIDL 音频 HAL 比较

本文最后更新于 2024年4月27日 晚上

从 Android 14 开始,我们鼓励合作伙伴和 SoC 供应商将当前 HIDL HAL 实现替换为 AIDL HAL 实现。

为了方便从 HIDL 音频 HAL 顺利过渡到 AIDL 音频 HAL,本页面上重点介绍了一些关键差异。该页面还显示了音频 HAL 的 AIDL 接口和 HIDL 接口之间的映射。

注意:供应商可以在供应商分区上提供 HIDL 或 AIDL 实现,因为框架支持这两种实现。

AIDL 实现与 HIDL 音频 HAL 实现之间的区别

HIDL 结构和 AIDL 结构之间的主要区别如下:

  • AIDL 音频核心 HAL 中,引入了 IConfig 接口以替代 HIDL HAL 中的 XML 文件中的系统级参数。框架从 Core HAL(而不是供应商配置文件)读取这些参数。例如,为了便于用户控制而呈现的环绕格式列表由 Core HAL 中的 IConfig.getSurroundSoundConfig 方法提供。

    AIDL 音效 HAL 中,HIDL 音效 HAL 中的 XML 文件中定义的 effectProxy 逻辑已移至音频框架。音频框架使用 IFactory.queryEffects 查询系统中的所有效果实例,使用 IFactory.queryProcessing 查询所有效果处理。

  • 为避免使用“设备”这一术语来描述音频设备类型可能产生的混淆,为避免这种情况,HIDL 音频 HAL 中的 IDevice 在 AIDL 音频 HAL 中重命名为 IModule

  • IPrimaryDevice 已替换为 AIDL 音频 HAL。系统会将当前音频模式和屏幕旋转方向的更新发送到每个 IModule 实例。与蓝牙同步连接导向 (BT SCO) 和免触摸配置文件 (HFP) 相关的参数由专用 IBluetooth 接口处理。专用 ITelephony 接口提供特定于电话的控件。这两个接口的实例均可从 IModule 接口的主实例中检索。如需了解详情,请参阅核心 HAL功能相关功能的比较表。

  • IDevicesFactory 已从 AIDL 音频 HAL 中移除,以避免冗余。HAL 模块(即 IModule 接口实例)现在使用其名称作为实例名称(例如 bluetoothr_submix)直接进行 Service Manager 注册。唯一的例外情况是 primary 模块,该实例在实例名称 default 下注册。

AIDL 和 HIDL 音频 HAL 映射

以下部分中的表显示了 HIDL 与 AIDL 音频 HAL 接口之间的映射。如需详细了解目录结构,请参阅音频 HAL 自述文件

Core HAL

所有 HIDL 接口都在 android.hardware.audio@N.M 软件包中,其中 N.M 表示 Major.Minor 版本。所有 AIDL 接口都在 android.hardware.audio.core 软件包中。

HIDL API 接口和配置文件 AIDL API 接口
IDevicesFactory ServiceManager 注册 IModule
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
可配置的音频政策文件 在 Android 14 中使用 HIDL 实现。

音频端口、动态配置文件、路由和补丁

在该表中,XML 文件的元素用尖括号表示。

HIDL API 接口方法和配置文件元素 AIDL API 接口方法
<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
IDevice.openInputStream 中的设备规格
IDevice.openOutputStream
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch

音频端口配置和流

HIDL API 接口方法 AIDL API 接口方法
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.getPresentationPositionIStreamIn.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、标称延迟时间和最小缓冲区大小是 HAL 返回的 AudioPatch 结构的一部分。 以帧为单位的实际缓冲区空间是 StreamDescriptor 结构的一部分(该结构同样还包括以字节为单位的帧大小)。缓冲区大小(以字节为单位)可通过乘以这两个数字计算得出。

音效连接

HIDL API 接口方法 AIDL API 接口方法
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

系统级配置

之前在音频政策 XML 配置文件中定义的系统级配置(即 audio_policy_configuration.xmlaudio_policy_engine_configuration.xml)必须通过 IConfig 提供。不过,为了轻松过渡到 AIDL,供应商也可以选择使用之前用于设置系统级配置的 XML 文件。IConfig 的参考实现包含使用 AIDL 数据类型表示 XML 文件中的信息所需的代码,该方法有助于从 XML 转换为 AIDL。

HIDL 配置文件元素 AIDL API 接口方法
<globalConfiguration>
<speaker_drc_enabled>[1]

<call_screen_mode_supported>
<engine_library>
分为两种不同的方法: ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes>,或
<volumeGroups><ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

与功能相关的功能

HIDL API 接口方法 AIDL API 接口
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(回调合并到 IStreamOutEventCallback 中)
IDevice.get/setParameters
IStream.get/setParameters
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters

已过时的方法

HIDL API 接口方法 注释
IDevice.initCheck
IDevice.close
只有在初始化成功时,HAL 模块才会使用 ServiceManager 自行发布。届时,系统会将其视为永久性操作,无法关闭。
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume IStreamOut.supportsDrain
必须支持补丁、暂停、恢复和排空。
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
已过时。

供应商扩展

在 HIDL API 中,供应商扩展是使用 IDeviceIStream 接口中的 getParameterssetParameters 方法实现的。这些方法接受任意字符串。在 AIDL API 中,有相应的方法(例如 getVendorParameterssetVendorParameters),它们可以通过在 ParcelableHolders 中使用封装方法获取任意 Parcelable 实例。

其他变更

其他一般更改如下:

  1. 为了提高 HAL API 的可测试性,我们在 AIDL 版本中引入了 VTS 测试使用的调试选项,并通过 ModuleDebug parcelable 提供。这些选项会指示 HAL 模拟某些功能(例如连接外部设备),这本来需要手动干预和使用外部测试设备。
  2. 当系统属性 sys.audio.restart.hal 的值设置为 1 时,需要重启 HAL 服务。重启是通过 audioserver.rc 实现的。实现 HAL 时,请使用 audioserver.rc 文件中列出的适当 HAL 服务名称。在 Android 14 中,专门为 AIDL 版本的 HAL 添加了名称 vendor.audio-hal-aidl

Effects HAL

所有 HIDL 接口都在 android.hardware.audio.effect@N.M\* 软件包中,其中 N.MMajor.Minor 版本。所有 AIDL 接口都在 android.hardware.audio.effect 软件包内。

HIDL API 接口和配置文件 AIDL API 接口
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

效果工厂

HIDL API 接口
(android.hardware.audio.effect@X.X)
AIDL API 接口
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors IFactory.queryEffects(具有空 UUID 参数)
IEffectsFactory.getDescriptor IFactory.queryEffects(具有空 UUID 参数)
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing IFactory.queryEffects

效果接口

HIDL API 接口
(android.hardware.audio.effect@X.X)
AIDL API 接口
(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 根据旧版 HIDL 命令的类型映射到 IEffect.commandIEffect.setParameterIEffect.getParameter
N/A IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

效果命令

HIDL API 接口
(android.hardware.audio.effect@X.X)
AIDL API 接口
(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 Effects AIDL HAL 中已废弃
EFFECT_CMD_SET_PARAM_COMMIT Effects 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 (与 VISUALIZER_CMD_CAPTURE 相同)
IEffect.getParameter
EFFECT_CMD_OFFLOAD 已废弃。 在 AIDL 中,分流模式和非分流模式开关在框架中进行处理。
EFFECT_CMD_DUMP 由内置 Binder 事务 AIBinder_dump 处理。

通用效果参数定义

HIDL 定义
(android.hardware.audio.effect@X.X)
AIDL 定义
Types.hal Flags.aidl
Parameter.aidl

具体效果定义

HIDL API 接口
(android.hardware.audio.effect@X.X)
AIDL API 接口
(android.hardware.audio.effect)
I*$EffectType$*.hal *$EffectType$*.aidl

脚注

  1. 已从配置文件中移除 speaker_drc_enabled,因为此配置项不会在系统内使用。所有设备都必须启用 DRC。

AIDL 和 HIDL 音频 HAL 比较
https://www.shangyexin.com/2024/09/02/audio-aidl-hidl-comp/
作者
Yasin
发布于
2024年9月2日
许可协议