高解析度音效

Android 9 版本包括以下针对高解析度音频的改进:

  • 音效处理从 int16 转换为浮动格式,后者是 AudioFlinger 中所剩不多的 int16 通道之一。这项音效处理更改需要提供自定义音效的供应商完成实现工作。下文将介绍相关实现工作。
  • 以下改进无需合作伙伴处理任何实现事宜:
    • 客户端的同时输出音轨数量从 14 增加到 40,因为对 Android 8.x 中的应用而言,有限的客户端 AudioTrack 已经成为一个需要解决的问题。
    • 客户端/服务器的最大内存从 4MB 增加到 32MB(具体取决于设备总内存),以允许同时存在更多高解析度音轨。
    • 混合音轨总数从 32 增加到 256,以防止应用和系统界面之间出现资源争用情况。

输出音效变化

在 Android 9 版本之前,音效链处理是以立体声 int16 样本格式实现的。这种方法存在以下几项限制:

  • 所有输出音效都强制从浮点音频数据转换为 int16,而这会导致精确度失真。
  • 输出音效遭到通道数大于 2 的输出接收器的拒绝。

在 Android 9 版本中,音效链处理通道进行了升级,以支持多通道浮动格式。要点如下:

  • Android 软件音效已经改用立体声浮动格式。
  • 格式适配器支持旧版音效,可根据需要将浮动格式转换为 int16。

实现输出音效

frameworks/av/media/libeffects 下提供了输出音效的参考实现。

实现自己的自定义输出音效的合作伙伴应针对 Android 9 版本执行以下操作:

  • 更新输出音效以支持多通道浮动格式:
    • 不再需要 Int16 处理支持。
    • 支持的输出通道数为 2-8 个(出于未来兼容性方面的考虑,通道数可以为 1-30 个)。
    • 对于插入音效,支持与输出通道数一致的输入通道数。对于辅助音效,输入通道数将仍为 1(单声道)。
    • 支持通道位置掩码(规范)和 (1 << n) - 1 的通道索引掩码。
  • 如果您必须继续支持旧版供应商输出音效且无法更新它们,请按如下方式验证旧代码:
    • 旧版输出(插入)音效必须拒绝 EFFECT_CMD_SET_CONFIG 中不受支持的配置。
      • 检查格式是否为 int16。
      • 检查输入和输出通道掩码是否为立体声。
      • 如果不是,则返回 -EINVAL
    • 旧版输出(辅助)音效由 AudioFlinger 配置,具有单声道输入通道掩码,并可能具有多通道输出通道掩码(具体取决于输出接收器是否为多通道)。它们必须拒绝 EFFECT_CMD_SET_CONFIG 中不受支持的配置。
      • 检查格式是否为 int16。
      • 检查输入通道掩码是否为单声道,输出通道掩码是否为立体声。
      • 如果不是,则返回 -EINVAL
    • 验证旧代码。请勿假定旧代码可正常运行!