blob: 0ff29dbb123c8a5b921c2258d13a194634329b67 [file] [log] [blame]
<html devsite><head>
<title>多区音频</title>
<meta name="project_path" value="/_project.yaml"/>
<meta name="book_path" value="/_book.yaml"/>
</head>
<body>
<!--
Copyright 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<p>
虽然 Android 9 不支持多区音频,但 Android 音频团队探索了一些可能有助于实现多区音频的方法。本部分详细介绍了其中的一些方法,这些方法可能有助于系统实现者着手构建后座娱乐系统 (RSE) 解决方案。
</p>
<h2 id="user-cases">用例</h2>
<ul>
<li>后座中的收音机与前座中的不同媒体源同时播放。</li>
<li>前座乘客与司机收听不同的媒体源(例如,乘客在自己的屏幕上玩游戏,而司机在主屏幕上查看导航)。</li>
<li>四个不同的独立音频区:驾驶座、副驾驶座、后座 1、后座 2。</li>
</ul>
<h2 id="limitations">限制</h2>
<p>
由于存在以下限制,Android 9 本身不支持多个音频堆栈(音频区)或不同的优先级:
</p>
<ul>
<li>Android 9 不提供可使应用定位到特定音频区的 API。取而代之的是,应用必须定位到音频类型(媒体、通知等),这需要从 Android 提供的预定义集内进行选择。例如,Android 目前不支持将目标<strong>音频区 2</strong> 的音频类型定义为<strong>媒体</strong></li>
<li>物理声音流(由 AudioFlinger/内部混音器提供)不会在混音后传输上下文信息(例如,在逻辑声音流内进行标记),这导致音频 HAL 无法将特定逻辑声音流路由到不同的音频区。</li>
</ul>
<h2 id="scenario-multiple-instances">方案:使用多个实例</h2>
<p>
此方案使用多个 Android 汽车实例来实现多区音频效果。
</p>
<ul>
<li>每个音频区都有自己的 Android 汽车实例,这些实例可独立管理音频区中的内容。HAL 下方的硬件可合并,并可协调多个实例的输出。</li>
<li>实例位于不同的硬件(例如,后座中的平板电脑)之上,或者通过管理程序共享物理硬件。</li>
<li>使用一个主音频区将输出静态分配到车载音响设备,或在 HAL 下进行动态分配。</li>
<li>第一方应用(安装在每个实例中)通过专有协议进行协作,从而协调各种声音并将其路由到特定音频区。或者,使用 ChromeCast 功能跨不同实例甚至是设备进行通信。</li>
</ul>
<h2 id="scenario-target-secondary-zones">方案:定位到辅助区</h2>
<p>
此方案使用第一方应用来明确定位到被 Android 忽略的辅助区。
</p>
<ul>
<li>原始设备制造商 (OEM) 在 <code>audio_policy_configuration.xml</code> 中定义额外的输出音频设备端口。</li>
<li>隐式了解车辆配置的第一方应用可以使用 <code>AudioTrack.setPrefereceDevice()</code> API 来枚举可用输出端口,并明确定位到其中任意一个端口。</li>
</ul>
<h2 id="scenario-audio-policy-rules">方案:使用音频政策规则</h2>
<p>
此方案使用音频政策规则向其他音频设备动态添加路由专用的 UID。
</p>
<ul>
<li>音频路由引擎根据发出请求的应用的 UID 来定义路由规则。</li>
<li>系统级服务或启动器添加相应规则,将特定应用 (UID) 的输出发送到与辅助音频区关联的特定设备。</li>
<li>除了为预定义音频上下文的路由提供的设备之外,还要定义这些特定设备。</li>
</ul>
</body></html>