音效

自 Android 11 起,裝置製造商在選取特定音訊裝置進行音訊擷取或播放時,可以自動附加並啟用特定音訊效果。其中一個重大改善項目是,在音訊路徑中插入的音訊特效 (完全在音訊 HAL 下方實作) 可由音訊特效架構控制。

這項功能主要針對汽車原始設備製造商,但也可以用於其他 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

已將新的 @SystemApi 建構函式新增至 android.media.audiofx.AudioEffect 類別,以建立及啟用裝置效果:

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
  • 當使用 IDevice::createAudioPatch() 方法在音訊 HAL 中選取裝置時,device 會透過音訊架構指派的專屬 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 之間進行協調,實作項目就可以使用 Audio HAL API。