| <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 << 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> |