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