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

ตั้งแต่ Android 11 เป็นต้นไป ผู้ผลิตอุปกรณ์จะสามารถแนบและเปิดใช้เอฟเฟกต์เสียงที่เฉพาะเจาะจงโดยอัตโนมัติเมื่อเลือกอุปกรณ์เสียงหนึ่งๆ สำหรับการบันทึกหรือเล่นเสียง การปรับปรุงที่สำคัญอย่างหนึ่งคือเอฟเฟกต์เสียงที่แทรกในเส้นทางเสียงที่ติดตั้งใช้งานทั้งหมดใต้ HAL เสียง (การเชื่อมต่อโดยตรงระหว่างอุปกรณ์อินพุตและอุปกรณ์เอาต์พุต) จะควบคุมได้โดยเฟรมเวิร์กเอฟเฟกต์เสียง

ฟีเจอร์นี้มีไว้สำหรับ OEM ยานยนต์เป็นหลัก แต่สามารถใช้กับรูปแบบอื่นๆ ของ Android ได้เช่นกัน ตัวอย่างแอปกำลังใส่เอฟเฟกต์การเพิ่มประสิทธิภาพเสียงบนเอาต์พุตตัวรับสัญญาณ FM เมื่อเชื่อมต่อโดยตรงกับลำโพงผ่าน DSP เสียง

สิ่งที่ต้องมีก่อน

  • สำหรับเอฟเฟกต์เสียงอื่นๆ จะต้องติดตั้งใช้งานโดยไลบรารีของผู้ให้บริการและระบุไว้ในไฟล์การกำหนดค่า audio_effects.xml
  • เอฟเฟกต์ต้องเป็นประเภทการประมวลผลล่วงหน้าหรือการประมวลผลภายหลัง (การตั้งค่าสถานะ TYPE_PRE_PROC หรือ TYPE_POST_PROC ใน EffectDescriptor.flags)
  • หากการใช้งานเอฟเฟกต์เป็นแบบเร่งความเร็วจาก HW (ตั้งค่า 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 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()

การติดตั้งใช้งานสามารถใช้ Audio HAL API ได้หากจำเป็นต้องประสานงานระหว่าง HAL เสียงและเอฟเฟกต์เมื่อเปิดหรือปิดใช้เอฟเฟกต์