ตั้งแต่ 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 เสียงและเอฟเฟกต์เมื่อเปิดหรือปิดใช้เอฟเฟกต์