【AAOS】【源码分析】CarAudioService(二)-- 功能介绍

汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、导航指导、语音命令等的无缝融合。

汽车音频主要包括音量控制、音频路由、音频焦点、多区音频等功能。主要功能如下:

  1. 音量控制: 通过将音频设备分组到音量组(Volume Groups),CarAudioService 实现对特定设备组的音量和静音控制。所有属于同一音量组的设备将同步调整音量。

  2. 音频路由(Audio Routing):是指系统如何决定将音频流从一个或多个音频源(如音乐播放器、应用、游戏等)发送到哪些音频输出设备的过程。音频路由对于确保音频数据能够正确、高效地传输到目标设备至关重要。

  3. 音频焦点管理(Audio Focus): 该服务通过注册音频策略焦点监听器来管理应用程序的音频焦点请求。它使用交互矩阵(Interaction Matrix)来定义不同音频使用场景(如导航、媒体播放、电话等)之间的交互方式,包括并行、独占或拒绝等策略。

  4. 音频区域管理(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的示例定义了音频设备组件:


                
### Android Automotive OS (AAOS) 中按键 Mute 功能实现 在 AAOS 环境下,Mute 按键的功能设计不仅依赖于基础的 Android 输入处理机制,还特别针对汽车环境进行了优化。当按下 Mute 键时,系统会触发一系列特定的操作来控制音频流。 #### 1. Mute 操作流程 Mute 操作主要通过 `AudioManager` 类中的方法实现。具体来说: - 当检测到 Mute 按键被按下时,事件会被传递给相应的广播接收器。 - 广播接收器接收到该事件后调用 `setStreamMute()` 方法[^2]。 ```java // 设置指定音频流静音状态 audioManager.setStreamMute(AudioManager.STREAM_MUSIC, true); ``` 此操作会使当前播放的所有音乐类别的声音立即停止发出,但不会影响其他类型的音频流(如导航提示声)。同时,在某些配置中,可能会显示视觉反馈告知用户已进入静音模式。 #### 2. 处理特殊情况 考虑到车内复杂的使用场景,AAOS 对 Mute 功能做了一些额外考虑: - **来电优先级**:即使处于静音状态下,如果接到来电,则自动解除静音以便能够听到铃声并接听电话。 - **媒体恢复逻辑**:一旦取消静音设置,之前暂停的多媒体应用应能平滑地恢复正常音量输出而不造成突兀感。 - **多区域管理**:对于配备多个独立音响分区的高端车型,可以单独为不同座位上的乘客设定不同的静音选项。 #### 3. 常见问题及解决方案 有时开发者或车主可能遇到如下情况: - **无法响应 Mute 按钮**:这可能是由于应用程序未正确注册监听器或是硬件连接存在问题所致;建议检查权限声明以及物理连线状况。 - **误触导致意外静音**:可以通过增加短暂延迟确认动作的方式减少此类现象发生频率。 - **跨应用一致性维护困难**:确保所有涉及音频的应用遵循统一的标准API接口定义来进行静音控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值