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

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

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

ข้อกำหนดเบื้องต้น

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

หลังจากที่สร้างเอฟเฟกต์โดยการระบุ ID เอฟเฟกต์เสียงและตัวระบุอุปกรณ์เสียงที่ไม่ซ้ำใคร ก็สามารถเปิดหรือปิดใช้งานได้ด้วย AudioEffect API ที่มีอยู่

API ยังสามารถสืบค้นได้ว่าการใช้งานนั้นรองรับการรวมอุปกรณ์/เอฟเฟกต์ที่ระบุหรือไม่

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

ใหม่ HAL APIs

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