Android 9 中的多区音频

虽然 Android 9 不支持多区音频,但 Android 音频团队探索了一些有助于实现多区音频的方式。本部分将介绍其中一些可能有助于系统实现者在 Android 9 中构建后座娱乐系统 (RSE) 解决方案的方式。

用例

  • 后座中的收音机与前座中的不同媒体源同时播放。
  • 前座乘客与司机收听不同的媒体源(例如,乘客在自己的屏幕上玩游戏,而司机在主屏幕上查看导航)。
  • 四个不同的独立音频区:驾驶座、副驾驶座、后座 1、后座 2。

限制

由于存在以下限制,Android 9 本身不支持多个音频堆栈(音频区)或不同的优先级:

  • Android 9 不提供可使应用定位到特定音频区的 API。取而代之的是,应用必须定位到音频类型(媒体、通知等),这需要从 Android 提供的预定义集内进行选择。例如,Android 目前不支持将目标音频区 2 的音频类型定义为媒体
  • 物理声音流(由 AudioFlinger/内部混音器提供)不会在混音后传输上下文信息(例如,在逻辑声音流内进行标记),这导致音频 HAL 无法将特定逻辑声音流路由到不同的音频区。

方案:使用多个实例

此方案使用多个 Android Automotive 实例来实现多区音频效果。

  • 每个音频区都有自己的 Android Automotive 实例,这些实例可独立管理音频区中的内容。HAL 下方的硬件可合并,并可协调多个实例的输出。
  • 实例位于不同的硬件(例如,后座中的平板电脑)之上,或者通过管理程序共享物理硬件。
  • 使用一个主音频区将输出静态分配到车载音响设备,或在 HAL 下进行动态分配。
  • 第一方应用(安装在每个实例中)通过专有协议进行协作,从而协调各种声音并将其路由到特定音频区。或者,使用 ChromeCast 功能跨不同实例甚至是设备进行通信。

方案:定位到辅助区

此方案使用第一方应用来明确定位到被 Android 忽略的辅助区。

  • 原始设备制造商 (OEM) 在 audio_policy_configuration.xml 中定义额外的输出音频设备端口。
  • 隐式了解车辆配置的第一方应用可以使用 AudioTrack.setPrefereceDevice() API 来枚举可用输出端口,并明确定位到其中任意一个端口。

方案:使用音频政策规则

此方案使用音频政策规则向其他音频设备动态添加路由专用的 UID。

  • 音频路由引擎根据发出请求的应用的 UID 来定义路由规则。
  • 系统级服务或启动器添加相应规则,将特定应用 (UID) 的输出发送到与辅助音频区关联的特定设备。
  • 除了为预定义音频上下文的路由提供的设备之外,还要定义这些特定设备。