ตั้งแต่ Android 11 เป็นต้นไป ผู้ผลิตอุปกรณ์จะมีความสามารถ ในการแนบและเปิดใช้เอฟเฟกต์เสียงที่เฉพาะเจาะจงโดยอัตโนมัติเมื่อมีการเลือกอุปกรณ์เสียง สำหรับการบันทึกหรือเล่นเสียง การปรับปรุงที่สำคัญอย่างหนึ่งคือเฟรมเวิร์กเอฟเฟกต์เสียงสามารถควบคุมเอฟเฟกต์เสียงที่แทรก ในเส้นทางเสียงที่ใช้ทั้งหมดด้านล่าง HAL เสียง (การเชื่อมต่อโดยตรงระหว่างอุปกรณ์อินพุต และอุปกรณ์เอาต์พุต) ได้
ฟีเจอร์นี้มีเป้าหมายหลักคือ OEM ยานยนต์ แต่ก็สามารถใช้ในรูปแบบอื่นๆ ของ Android ได้ด้วย ตัวอย่างแอปคือการแทรกเอฟเฟกต์การปรับปรุงเสียงในเอาต์พุตของจูนเนอร์ FM เมื่อเชื่อมต่อกับลำโพงโดยตรงผ่าน DSP เสียง
สิ่งที่ต้องมีก่อน
- สำหรับเอฟเฟกต์เสียงอื่นๆ เอฟเฟกต์ต้องได้รับการติดตั้งใช้งานโดยไลบรารีของผู้ให้บริการและแสดงอยู่ใน
audio_effects.xml
ไฟล์การกำหนดค่า - เอฟเฟกต์ต้องเป็นประเภทการประมวลผลเบื้องต้นหรือการประมวลผลภายหลัง
(ตั้งค่าแฟล็ก
TYPE_PRE_PROC
หรือTYPE_POST_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);
หลังจากสร้างเอฟเฟกต์โดยระบุรหัสเอฟเฟกต์เสียงที่ไม่ซ้ำกันและตัวอธิบายอุปกรณ์เสียงแล้ว คุณจะเปิดหรือปิดใช้เอฟเฟกต์นั้นได้ด้วย AudioEffect API ที่มีอยู่
นอกจากนี้ยังมี API สำหรับค้นหาว่าการติดตั้งใช้งานรองรับอุปกรณ์/เอฟเฟกต์ที่กำหนดหรือไม่
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
API HAL ใหม่
HAL เอฟเฟกต์เสียง
HAL V6.0 ของเอฟเฟกต์เสียงมีลายเซ็นใหม่สำหรับเมธอด createEffect()
ซึ่งอนุญาตให้สร้างเอฟเฟกต์ที่แนบกับอุปกรณ์ได้
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
AudioSession
ที่ระบุต้องเป็นAudioSessionConsts.DEVICE
- ระบบจะไม่สนใจ
AudioIoHandle
หากsession
เป็นAudioSessionConsts.DEVICE
device
จะระบุด้วยAudioPortHandle
ที่ไม่ซ้ำกันซึ่งเฟรมเวิร์กเสียงกำหนดให้เมื่อเลือกอุปกรณ์ที่ HAL เสียงด้วยเมธอดIDevice::createAudioPatch()
HAL เสียง
หากต้องการรองรับฟีเจอร์เอฟเฟกต์ของอุปกรณ์ HAL เสียงต้องใช้การควบคุมการกำหนดเส้นทางเสียงโดยใช้ IDevice::createAudioPatch()
API ซึ่งระบุโดยIDevice::supportsAudioPatches()
การรายงานเมธอด true
เมธอด API ใหม่ 2 รายการ
IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
และ
IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
จะบอกการติดตั้งใช้งาน HAL ว่ามีการเปิดหรือปิดใช้เอฟเฟกต์ของอุปกรณ์ใน
อุปกรณ์ที่ระบุ
อุปกรณ์จะระบุด้วยAudioPortHandle
รหัส ซึ่งจะใช้เมื่อสร้างแพตช์เสียง
ด้วยเมธอด IDevice::createAudioPatch()
การติดตั้งใช้งานสามารถใช้ API ของ HAL เสียงได้หากจำเป็นต้องมีการประสานงานระหว่าง HAL เสียงและเอฟเฟกต์เมื่อเปิดหรือปิดใช้เอฟเฟกต์