從Android 11開始,設備製造商可以在選擇給定音頻設備進行音頻捕獲或播放時自動附加並啟用特定的音頻效果。一個主要的改進是,插入在完全在音頻HAL(輸入設備和輸出設備之間的直接連接)下方實現的音頻路徑上的音頻效果可以由音頻效果框架控制。
此功能主要針對汽車OEM,但也可以在其他Android外形尺寸中使用。一個示例應用程序是在通過音頻DSP直接連接到揚聲器時,在FM調諧器輸出上插入語音增強效果。
先決條件
- 對於任何其他音頻效果,該效果必須由供應商庫實現並在
audio_effects.xml
配置文件中列出。 - 的效果的類型必須是預處理或後處理(標誌
TYPE_PRE_PROC
或TYPE_PRE_PROC
在集EffectDescriptor.flags
)。 - 如果效果的實現是硬件加速(標誌
HW_ACC_TUNNEL
在集EffectDescriptor.flags
),它可以連接到完全連接在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
如果被忽略session
是AudioSessionConsts.DEVICE
。 - 使用
IDevice::createAudioPatch()
方法在音頻HAL上選擇設備時,將通過音頻框架分配的唯一AudioPortHandle
標識該device
。
音訊HAL
為了支持設備效果功能,音頻HAL必須使用IDevice::createAudioPatch()
API實現音頻路由控制。這由報告為true
的IDevice::supportsAudioPatches()
方法指示。
IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
和IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
這兩個新的API方法告訴HAL實現已在給定設備上啟用或禁用設備效果。
設備通過其AudioPortHandle
ID進行標識,該ID在使用IDevice::createAudioPatch()
方法創建音頻補丁時使用。
如果在啟用或禁用效果時需要在音頻HAL和效果HAL之間進行協調,則實現可以使用音頻HAL API。