在 Android 13 及更低版本中,音频 HAL 接口使用 HIDL 在 HIDL HAL 文件(扩展名为 .hal
)和 XSD 架构中定义,用于配置文件,如下所示。
图 1. 音频 HAL 接口。
配置文件
音频政策和音频效果 XML 配置文件被视为音频 HIDL HAL 接口的一部分。这些文件必须符合其架构,并且 VTS 测试会验证其合规性。
作为实现音频 HIDL HAL 的一部分,您必须创建一个音频政策配置文件,用于描述音频拓扑。音频 HAL 功能必须在 audio_policy_configuration.xml
文件中声明,框架才能使用它们。
音频 HIDL HAL API
本部分介绍用于 HIDL 的核心、效果和通用 HAL API。
核心 HAL
以下是使用 HIDL 的核心 HAL 的一些关键接口
IDeviceFactory.hal
是 API 的入口点。IDevice.hal
和IPrimaryDevice.hal
包含setMasterVolume
或openInputStream
等方法。- 流是单向的,AudioFlinger 使用流通过
IStream.hal
、IStreamOut.hal
和IStreamIn.hal
向 HAL 发送音频或从 HAL 接收音频。
下表列出了有用的核心 HAL HIDL 组件的位置
核心 HAL 组件 | 位置 |
---|---|
API 的最新版本 | /hardware/interfaces/audio/6.0
|
特定于最新核心 HAL API 的类型 | /hardware/interfaces/audio/6.0/types.hal
|
音频政策配置文件 XSD 架构 | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
核心 HAL API 的默认实现 (/hardware/interfaces/audio/core/all-versions/default/
) 是使用 旧版共享库对 Treble 之前的 HAL 实现进行的封装。当实现直接与内核驱动程序交互的新版本音频 HAL 时,默认实现也可以被视为参考。
效果 HAL
下表列出了使用 HIDL 的有用效果 HAL 组件的位置
效果 HAL 组件 | 位置 |
---|---|
API 的最新版本 | /hardware/interfaces/audio/effect/6.0/
|
效果配置文件 XSD 架构 | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
如需了解更多信息,请参阅效果 HAL API 的示例实现,网址为 /hardware/interfaces/audio/effect/all-versions/default/
以及音频效果部分。
通用 HAL
使用 HIDL 的通用 HAL API 包含以下内容
- 核心和效果 API 共享的定义 (
/hardware/interfaces/audio/common/6.0/types.hal
)。 - 用于帮助针对 HIDL API 进行编码以实现实现、客户端和测试的实用程序 (
/hardware/interfaces/audio/common/all-versions
)。
音频 HAL V7 的更新
Android 12 中的音频 HAL V7 版本发生了重大变化,本部分将对此进行概述。音频 HAL V7 执行以下操作
- 统一了框架和 HAL 使用的数据模型。
- 最大限度地减少了 HIDL 数据类型(枚举)与用于音频政策配置的 XML 架构之间的重复。
具体而言,音频 HAL V7 在以下领域进行了更改
这些更改将在各自的部分中进行更详细的讨论。
枚举
从音频 HAL V7 开始,音频政策配置文件中使用的枚举类型仅在 XSD 架构中定义,而不在 HIDL 中定义。
在 Audio HAL V6 中,枚举类型的值(例如 AudioFormat
)在 types.hal
中也有定义,并且在音频策略配置文件 XSD 架构中重复定义。为了避免在 V7 中出现这种情况,枚举类型已更改为 string
,并且所有可能的枚举值都列在 XSD 架构中。
图 2 比较了 V7 中对 AudioFormat
枚举类型所做的一些更改
图 2. AudioFormat 枚举类型的一些更改的比较。
请参阅以下列表,了解已转换为 string
的枚举类型
AudioChannelMask
AudioContentType
AudioDevice
:供应商可扩展AudioFormat
:供应商可扩展AudioGainMode
AudioSource
AudioStreamType
AudioUsage
传递字符串枚举值
字符串值用于在 HAL 接口边界上传输信息作为枚举值。框架和 HAL 封装容器都使用整数枚举值来实现业务逻辑,并采用 图 3 中描述的转换方法
图 3. 传递字符串枚举值。
例如,要将音频格式类型的值从框架传递到供应商
AudioFormat
的枚举值在libaudiohal
中转换为字符串值,并传递到 HAL。- 在 HAL 端,默认封装容器将字符串转换为枚举值,该值将传递到旧版 HAL。
XML 架构更改
在 XML 架构定义 (XSD) 中拥有完整的枚举值列表,可以通过 VTS 更好地验证音频策略配置 XML 文件。我们对用于 HAL V7 的音频策略配置文件进行了更改,以符合 XSD。
在 V7 中,标准 ␣
(空格)字符用于分隔属性(如采样率、通道掩码和标志)中的值列表,而不是 V6 及更低版本中使用的 ,
(逗号)和 |
(竖线)符号。如下例所示,空格用于分隔 channelMasks
的值列表
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
要进行符号更改,请使用名为 update_audio_policy_config.sh
的自动转换脚本。请参阅以下命令,将 Pixel 5 (Redfin) 设备的 V6 音频策略配置文件转换为 V7 版本
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
数据类型
我们在 V7 中重新定义了一些数据结构,以最大限度地减少重复定义。重复的数据项元组组合在一起形成可重用的结构。这些数据结构使用最新的 HIDL 功能,例如安全联合。
例如,在 V6 及更低版本中,<format, sampling rate, channel mask>
三元组经常在 HIDL 接口和类型中使用。为了消除这种冗余,在 V7 中,AudioConfigBase
数据类型和其他数据类型定义如下
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
由
AudioConfig
、AudioOffloadInfo
、AudioPortConfig
使用AudioProfile := <format, {sampling rates}, {channel masks}>
替换
AudioPort/PortConfig
中的松散集合AudioPortExtendedInfo := device | mix | session
替换
AudioPort/PortConfig
中的联合
供应商标记
除了设备类型和格式之外,供应商还可以为音轨元数据添加自定义标记。
对于播放和录制音轨元数据,供应商可以传递他们自己的标记,这些标记用于将属性添加到从应用到 HAL 的音频 I/O 流。
用于播放音轨元数据的供应商标记的添加方式如下例所示
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
RecordTrackMetadata
结构以类似的方式实现,方法是添加特定于录制音轨元数据的标记。
供应商扩展命名空间
从 HAL V7 开始,供应商扩展需要额外的 {vendor}
前缀,而 V6 中不需要该前缀。为了使 {vendor}
前缀有效,它必须是三个或更多字母数字字符。
在 V7 中使用以下格式
VX_{vendor}_{letters/numbers}
以下是一些有效的 V7 供应商扩展示例
VX_GOOGLE_VR
VX_QCI_AMBIENT_MIC
版本信息
下表列出了每个 Android 版本的 HAL 版本号
Android 版本 | HIDL HAL 版本 |
---|---|
Android 13 | 7.1 |
Android 12 | 7.0 |
Android 11 | 6.0 |
Android 10 | 5.0 |
Android 9 | 4.0 |
Android 8 | 2.0 |