音頻效果

從 Android 11 開始,設備製造商可以在選擇給定音頻設備進行音頻捕獲或播放時自動附加和啟用特定音頻效果。一項重大改進是,插入在音頻 HAL(輸入設備和輸出設備之間的直接連接)之下完全實現的音頻路徑上的音頻效果可以由音頻效果框架控制。

此功能主要針對汽車 OEM,但也可用於其他 Android 外形尺寸。當通過音頻 DSP 直接連接到揚聲器時,示例應用程序在 FM 調諧器輸出上插入語音增強效果。

先決條件

  • 至於任何其他音頻效果,該效果必須由供應商庫實現,並在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
  • 如果sessionAudioIoHandle ,則忽略AudioSessionConsts.DEVICE
  • 當使用IDevice::createAudioPatch()方法在音頻 HAL 中選擇設備時,該device由音頻框架分配的唯一AudioPortHandle標識。

音頻 HAL

要支持設備效果功能,音頻 HAL 必須使用IDevice::createAudioPatch() API 實現音頻路由控制。這由IDevice::supportsAudioPatches()方法報告true指示。

兩個新的 API 方法IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)告訴 HAL 實現在給定設備上啟用或禁用了設備效果。

設備由其AudioPortHandle ID 標識,在使用IDevice::createAudioPatch()方法創建音頻補丁時使用該 ID。

如果在啟用或禁用效果時需要在音頻和效果 HAL 之間進行協調,則實現可以使用音頻 HAL API。