音频 HAL

Android 的音频硬件抽象层 (HAL) 将android.media中的高级音频特定框架 API 连接到底层音频驱动程序和硬件。音频 HAL 定义了音频服务调用的标准接口。必须实现它才能使音频硬件正常运行。

本页概述了音频 HAL,并提供了其 API 和实现要求的详细信息。

音频 HAL 接口

音频 HAL 接口是使用.hal文件中的.hal和配置文件的XSD架构定义的,如下所示。

audio_hal

图 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.halIPrimaryDevice.hal包含setMasterVolumeopenInputStream等方法。
  • 流是单向的,AudioFlinger 使用流通过IStream.halIStreamOut.halIStreamIn.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。

audioformat-change

图 2.对 AudioFormat 枚举的一些更改的比较

已转换为String的枚举类型请参考以下列表:

  • AudioChannelMask
  • AudioContentType
  • AudioDevice :供应商可扩展
  • AudioFormat :供应商可扩展
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

传递字符串枚举值

字符串值用于跨 HAL 接口边界将信息作为枚举值传输。框架和 HAL 包装器都使用整数枚举值来实现业务逻辑,并采用图 3中描述的转换方法。

audio-passing-values

图 3.传递字符串枚举值

例如,要将音频格式类型的值从框架传递给供应商:

  1. AudioFormat的枚举值在libaudiohal中转换为字符串值并传递给 HAL。
  2. 在 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]>

    AudioConfigAudioOffloadInfoAudioPortConfig

  • 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