blob: f18d0f9fb24711997c9de4f69b4765b0a0a0307d [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 版本包括以下针对高解析度音频的改进:</p>
<ul>
<li>音效处理从 int16 转换为浮动格式,后者是 AudioFlinger 中所剩不多的 int16 通道之一。这项音效处理更改需要提供自定义音效的供应商完成实现工作。下文将介绍相关实现工作。</li>
<li>以下改进无需合作伙伴处理任何实现事宜:
<ul>
<li>客户端的同时输出音轨数量从 14 增加到 40,因为对 Android 8.x 中的应用而言,有限的客户端 AudioTrack 已经成为一个需要解决的问题。</li>
<li>客户端/服务器的最大内存从 4MB 增加到 32MB(具体取决于设备总内存),以允许同时存在更多高解析度音轨。</li>
<li>混合音轨总数从 32 增加到 256,以防止应用和系统界面之间出现资源争用情况。</li>
</ul>
</li>
</ul>
<h2 id="output-effect-changes">输出音效变化</h2>
<p>在 Android 9 版本之前,音效链处理是以立体声 int16 样本格式实现的。这种方法存在以下几项限制:</p>
<ul>
<li>所有输出音效都强制从浮点音频数据转换为 int16,而这会导致精确度失真。</li>
<li>输出音效遭到通道数大于 2 的输出接收器的拒绝。</li>
</ul>
<p>在 Android 9 版本中,音效链处理通道进行了升级,以支持多通道浮动格式。要点如下:</p>
<ul>
<li>Android 软件音效已经改用立体声浮动格式。</li>
<li>格式适配器支持旧版音效,可根据需要将浮动格式转换为 int16。</li>
</ul>
<h2 id="implementing-output-effects">实现输出音效</h2>
<p><code>frameworks/av/media/libeffects</code> 下提供了输出音效的参考实现。</p>
<p>实现自己的自定义输出音效的合作伙伴应针对 Android 9 版本执行以下操作:</p>
<ul>
<li>更新输出音效以支持多通道浮动格式:
<ul>
<li>不再需要 Int16 处理支持。</li>
<li>支持的输出通道数为 2-8 个(出于未来兼容性方面的考虑,通道数可以为 1-30 个)。</li>
<li>对于插入音效,支持与输出通道数一致的输入通道数。对于辅助音效,输入通道数将仍为 1(单声道)。</li>
<li>支持通道位置掩码(规范)和 (1 &lt;&lt; n) - 1 的通道索引掩码。</li>
</ul>
</li>
<li>如果您必须继续支持旧版供应商输出音效且无法更新它们,请按如下方式验证旧代码:
<ul>
<li>旧版输出(插入)音效<strong>必须拒绝</strong> <code>EFFECT_CMD_SET_CONFIG</code> 中不受支持的配置。
<ul>
<li>检查格式是否为 int16。</li>
<li>检查输入和输出通道掩码是否为立体声。</li>
<li>如果不是,则返回 <code>-EINVAL</code></li>
</ul>
</li>
<li>旧版输出(辅助)音效由 AudioFlinger 配置,具有单声道输入通道掩码,并可能具有多通道输出通道掩码(具体取决于输出接收器是否为多通道)。它们<strong>必须拒绝</strong> <code>
EFFECT_CMD_SET_CONFIG</code> 中不受支持的配置。
<ul>
<li>检查格式是否为 int16。</li>
<li>检查输入通道掩码是否为单声道,输出通道掩码是否为立体声。</li>
<li>如果不是,则返回 <code>-EINVAL</code></li>
</ul>
</li>
<li>验证旧代码。请勿假定旧代码可正常运行!</li>
</ul>
</li>
</ul>
</body></html>