Android 的音频硬件抽象层 (HAL) 将android.media
中的高级音频特定框架 API 连接到底层音频驱动程序和硬件。音频 HAL 定义了音频服务调用的标准接口。必须实现它才能使音频硬件正常运行。
本页概述了音频 HAL,并提供了其 API 和实现要求的详细信息。
音频 HAL 接口
音频 HAL 接口是使用.hal文件中的.hal
和配置文件的XSD架构定义的,如下所示。
图 1.音频 HAL 接口
配置文件
音频策略和音频效果 XML 配置文件被视为音频 HAL 接口的一部分。这些文件必须符合它们的模式,并且一致性由 VTS 测试验证。
作为实现音频 HAL 的一部分,您必须创建描述音频拓扑的音频策略配置文件。音频 HAL 功能必须在audio_policy_configuration.xml
文件中声明,以便框架使用它们。
音频 HAL API
音频 HAL 包含以下 API:
- 核心硬件
- 效果器 HAL
- 普通硬件
这些 API 中的每一个都在以下部分中进行了描述。
核心硬件
Core HAL 是 AudioFlinger 用来播放音频和控制音频路由的主要 API。部分关键接口如下:
-
IDeviceFactory.hal
是 API 的入口点。 -
IDevice.hal
和IPrimaryDevice.hal
包含setMasterVolume
或openInputStream
等方法。 - 流是单向的,AudioFlinger 使用流通过
IStream.hal
、IStreamOut.hal
和IStreamIn.hal
向 HAL 发送音频或从 HAL 接收音频。
下表列出了有用的核心 HAL 组件的位置。
核心 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/
) 的默认实现是使用遗留共享库的 pre-Treble HAL 实现的包装器。在实现直接与内核驱动程序交互的新版本音频 HAL 时,也可以将默认实现视为参考。
效果器 HAL
效果框架使用效果 HAL API 来控制音频效果。您还可以通过 Effects HAL API 配置预处理效果,例如自动增益控制和噪声抑制。
下表列出了有用的 Effects 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 是核心和效果 HAL API 使用的通用数据类型库。它没有接口,也没有关联的 VTS 测试,因为它只定义数据结构。通用 HAL API 包含以下内容:
- 核心和效果 API 共享的定义 (
/hardware/interfaces/audio/common/6.0/types.hal
) - 实用程序 (
/hardware/interfaces/audio/common/all-versions
) 用于帮助针对实现、客户端和测试的 HIDL API 进行编码
要求
除了实现音频 HAL 和创建音频策略配置文件外,还必须遵守以下 HAL 要求:
- 如果一个输入配置文件支持 Sound Trigger 捕获(从热词 DSP 缓冲区捕获),则实现必须支持此配置文件上的活动流数量,该数量与 Sound Trigger HAL 支持的并发会话数量相对应。
- 语音呼叫 TX 和从应用程序处理器捕获的并发,如并发捕获页面中所述。
音频 HAL V7 更新
为了解决向后兼容性问题,从 Android 13 开始的所有 HAL 更改都必须使用稳定的 AIDL。为了支持和增强 AIDL 在 Android 13 及更高版本中的采用,音频 HAL V7 执行以下操作:
- 统一框架和 HAL 使用的数据模型。
- 最大限度地减少 HIDL 数据类型(枚举)和用于音频策略配置的 XML 架构之间的重复。
具体来说,在音频 HAL V7 中有以下几个方面的变化:
这些更改将在各自的部分中进行更详细的讨论。
枚举
从音频 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 文件。在与 HAL V7 一起使用的音频策略配置文件中进行了更改以符合 XSD。
在 V7 中,标准的␣
(空格)字符用于分隔属性(如采样率、通道掩码和标志)中的值列表,而不是,
(逗号)和|
(竖线)V6 及以下版本中使用的符号。如以下示例所示,空格用于分隔channelMasks
的值列表:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
要更改符号,请使用名为update_audio_policy_config.sh
的自动转换脚本。请参阅以下命令将 V6 音频策略配置文件转换为 Pixel 5 (Redfin) 设备的 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 流,从应用程序到 HAL。
播放曲目元数据的供应商标签已添加,如下例所示:
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 版本号。
安卓版 | 硬件版本 |
---|---|
安卓 13 | 7.1 |
安卓 12 | 7.0 |
安卓 11 | 6.0 |
安卓 10 | 5.0 |
安卓9 | 4.0 |
安卓8 | 2.0 |