音频效果

从 Android 11 开始,设备制造商能够针对音频捕获或播放选择给定的音频设备时,自动附加并启用特定的音频效果。一项重大改进是,完全在音频 HAL 下方实现(输入设备和输出设备之间直接连接)的音频路径上插入的音频效果可以由音频效果框架控制。

此功能主要面向汽车 OEM,但也适用于其他 Android 外形规格。一个示例应用是在 FM 调谐器输出上插入语音增强效果,当 FM 调谐器输出通过音频 DSP 直接连接到扬声器时。

前提条件

  • 与其他任何音频效果一样,效果必须由供应商库实现,并列在 audio_effects.xml 配置文件中。
  • 效果类型必须为预处理或后处理(在 EffectDescriptor.flags 中设置标志 TYPE_PRE_PROCTYPE_POST_PROC)。
  • 如果效果实现是硬件加速的(在 EffectDescriptor.flags 中设置标志 HW_ACC_TUNNEL),则可以将其附加到完全在 HAL 下方连接的音频路径(在音频 HAL 处未打开播放或捕获音频流)。

创建和启用设备效果

可以使用以下两种方法之一实例化特定于设备的音频效果。

使用音频效果配置文件

此方法允许静态创建音频效果,该效果会系统地附加到任何选择指定设备作为接收器或来源的音频路径并启用。

这可以通过在 audio_effects.xml 文件中添加特定部分来完成,如下所示:

<deviceEffects>
<devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom">
      	<apply effect="agc"/>
      </devicePort>
  </deviceEffects>
  

使用系统 API

已向 android.media.audiofx.AudioEffect 类添加新的 @SystemApi 构造函数,以创建和启用设备效果

AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

在通过指定唯一的音频效果 ID 和音频设备描述符创建效果后,可以使用现有的 AudioEffect API 启用或停用该效果。

还有一个 API 可用于查询实现是否支持给定的设备/效果组合。

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

新的 HAL API

音频效果 HAL

音频效果 HAL V6.0 为 createEffect() 方法添加了新签名,允许创建附加到设备的效果

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • 指定的 AudioSession 必须是 AudioSessionConsts.DEVICE
  • 如果 sessionAudioSessionConsts.DEVICE,则 AudioIoHandle 将被忽略。
  • device 由音频框架在音频 HAL 处使用 IDevice::createAudioPatch() 方法选择设备时分配的唯一 AudioPortHandle 标识。

音频 HAL

为了支持设备效果功能,音频 HAL 必须使用 IDevice::createAudioPatch() API 实现音频路由控制。这由报告 trueIDevice::supportsAudioPatches() 方法指示。

两个新的 API 方法,IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId),告知 HAL 实现已在给定设备上启用或停用设备效果。

设备由其 AudioPortHandle ID 标识,该 ID 在使用 IDevice::createAudioPatch() 方法创建音频补丁时使用。

如果音频 HAL 和效果 HAL 在启用或停用效果时需要协调,则实现可以使用音频 HAL API。