從 Android 11 開始,設備製造商可以在選擇給定音頻設備進行音頻捕獲或播放時自動附加和啟用特定音頻效果。一項重大改進是,插入在音頻 HAL(輸入設備和輸出設備之間的直接連接)之下完全實現的音頻路徑上的音頻效果可以由音頻效果框架控制。
此功能主要針對汽車 OEM,但也可用於其他 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
android.media.audiofx.AudioEffect
類中添加了一個新的 @SystemApi 構造函數來創建和啟用設備效果:
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
是AudioIoHandle
,則忽略AudioSessionConsts.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()
方法創建音頻補丁時使用該 ID。
如果在啟用或禁用效果時需要在音頻和效果 HAL 之間進行協調,則實現可以使用音頻 HAL API。