当前位置: 首页 > news >正文

AIDL和HIDL的AudioHal对比

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
IDeviceIModule
IPrimaryDeviceITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
可配置的音频政策文件在 Android 14 中使用 HIDL 实现。

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

HIDL API 接口方法和配置文件元素AIDL API 接口方法
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts>
IModule.getAudioPorts
IDevice.getAudioPort
IDevice.setConnectedState
IModule.getAudioPort
IModule.connectExternalDevice
IModule.disconnectExternalDevice
IStream.getSupportedProfilesIModule.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.closeIStreamCommon.close
IStreamIn.updateSinkMetadata
IStreamOut.updateSourceMetadata
IStreamIn.updateMetadata
IStreamOut.updateMetadata
IStream.standbyStreamDescriptor.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>
<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
已过时。

Effects HAL

HIDL API 接口和配置文件AIDL API 接口
IEffectsFactoryIFactory
IEffectIEffect
audio_effects.xmlIEffect

效果工厂

HIDL API 接口
(android.hardware.audio.effect@X.X)
AIDL API 接口
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptorsIFactory.queryEffects(具有空 UUID 参数)
IEffectsFactory.getDescriptorIFactory.queryEffects(具有空 UUID 参数)
IEffectsFactory.createEffectIFactory.createEffect
audio_effects.xmlIFactory.queryProcessing
IFactory.queryEffects

效果接口

HIDL API 接口
(android.hardware.audio.effect@X.X)
AIDL API 接口
(android.hardware.audio.effect)
IEffect.initIEffect.open
IEffect.setConfigIEffect.setParameter
IEffect.enableIEffect.command(CommandId::START)
IEffect.disableIEffect.command(CommandId::STOP)
IEffect.resetIEffect.command(CommandId::RESET)
IEffect.getDescriptorIEffect.getDescriptor
IEffect.command根据旧版 HIDL 命令的类型映射到 IEffect.command
IEffect.setParameter 或
IEffect.getParameter
不适用IEffect.getState
IEffect.setParameterIEffect.setParameter
IEffect.getParameterIEffect.getParameter

效果命令

HIDL API 接口
(android.hardware.audio.effect@X.X)
AIDL API 接口
(android.hardware.audio.effect)
EFFECT_CMD_INITIEffect.open
EFFECT_CMD_RESETCommandId.RESET
EFFECT_CMD_ENABLEIEffect.command(CommandId::START)
EFFECT_CMD_DISABLEIEffect.command(CommandId::STOP)
EFFECT_CMD_SET_PARAM_DEFERREDEffects AIDL HAL 中已废弃
EFFECT_CMD_SET_PARAM_COMMITEffects 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.halFlags.aidl
Parameter.aidl

具体效果定义

HIDL API 接口
(android.hardware.audio.effect@X.X)
AIDL API 接口
(android.hardware.audio.effect)
I$EffectType$.hal$EffectType$.aidl
http://www.dtcms.com/a/352548.html

相关文章:

  • Maya绑定基础: FK 和 IK 介绍和使用
  • lottie动画动态更改切图添加事件
  • 五自由度磁悬浮轴承:精准狙击转子质量不平衡引发的同频振动
  • pycharm 远程连接服务器报错
  • NeRAF、ImVid论文解读
  • 2007-2022年上市公司企业关联交易数据
  • 面向对象爬虫架构设计:构建高复用、抗封禁的爬虫系统​
  • 工业数据消费迎来“抖音式”革命:TDengine IDMP 让数据自己开口说话
  • 利用 Java 爬虫按关键字搜索 1688 商品详情 API 返回值说明实战指南
  • 如何在360极速浏览器中调出底部状态栏
  • Wireshark和USRP捕获同一信号波形差异原因
  • MQ 最终一致性实现跨库转账
  • ArcGIS学习-11 实战-商场选址
  • 【Vue3】Cesium实现雨雪效果
  • onnx入门教程(五)——实现 PyTorch-ONNX 精度对齐工具
  • 子串:和为K的子数组
  • 高并发内存池(7)- CentralCache的核心设计
  • 如何对springboot mapper 编写单元测试
  • MATLAB Figure画布中绘制表格详解
  • Cortex-M 的Thumb指令集?
  • k8s pod 启动失败 Failed to create pod sandbox
  • Il2CppInspector 工具linux编译使用
  • 算法概述篇
  • Markdown渲染引擎——js技能提升
  • MyBatis-Flex是如何避免不同数据库语法差异的?
  • 【electron】一、安装,打包配置
  • 全面赋能政务领域——移动云以云化升级推动政务办公效能跃迁
  • 【硬件-笔试面试题-61】硬件/电子工程师,笔试面试题(知识点:RC电路中的充电时间常数)
  • vue3 + jsx 中使用native ui 组件插槽
  • babel使用及其底层原理介绍