音效

自 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
  • 當使用 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() 方法建立

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