Android Automotive OS (AAOS) 基于核心 Android 音频堆栈构建,以支持用作车辆信息娱乐系统的用例。AAOS 负责信息娱乐声音(即媒体、导航和通信),但不直接负责具有严格可用性和时间要求的提示音和警告音。
虽然 AAOS 提供了信号和机制来帮助车辆管理音频,但最终由车辆决定应为驾驶员和乘客播放哪些声音,确保安全关键声音和法规声音能够被正确听到且不会中断。
由于 AAOS 利用了 Android 音频堆栈,因此播放音频的第三方应用无需执行与在手机中不同的操作。应用的音频路由由 AAOS 自动管理,如音频政策配置中所述。
由于 Android 管理车辆的媒体体验,因此外部媒体源(如无线电调谐器)应由应用表示,这些应用可以处理音频焦点和媒体按键事件以用于该源。
Android 声音和音频流
车载音频系统处理以下声音和音频流
图 1. 以音频流为中心的架构图。
Android 管理来自 Android 应用的声音,控制这些应用并根据声音类型将这些应用的声音路由到 HAL 中的输出设备
逻辑音频流(在核心音频命名法中称为源)使用 音频属性进行标记。
物理音频流(在核心音频命名法中称为设备)在混合后没有上下文信息。
为了可靠性,外部声音(来自独立源,例如安全带警告提示音)在 Android 外部(HAL 下方,甚至在单独的硬件中)进行管理。系统实现者必须提供一个混音器,该混音器接受来自 Android 的一个或多个声音输入流,然后以合适的方式将这些音频流与车辆所需的外部声源组合在一起。Android 控制 HAL 为 Android 外部生成的声音提供了一种不同的机制,使其能够与 Android 回传通信
- 音频焦点请求
- 增益或音量限制
- 增益和音量变化
音频 HAL 实现和外部混音器负责确保听到安全关键的外部声音,并将 Android 提供的音频流混合在一起并将其路由到合适的扬声器。
Android 声音
应用可以有一个或多个播放器,这些播放器通过标准 Android API(例如,用于焦点控制的 AudioManager 或用于流式传输的 MediaPlayer)进行互动,以发出一个或多个逻辑音频数据流。此数据可以是单声道或 7.1 环绕声,但会被路由并视为单个源。应用音频流与 AudioAttributes 相关联,后者为系统提供有关应如何表达音频的提示。
逻辑音频流通过 AudioService 发送,并路由到可用物理输出流之一(且仅一个),每个物理输出流都是 AudioFlinger 内的混音器的输出。在音频属性被混合到物理音频流后,它们将不再可用。
然后,每个物理音频流都会被传送到音频 HAL,以便在硬件上进行渲染。在车载应用中,渲染硬件可以是本地编解码器(类似于移动设备)或跨车辆物理网络的远程处理器。无论哪种方式,音频 HAL 实现的任务都是传递实际的样本数据并使其可听见。
外部音频流
不应通过 Android 路由的声音流(出于认证或计时原因)可以直接发送到外部混音器。从 Android 11 开始,HAL 现在可以请求这些外部声音的焦点,以通知 Android,以便 Android 可以采取适当的措施,例如暂停媒体或阻止其他人获得焦点。
如果外部音频流是应与 Android 生成的声音环境互动的媒体源(例如,当外部调谐器打开时停止 MP3 播放),则这些外部音频流应由 Android 应用表示。此类应用将代表媒体源而不是 HAL 请求音频焦点,并将通过启动和停止外部源来响应焦点通知,以适应 Android 焦点政策。
该应用还负责处理媒体按键事件,例如播放和暂停。控制此类外部设备的一种建议机制是 HwAudioSource
。要了解详情,请参阅在 AAOS 中连接输入设备。
输出设备
在音频 HAL 级别,设备类型 AUDIO_DEVICE_OUT_BUS
为车辆音频系统提供通用输出设备。总线设备支持可寻址端口(其中每个端口都是物理音频流的端点),并且预计将是车辆中唯一支持的输出设备类型。
系统实现可以使用一个总线端口用于所有 Android 声音,在这种情况下,Android 会将所有声音混合在一起并将其作为一个音频流传递。或者,HAL 可以为每个 CarAudioContext 提供一个总线端口,以允许同时传递任何声音类型。这使得 HAL 实现可以根据需要混合和衰减不同的声音。
音频上下文到输出设备的分配通过 car_audio_configuration.xml
文件完成。要了解详情,请参阅音频政策配置。