汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、导航指导、语音命令等的无缝融合。
汽车音频主要包括音量控制、音频路由、音频焦点、多区音频等功能。主要功能如下:
-
音量控制: 通过将音频设备分组到音量组(Volume Groups),CarAudioService 实现对特定设备组的音量和静音控制。所有属于同一音量组的设备将同步调整音量。
-
音频路由(Audio Routing):是指系统如何决定将音频流从一个或多个音频源(如音乐播放器、应用、游戏等)发送到哪些音频输出设备的过程。音频路由对于确保音频数据能够正确、高效地传输到目标设备至关重要。
-
音频焦点管理(Audio Focus): 该服务通过注册音频策略焦点监听器来管理应用程序的音频焦点请求。它使用交互矩阵(Interaction Matrix)来定义不同音频使用场景(如导航、媒体播放、电话等)之间的交互方式,包括并行、独占或拒绝等策略。
-
音频区域管理(Audio Zones): CarAudioService 支持将车辆的音频设备划分为不同的区域(zones),每个区域可以独立控制音频输出。例如,前排和后排座位可以播放不同的音频内容。
整体实现
AAOS 主要使用 AudioAttributes.AttributeUsages
进行路由、音量调整和焦点管理。AttributeUsages用于表示播放声音流的“原因”。因此,所有声音流和音频焦点请求都应为其音频播放指定AttributeUsages。如果在构建 AudioAttributes 对象时未明确设置,则用法将默认为 USAGE_UNKNOWN
。虽然目前会对此用法采取与 USAGE_MEDIA
一样的处理,但不应依赖此行为进行媒体播放。
系统用途(System Usages)
Android 11 中引入了系统用法。这些用法的行为与之前确立的用法类似,不同之处在于它们需要使用系统 API 以及 android.permission.MODIFY_AUDIO_ROUTING
。在 Android Automotive 操作系统(AAOS)中,System Usages(系统用途)指的是一组预定义的音频使用场景,这些场景用于管理和路由车载音频。当前系统用法如下:
No. | 值 | 描述 |
---|---|---|
1 | USAGE_CALL_ASSISTANT |
用于语音助手在处理电话(蜂窝网络或 VoIP)通话时的音频交互。 |
2 | USAGE_EMERGENCY |
用于紧急情况的音频,例如车辆碰撞警报或其他需要立即引起注意的紧急通知。 |
3 | USAGE_SAFETY |
用于安全相关的音频提示,例如安全带未系提示音或车道偏离警告。 |
4 | USAGE_VEHICLE_STATUS |
用于车辆状态的音频通知,例如车门未关好的提醒或油量不足的提示。 |
5 | USAGE_ANNOUNCEMENT |
用于一般性的公告或广播音频,例如全车广播的通知或信息发布。 |
6 | USAGE_SPEAKER_CLEANUP |
用于扬声器清理过程中的音频播放,例如播放特定频率的声音以清除扬声器中的异物。 |
若要通过系统用法构造 AudioAttributes
,请使用 AudioAttributes.Builder#setSystemUsage
,而不是 setUsage
。如果要通过非系统用法调用此方法,就会导致系统抛出 IllegalArgumentException
。此外,如果同时在构建器上设置了系统用法和非系统用法,则在构建时将会抛出 IllegalArgumentException
。
音频上下文(Audio contexts)
为了简化 AAOS 音频的配置,类似用法均已归入 CarAudioContext
。这些音频上下文会在整个 CarAudioService
中使用,以定义路由、音量组和音频焦点管理。音频上下文与属性用途的映射关系如下:
No. | CarAudioContext | 关联的 AttributeUsages |
---|---|---|
1 | MUSIC | USAGE_UNKNOWN, USAGE_GAME, USAGE_MEDIA |
2 | NAVIGATION | USAGE_ASSISTANCE_NAVIGATION_GUIDANCE |
3 | VOICE_COMMAND | USAGE_ASSISTANT, USAGE_ASSISTANCE_ACCESSIBILITY |
4 | CALL_RING | USAGE_NOTIFICATION_RINGTONE |
5 | CALL | USAGE_VOICE_COMMUNICATION, USAGE_CALL_ASSISTANT, USAGE_VOICE_COMMUNICATION_SIGNALLING |
6 | ALARM | USAGE_ALARM |
7 | NOTIFICATION | USAGE_NOTIFICATION, USAGE_NOTIFICATION_EVENT |
8 | SYSTEM_SOUND | USAGE_ASSISTANCE_SONIFICATION |
9 | EMERGENCY | USAGE_EMERGENCY |
10 | SAFETY | USAGE_SAFETY |
11 | VEHICLE_STATUS | USAGE_VEHICLE_STATUS |
12 | ANNOUNCEMENT | USAGE_ANNOUNCEMENT |
音频 HAL
车载音频实现依赖标准 Android 音频 HAL,其中包括以下内容:
IDevice.hal
:负责创建输入声音流和输出声音流、处理主音量和静音操作,以及使用:createAudioPatch
:在设备之间创建外部-外部音频通路。IDevice.setAudioPortConfig()
:为各个物理声音流提供音量。
IStream.hal
:连同输入变体和输出变体一起管理进出硬件的样本音频流。
车载设备类型
以下设备类型与车载平台相关:
No. | 设备类型 | 说明 |
---|---|---|
1 | AUDIO_DEVICE_OUT_BUS | Android 的主要输出(Android 的所有音频均通过这种方式提供给车辆)。用作消除各个上下文的信息流歧义的地址。 |
2 | AUDIO_DEVICE_OUT_TELEPHONY_TX | 用于传输路由到手机无线装置的音频。 |
3 | AUDIO_DEVICE_IN_BUS | 用于尚未进行分类的输入。 |
4 | AUDIO_DEVICE_IN_FM_TUNER | 仅用于广播无线装置输入。 |
5 | AUDIO_DEVICE_IN_TV_TUNER | 用于电视设备(如果存在)。 |
6 | AUDIO_DEVICE_IN_LINE | 用于 AUX 输入耳机插孔。 |
7 | AUDIO_DEVICE_IN_BLUETOOTH_A2DP | 通过蓝牙接收到的音乐。 |
8 | AUDIO_DEVICE_IN_TELEPHONY_RX | 用于从移动网络电台接收到的与通话相关联的音频。 |
配置音频设备
Android 可见的音频设备必须在 /audio_policy_configuration.xml
中进行定义,其中包括以下组件:
- 模块名称:支持“primary”(用于汽车用例)、“A2DP”、“remote_submix”和“USB”。模块名称和相应音频驱动程序应编译到
audio.primary.$(variant).so
中。 - devicePorts:包含可从此模块访问的所有输入和输出设备(包括永久连接的设备和可移除设备)的设备描述符列表。
- 对于每种输出设备,您可以定义增益控制(包含以 millibel 为单位的 min/max/default/step 值,其中 1 millibel = 1/100 dB = 1/1000 bel)。
- 即使有多个设备的设备类型为
AUDIO_DEVICE_OUT_BUS
,也可以使用 devicePort 实例上的地址属性查找设备。
- mixPorts:包含由音频 HAL 提供的所有输出声音流和输入声音流的列表。每个 mixPort 实例都可被视为传输到 Android AudioService 的物理声音流。
- routes:定义输入和输出设备之间或声音流和设备之间可能存在的连接的列表。
以下audioPolicyConfiguration的示例定义了音频设备组件: