虽然 Android 9 不支持多区音频,但 Android 音频团队探索了一些可能有助于实现多区音频的方法。本部分详细介绍了其中的一些方法,这些方法可能有助于系统实现者着手构建后座娱乐系统 (RSE) 解决方案。
用例
- 后座中的收音机与前座中的不同媒体源同时播放。
- 前座乘客与司机收听不同的媒体源(例如,乘客在自己的屏幕上玩游戏,而司机在主屏幕上查看导航)。
- 四个不同的独立音频区:驾驶座、副驾驶座、后座 1、后座 2。
限制
由于存在以下限制,Android 9 本身不支持多个音频堆栈(音频区)或不同的优先级:
- Android 9 不提供可使应用定位到特定音频区的 API。取而代之的是,应用必须定位到音频类型(媒体、通知等),这需要从 Android 提供的预定义集内进行选择。例如,Android 目前不支持将目标音频区 2 的音频类型定义为媒体。
- 物理声音流(由 AudioFlinger/内部混音器提供)不会在混音后传输上下文信息(例如,在逻辑声音流内进行标记),这导致音频 HAL 无法将特定逻辑声音流路由到不同的音频区。
方案:使用多个实例
此方案使用多个 Android 汽车实例来实现多区音频效果。
- 每个音频区都有自己的 Android 汽车实例,这些实例可独立管理音频区中的内容。HAL 下方的硬件可合并,并可协调多个实例的输出。
- 实例位于不同的硬件(例如,后座中的平板电脑)之上,或者通过管理程序共享物理硬件。
- 使用一个主音频区将输出静态分配到车载音响设备,或在 HAL 下进行动态分配。
- 第一方应用(安装在每个实例中)通过专有协议进行协作,从而协调各种声音并将其路由到特定音频区。或者,使用 ChromeCast 功能跨不同实例甚至是设备进行通信。
方案:定位到辅助区
此方案使用第一方应用来明确定位到被 Android 忽略的辅助区。
- 原始设备制造商 (OEM) 在
audio_policy_configuration.xml
中定义额外的输出音频设备端口。 - 隐式了解车辆配置的第一方应用可以使用
AudioTrack.setPrefereceDevice()
API 来枚举可用输出端口,并明确定位到其中任意一个端口。
方案:使用音频政策规则
此方案使用音频政策规则向其他音频设备动态添加路由专用的 UID。
- 音频路由引擎根据发出请求的应用的 UID 来定义路由规则。
- 系统级服务或启动器添加相应规则,将特定应用 (UID) 的输出发送到与辅助音频区关联的特定设备。
- 除了为预定义音频上下文的路由提供的设备之外,还要定义这些特定设备。