เอฟเฟกต์เสียง

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