音效

從 Android 11 開始,裝置製造商將支援這項功能 在特定音訊裝置 已選取用於音訊擷取或播放其中一個主要改善空間是插入音效 完全導入於音訊 HAL 下方的音訊路徑上 (輸入內容之間的直接連線) 裝置和輸出裝置) 均可透過音效架構控制。

這項功能主要適用於汽車原始設備製造商 (OEM),但也可以用於其他 Android 裝置 板型規格有一個範例應用程式在 FM 調諧器上插入語音強化效果 輸出端。

必要條件

  • 至於任何其他音訊效果,必須由供應商程式庫導入並列出此效果 audio_effects.xml 設定檔中。
  • 效果須為預先處理或後續處理類型 (標記 TYPE_PRE_PROCTYPE_POST_PROCEffectDescriptor.flags 中設定的)。
  • 如果效果實作為硬體加速 (已在 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
  • AudioIoHandle如果 sessionAudioSessionConsts.DEVICE
  • 選用裝置時,音訊架構會指派專屬 AudioPortHandle 來識別 device 使用 IDevice::createAudioPatch() 方法傳送音訊 HAL

音訊 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() 方法建立

實作項目可運用 Audio HAL API,前提是必須在 啟用或停用效果 HAL 功能