Android 的音频硬件抽象层 (HAL) 可将 android.media
中较高层级的音频专用框架 API 连接到底层的音频驱动程序和硬件。音频 HAL 定义了音频服务会调用的标准接口,必须实现它才能使音频硬件正常运行。
本页将概述音频 HAL 并详细介绍其 API 和实现要求。
音频 HAL 接口
音频 HAL 接口使用 .hal
文件中的 HIDL 和配置文件的 XSD 架构来定义,如下所示。
图 1. 音频 HAL 接口
配置文件
音频政策和音频效果 XML 配置文件被视为音频 HAL 接口的一部分。这些文件必须符合其架构,并通过 VTS 测试验证其是否符合。
在实现音频 HAL 的过程中,您必须创建一个描述音频拓扑的音频政策配置文件。必须在 audio_policy_configuration.xml
文件中声明音频 HAL 功能,框架才能使用相应功能。
音频 HAL API
音频 HAL 包含以下 API:
- Core HAL
- Effects HAL
- Common HAL
以下各部分逐一介绍了这些 API。
Core HAL
Core HAL 是 AudioFlinger 用于播放音频和控制音频路由的主要 API。其中一些关键接口如下:
IDeviceFactory.hal
是 API 的入口点。IDevice.hal
和IPrimaryDevice.hal
包含一些方法,例如setMasterVolume
或openInputStream
。- 音频流是单向的,AudioFlinger 使用音频流通过
IStream.hal
、IStreamOut.hal
和IStreamIn.hal
向 HAL 发送音频或从 HAL 接收音频。
下表列出了有用的 Core HAL 组件的位置。
Core HAL 组件 | 位置 |
---|---|
最新版本的 API | /hardware/interfaces/audio/6.0
|
最新 Core HAL API 的专用类型 | /hardware/interfaces/audio/6.0/types.hal
|
音频政策配置文件 XSD 架构 | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
Core HAL API 的默认实现 (/hardware/interfaces/audio/core/all-versions/default/
) 是一个封装容器,用于封装 Treble 推出前的使用旧版共享库的 HAL 实现。在实现直接与内核驱动程序交互的新版音频 HAL 时,也可将默认实现作为参考。
Effects HAL
Effects HAL API 供效果框架用于控制音频效果。 您还可以通过 Effects HAL API 配置预处理效果,如自动增益控制和噪音抑制。
下表列出了有用的 Effects HAL 组件的位置。
Effects HAL 组件 | 位置 |
---|---|
最新版本的 API | /hardware/interfaces/audio/effect/6.0/
|
效果配置文件 XSD 架构 | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
如需了解详情,请参阅 Effects HAL API 的示例实现 (/hardware/interfaces/audio/effect/all-versions/default/
) 和音频效果部分。
Common HAL
Common HAL 是 Core HAL API 和 Effects HAL API 使用的常用数据类型的库。它只定义数据结构,因此没有接口也没有关联的 VTS 测试。Common HAL API 包含以下内容:
- 由 Core API 和 Effect API 共享的定义 (
/hardware/interfaces/audio/common/6.0/types.hal
) - 用于帮助实现、客户端和测试针对 HIDL API 进行编码的实用程序 (
/hardware/interfaces/audio/common/all-versions
)
要求
除了实现音频 HAL 和创建音频政策配置文件外,还必须遵循以下 HAL 要求:
- 如果有一个输入配置文件支持声音触发器捕获(从启动指令 DSP 缓冲区捕获),该实现必须支持此配置文件上与声音触发器 HAL 支持的并发会话数量相对应的活跃声音流数量。
- 按照并发捕获页面详细介绍的那样,从应用处理器并发进行语音通话 TX 和捕获。
音频 HAL V7 更新
为了解决向后兼容性问题,从 Android 13 开始,所有 HAL 变更都必须使用稳定的 AIDL。为了在 Android 13 及更高版本中支持和加强对 AIDL 的采用,音频 HAL V7 做出了以下更新:
- 统一了框架和 HAL 使用的数据模型。
- 最大限度地减少了 HIDL 数据类型(枚举)与用于音频政策配置的 XML 架构之间的重复。
具体而言,音频 HAL V7 在以下方面做出了变更:
下面的相应部分对这些变更进行了详细介绍。
枚举
从 Audio HAL V7 开始,音频政策配置文件中使用的枚举类型仅在 XSD 架构中定义,而不在 HIDL 中定义。
在音频 HAL V6 中,types.hal
中的枚举类型(例如 AudioFormat
)的值也在音频政策配置文件 XSD 架构中定义,因此造成了重复。为了避免 V7 中发生这种情况,枚举类型更改为 string
,并且改为在 XSD 架构中列出所有可能的枚举值。
若要比较 V7 中对 AudioFormat
枚举类型做出的一些变更,请参阅图 2。
图 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 文件。为了符合 XSD 的这一变更,用于 HAL V7 的音频政策配置文件也做出了变更。
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 及更低版本中,HIDL 接口和类型中经常使用三元组 <format, sampling rate, channel mask>
。为了消除这种冗余,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 开始,供应商扩展需要额外添加 V6 中不需要使用的 {vendor}
前缀。{vendor}
前缀必须至少包含三个字母数字字符才有效。
请在 V7 中使用以下格式:
VX_{vendor}_{letters/numbers}
以下是有效的 V7 供应商扩展的一些示例:
- VX_GOOGLE_VR
- VX_QCI_AMBIENT_MIC
版本信息
下表列出了每个 Android 版本的 HAL 版本号。
Android 版本 | 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 |