自 Android 11 起,裝置製造商在選取特定音訊裝置進行音訊擷取或播放時,可以自動附加並啟用特定音訊效果。其中一個重大改善項目是,在音訊路徑中插入的音訊特效 (完全在音訊 HAL 下方實作) 可由音訊特效架構控制。
這項功能主要針對汽車原始設備製造商,但也可以用於其他 Android 板型規格。當應用程式直接透過音訊 DSP 連線至揚聲器時,就會在 FM 調諧器輸出內容中插入語音強化效果。
必要條件
- 至於其他音效,則必須由供應商程式庫實作,並列於
audio_effects.xml
設定檔中。 - 效果必須屬於預先處理或後續處理類型 (在
EffectDescriptor.flags
中設定的旗標TYPE_PRE_PROC
或TYPE_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
。 - 如果
session
為AudioSessionConsts.DEVICE
,系統會略過AudioIoHandle
。 - 當使用
IDevice::createAudioPatch()
方法在音訊 HAL 中選取裝置時,device
會透過音訊架構指派的專屬AudioPortHandle
進行識別。
音訊 HAL
如要支援裝置效果功能,音訊 HAL 必須使用 IDevice::createAudioPatch()
API 實作音訊路由控制功能。這由回報 true
的 IDevice::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。