從 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
是AudioSessionConsts.DEVICE
,則AudioIoHandle
將被忽略。 - 當使用
IDevice::createAudioPatch()
方法在音訊 HAL 中選擇設備時,該device
由音訊框架分配的唯一AudioPortHandle
來識別。
音訊哈爾
為了支援設備效果功能,音訊 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。