AIDL和HIDL的AudioHal对比
HIDL 定义AIDL 定义Types.halFlags.aidlHIDL API 接口AIDL API 接口。
Android 的音频硬件抽象层 (HAL) 可将 android.media 中较高层级的音频专用框架 API 连接到底层的音频驱动程序和硬件。音频 HAL 定义了音频服务会调用的标准接口,必须实现音频 HAL 才能使音频硬件正常运行。
从 Android 14 开始,使用 AIDL 定义音频 HAL 接口。扩展 libaudiohal 库可以增加对 AIDL HAL 的框架支持。使用 AIDL 实现时,音频政策配置规范会移至 AIDL HAL。进行此更改后,AudioPolicyManager会从 HAL 获取配置,而不是从供应商提供的 XML 文件中使用配置。
AIDL API 的默认实现路径 /hardware/interfaces/audio/aidl/default/ 。
AIDL的音频 HAL API
AIDL音频 HAL 包含以下 API:
Core HAL 是 AudioFlinger 用于播放音频和控制音频路由的主要 API。
Effects HAL API 供效果框架用于控制音频效果。 还可以通过 Effects HAL API 配置预处理效果,如自动增益控制和噪音抑制。
Common HAL API 是 Core HAL API 和 Effects HAL API 使用的常用数据类型的库。Common HAL 只定义数据结构,因此没有接口也没有关联的 VTS 测试。
下图是HIDL和AIDL的API文件对比


