เริ่มตั้งแต่ Android 11 เป็นต้นไป ผู้ผลิตอุปกรณ์สามารถแนบและเปิดใช้งานเอฟเฟกต์เสียงเฉพาะได้โดยอัตโนมัติเมื่อเลือกอุปกรณ์เสียงที่กำหนดสำหรับการจับหรือเล่นเสียง การปรับปรุงที่สำคัญประการหนึ่งคือเอฟเฟกต์เสียงที่แทรกบนเส้นทางเสียงที่ใช้งานทั้งหมดด้านล่างเสียง HAL (การเชื่อมต่อโดยตรงระหว่างอุปกรณ์อินพุตและอุปกรณ์เอาท์พุต) สามารถควบคุมได้โดยเฟรมเวิร์กเอฟเฟกต์เสียง
ฟีเจอร์นี้มุ่งเป้าไปที่ผู้ผลิตรถยนต์ OEM เป็นหลัก แต่ยังใช้ในอุปกรณ์ Android อื่นๆ ได้ด้วย แอพตัวอย่างกำลังแทรกเอฟเฟกต์การเพิ่มประสิทธิภาพเสียงบนเอาต์พุตจูนเนอร์ FM เมื่อเชื่อมต่อโดยตรงกับลำโพงผ่าน DSP เสียง
ข้อกำหนดเบื้องต้น
- สำหรับเอฟเฟกต์เสียงอื่น ๆ เอฟเฟกต์จะต้องถูกนำไปใช้โดยไลบรารีของผู้จำหน่ายและแสดงรายการอยู่ในไฟล์การกำหนดค่า
audio_effects.xml
- เอฟเฟกต์ต้องเป็นประเภทการประมวลผลล่วงหน้าหรือการประมวลผลภายหลัง (ตั้งค่าสถานะ
TYPE_PRE_PROC
หรือTYPE_POST_PROC
ที่ตั้งค่าไว้ในEffectDescriptor.flags
) - หากการใช้เอฟเฟกต์ถูกเร่ง HW (ตั้งค่าสถานะ
HW_ACC_TUNNEL
ในEffectDescriptor.flags
) ก็สามารถแนบเข้ากับเส้นทางเสียงที่เชื่อมต่อด้านล่าง HAL ทั้งหมดได้ (ไม่มีการเล่นหรือบันทึกสตรีมเสียงที่เปิดที่ HAL เสียง)
สร้างและเปิดใช้งานเอฟเฟกต์อุปกรณ์
เอฟเฟ็กต์เสียงเฉพาะอุปกรณ์สามารถสร้างอินสแตนซ์ได้โดยใช้วิธีใดวิธีหนึ่งจากสองวิธีด้านล่างนี้
ใช้ไฟล์การกำหนดค่าเอฟเฟกต์เสียง
วิธีการนี้ช่วยให้สามารถสร้างเอฟเฟกต์เสียงแบบคงที่ซึ่งแนบและเปิดใช้งานอย่างเป็นระบบกับเส้นทางเสียงใด ๆ ที่เลือกอุปกรณ์ที่ระบุเป็น sink หรือแหล่งที่มา
ซึ่งทำได้โดยการเพิ่มส่วนเฉพาะในไฟล์ 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
-
device
จะถูกระบุโดยAudioPortHandle
ที่เป็นเอกลักษณ์ซึ่งกำหนดโดยเฟรมเวิร์กเสียงเมื่ออุปกรณ์ถูกเลือกที่ HAL เสียงด้วยเมธอดIDevice::createAudioPatch()
เครื่องเสียง 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()
Audio HAL API สามารถนำไปใช้ได้ หากจำเป็นต้องมีการประสานงานระหว่าง HAL เสียงและเอฟเฟกต์ เมื่อเปิดใช้งานหรือปิดใช้งานเอฟเฟกต์