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
接口实例)现在使用其名称作为实例名称(例如bluetooth
或r_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.getPresentationPosition 和 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 、标称延迟时间和最小缓冲区大小是 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.xml
和 audio_policy_engine_configuration.xml
)必须通过 IConfig
提供。不过,为了轻松过渡到 AIDL,供应商也可以选择使用之前用于设置系统级配置的 XML 文件。IConfig
的参考实现包含使用 AIDL 数据类型表示 XML 文件中的信息所需的代码,该方法有助于从 XML 转换为 AIDL。
HIDL 配置文件元素 | AIDL API 接口方法 |
---|---|
<globalConfiguration> <speaker_drc_enabled> <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 中,供应商扩展是使用 IDevice
和 IStream
接口中的 getParameters
或 setParameters
方法实现的。这些方法接受任意字符串。在 AIDL API 中,有相应的方法(例如 getVendorParameters
或 setVendorParameters
),它们可以通过在 ParcelableHolders
中使用封装方法获取任意 Parcelable
实例。
其他变更
其他一般更改如下:
- 为了提高 HAL API 的可测试性,我们在 AIDL 版本中引入了 VTS 测试使用的调试选项,并通过
ModuleDebug
parcelable 提供。这些选项会指示 HAL 模拟某些功能(例如连接外部设备),这本来需要手动干预和使用外部测试设备。 - 当系统属性
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.M
是 Major.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.command 、 IEffect.setParameter 或 IEffect.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 |
转载自Android官网,原文地址: https://source.android.com/docs/core/audio/aidl-hidl-comp?hl=zh-cn
脚注
- 已从配置文件中移除
speaker_drc_enabled
,因为此配置项不会在系统内使用。所有设备都必须启用 DRC。 ↩