Core HAL
部分使用 AIDL 的 Core HAL 关键接口如下所示:
- IModule.aidl 是 API 的入口点。
- 音频流是单向的,AudioFlinger 使用音频流通过 IStreamOut.aidl 和 IStreamIn.aidl 向 HAL 发送音频或从 HAL 接收音频。
- ITelephony.aidl 提供了特定于电话功能的控件。
- IBluetooth.aidl 提供 HIDL API 中 IPrimaryModule 的 BT SCO 和 HFP 控件。
- IConfig.aidl 提供系统级配置参数。
- ISoundDose.aidl 提供音量支持。如需了解详情,请参阅声音剂量。
- 最新版本的 Core HAL API(开发中)位于 /hardware/interfaces/audio/aidl/android/hardware/audio/core/。
- Core HAL API 的最新版本(已发布)位于 /hardware/interfaces/audio/aidl/aidl_api/android.hardware.audio.core/。
Effects HAL
使用 AIDL 的 Effects HAL 的一些关键接口如下所示:
- IFactory.aidl 是 API 的入口点。
- Descriptor.aidl 包含效果实现的所有功能和属性。
- Capability.aidl 定义了在运行时不会变化的效果功能。
- Parameter.aidl 用于定义效果实例支持的所有参数。
- IEffect.aidl 用于配置和控制特定的效果实例。
- 特定效果的 Parcelable,以该效果命名。
- 最新版本的 Effects HAL API(开发中)位于 /hardware/interfaces/audio/aidl/android/hardware/audio/effect/。
- Effects HAL API 的最新版本(已发布)位于 /hardware/interfaces/audio/aidl/aidl_api/android.hardware.audio.effect。
Common HAL
各种 HAL(如 BT HAL、核心 HAL 和音效 HAL)共用的数据结构和接口位于通用 HAL 中。
- 通用 AIDL HAL 的最新版本(开发中)位于 /hardware/interfaces/audio/aidl/android/hardware/audio/common/。
- 通用 HAL API 的最新版本(已发布)位于 /hardware/interfaces/audio/aidl/aidl_api/android.hardware.audio.common/current/android/hardware/audio/common/。
AIDL 实现与 HIDL 音频 HAL 实现之间的区别
- 在 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。
- AIDL 音频 HAL 中的 IPrimaryDevice 已被替换。系统会将当前音频模式和屏幕旋转方向的更新发送到每个 IModule 实例。与蓝牙同步连接导向 (BT SCO) 和免触摸配置文件 (HFP) 相关的参数由专用 IBluetooth 接口处理。专用 ITelephony 接口提供特定于电话的控件。这两个接口的实例均可从 IModule 接口的主实例中检索。如需了解详情,请参阅核心 HAL 和功能相关功能的比较表。
- IDevicesFactory 已从 AIDL 音频 HAL 中移除,以避免冗余。HAL 模块(即 IModule 接口实例)现在使用其名称作为实例名称(例如 bluetooth 或 r_submix)直接进行 Service Manager 注册。唯一的例外情况是 primary 模块,该实例在实例名称 default 下注册。
对audio_policy_configuration.xml的兼容
Android13和以前的版本中,是在AudioPolicyManager::loadConfig()中加载audio_policy_configuration.xml
Android14中,在AudioPolicyService.cpp中初始化AudioPolicyManager时,如果没能从hal层获取到config,就会去加载audio_policy_configuration.xml
static AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface)
{
AudioPolicyManager *apm = nullptr;
media::AudioPolicyConfig apmConfig;
if (status_t status = clientInterface->getAudioPolicyConfig(&apmConfig); status == OK) {
auto config = AudioPolicyConfig::loadFromApmAidlConfigWithFallback(apmConfig);
LOG_ALWAYS_FATAL_IF(config->getEngineLibraryNameSuffix() !=
AudioPolicyConfig::kDefaultEngineLibraryNameSuffix,
"Only default engine is currently supported with the AIDL HAL");
apm = new AudioPolicyManager(config,
loadApmEngineLibraryAndCreateEngine(
config->getEngineLibraryNameSuffix(), apmConfig.engineConfig),
clientInterface);
} else {
auto config = AudioPolicyConfig::loadFromApmXmlConfigWithFallback(); // This can't fail.
apm = new AudioPolicyManager(config,
loadApmEngineLibraryAndCreateEngine(config->getEngineLibraryNameSuffix()),
clientInterface);
}
status_t status = apm->initialize();
if (status != NO_ERROR) {
delete apm;
apm = nullptr;
}
return apm;
}
AIDL 和 HIDL 音频 HAL 映射
以下内容来自安卓官网,为了在网络不便时查阅,搬运到这里。
https://source.android.com/docs/core/audio/aidl-hidl-comp?hl=zh-cn
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 |
ITelephonyIBluetooth |
IStreamIStreamInIStreamOut |
StreamDescriptorIStreamInIStreamCommonIStreamOut |
audio_policy_configuration.xmlaudio_policy_engine_configuration.xml |
IConfigIModule |
| 可配置的音频政策文件 | 在 Android 14 中使用 HIDL 实现。 |
音频端口、动态配置文件、路由和补丁
| HIDL API 接口方法和配置文件元素 | AIDL API 接口方法 |
<attachedDevices><defaultOutputDevice><mixPorts><devicePorts> |
IModule.getAudioPorts |
IDevice.getAudioPortIDevice.setConnectedState |
IModule.getAudioPortIModule.connectExternalDeviceIModule.disconnectExternalDevice |
IStream.getSupportedProfiles |
IModule.connectExternalDevice |
<routes> |
IModule.getAudioRoutes |
IDevice.createAudioPatchIDevice.updateAudioPatchIDevice.releaseAudioPatchIStream.getDevicesIStream.setDevicesIDevice.openInputStream 中的设备规格IDevice.openOutputStream |
IModule.setAudioPatchIModule.setAudioPortConfigIModule.resetAudioPatch |
音频端口配置和流
| HIDL API 接口方法 | AIDL API 接口方法 |
|---|---|
IStream.getAudioPropertiesIStream.setAudioPropertiesIStreamIn.getAudioSource |
IModule.getAudioPortConfigsIModule.setAudioPortConfig |
IDevice.openInputStreamIDevice.openOutputStreamIStreamIn.prepareForReadingIStreamOut.prepareForWritingIStream.createMmapBuffer |
IModule.openInputStreamIModule.openOutputStream |
IStream.close |
IStreamCommon.close |
IStreamIn.updateSinkMetadataIStreamOut.updateSourceMetadata |
IStreamIn.updateMetadataIStreamOut.updateMetadata |
IStream.standby |
StreamDescriptor.Command.standby |
IStream.pauseIStream.resumeIStream.startIStream.stop |
StreamDescriptor.Command.pause.start.start.drain |
IStreamOut.drainIStreamOut.flush |
StreamDescriptor.Command.drain.flush |
IStreamOut.setCallbackIStreamOut.clearCallback |
IModule.openOutputStreamIStreamCommon.close |
IStreamOut.getPresentationPosition 和 IStreamIn.getCapturePositionIStreamOut.getLatencyIStream.getMmapPositionIStreamIn.getInputFramesLost |
StreamDescriptor.Reply.observableStreamDescriptor.Reply.latencyMsStreamDescriptor.Reply.hardwareStreamDescriptor.Reply.xrunFrames |
IDevice.getInputBufferSizeIStreamOut.getLatencyIStream.getBufferSizeIStream.getFrameSizeIStream.getFrameCount |
IModule.setAudioPatch、标称延迟时间和最小缓冲区大小是 HAL 返回的 AudioPatch 结构的一部分。 以帧为单位的实际缓冲区空间是 StreamDescriptor 结构的一部分(该结构同样还包括以字节为单位的帧大小)。缓冲区大小(以字节为单位)可通过乘以这两个数字计算得出。 |
音效连接
| HIDL API 接口方法 | AIDL API 接口方法 |
|---|---|
IDevice.addDeviceEffectIDevice.removeDeviceEffect |
IModule.addDeviceEffectIModule.removeDeviceEffect |
IStream.addEffectIStream.removeEffect |
IStreamCommon.addEffectIStreamCommon.removeEffect |
系统级配置
之前在音频政策 XML 配置文件中定义的系统级配置(即 audio_policy_configuration.xml 和 audio_policy_engine_configuration.xml)必须通过 IConfig 提供。不过,为了轻松过渡到 AIDL,供应商也可以选择使用之前用于设置系统级配置的 XML 文件。IConfig 的参考实现包含使用 AIDL 数据类型表示 XML 文件中的信息所需的代码,该方法有助于从 XML 转换为 AIDL。
| HIDL 配置文件元素 | AIDL API 接口方法 |
|---|---|
<globalConfiguration><call_screen_mode_supported><engine_library> |
分为两种不同的方法:ITelephony.getSupportedAudioModesIConfig.getEngineConfig |
<volumes>,或<volumeGroups>、<ProductStrategies> |
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
与功能相关的功能
| HIDL API 接口方法 | AIDL API 接口 |
|---|---|
IDevice.setMasterVolumeIDevice.getMasterVolumeIDevice.setMicMuteIDevice.getMicMuteIDevice.setMasterMuteIDevice.getMasterMute |
IModule.\* |
IPrimaryDevice.getTtyModeIPrimaryDevice.setTtyModeIPrimaryDevice.getHacEnabledIPrimaryDevice.setHacEnabledIPrimaryDevice.setVoiceVolume |
ITelephony.TelecomConfig.\* |
IPrimaryDevice.setBtScoHeadsetDebugNameIPrimaryDevice.getBtScoNrecEnabledIPrimaryDevice.setBtScoNrecEnabledIPrimaryDevice.getBtScoWidebandEnabledIPrimaryDevice.setBtScoWidebandEnabled,IPrimaryDevice.getBtHfpEnabledIPrimaryDevice.setBtHfpEnabledIPrimaryDevice.setBtHfpSampleRateIPrimaryDevice.setBtHfpVolume |
IBluetooth.ScoConfig.\*IBluetooth.HfpConfig.\* |
IPrimaryDevice.setModeIPrimaryDevice.updateRotation |
ITelephony.switchAudioModeIModule.updateAudioModeIModule.updateScreenRotation |
IDevice.setScreenStateIDevice.getMicrophones |
IModule.updateScreenStateIModule.getMicrophones |
IDevice.getHwAvSyncIStream.setHwAvSync |
IModule.generateHwAvSyncIdIStreamCommon.updateHwAvSyncId |
IStreamIn.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension |
IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension |
IStreamOut.getDualMonoModeIStreamOut.setDualMonoModeIStreamOut.getPlaybackRateParametersIStreamOut.setPlaybackRateParametersIStreamOut.selectPresentationIStreamOut.getAudioDescriptionMixLevelIStreamOut.setAudioDescriptionMixLevelIStreamOut.setLatencyModeIStreamOut.getRecommendedLatencyModes |
IStreamOut.\* |
IStreamOut.setEventCallbackIStreamOut.setLatencyModeCallback |
IModule.openOutputStream(回调合并到 IStreamOutEventCallback 中) |
IDevice.get/setParametersIStream.get/setParameters |
IModule.get/setVendorParametersIStreamCommon.get/setVendorParameters |
已过时的方法
| HIDL API 接口方法 | 注释 |
|---|---|
IDevice.initCheckIDevice.close |
只有在初始化成功时,HAL 模块才会使用 ServiceManager 自行发布。届时,系统会将其视为永久性操作,无法关闭。 |
IDevice.supportsAudioPatchesIStreamOut.supportsPauseAndResumeIStreamOut.supportsDrain |
必须支持补丁、暂停、恢复和排空。 |
IStreamOut.getRenderPositionIStreamOut.getNextWriteTimestamp |
已过时。 |
Effects HAL
| 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.queryProcessingIFactory.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 |
| 不适用 | 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_CONFIGEFFECT_CMD_SET_PARAMEFFECT_CMD_SET_DEVICEEFFECT_CMD_SET_VOLUMEEFFECT_CMD_SET_AUDIO_MODEEFFECT_CMD_SET_CONFIG_REVERSEEFFECT_CMD_SET_INPUT_DEVICEEFFECT_CMD_SET_FEATURE_CONFIGEFFECT_CMD_SET_AUDIO_SOURCE |
IEffect.setParameter |
EFFECT_CMD_GET_PARAMEFFECT_CMD_GET_CONFIGEFFECT_CMD_GET_CONFIG_REVERSEEFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGSEFFECT_CMD_GET_FEATURE_CONFIGVISUALIZER_CMD_MEASUREEFFECT_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.aidlParameter.aidl |
具体效果定义
| HIDL API 接口 (android.hardware.audio.effect@X.X) |
AIDL API 接口 (android.hardware.audio.effect) |
|---|---|
I$EffectType$.hal |
$EffectType$.aidl |
更多推荐


所有评论(0)