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

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

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

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

  • สำหรับเอฟเฟกต์เสียงอื่นๆ เอฟเฟกต์ดังกล่าวจะต้องใช้งานโดยไลบรารีของผู้ให้บริการและระบุไว้ในรายการ ในไฟล์การกำหนดค่า audio_effects.xml
  • เอฟเฟกต์ต้องเป็นประเภทการประมวลผลล่วงหน้าหรือประมวลผลภายหลัง (แจ้งว่า TYPE_PRE_PROC หรือ TYPE_POST_PROC ไม่เหมาะสม ที่ตั้งไว้ใน EffectDescriptor.flags)
  • หากการใช้เอฟเฟกต์เป็นแบบเร่งความเร็ว (ตั้งค่า Flag HW_ACC_TUNNEL ใน EffectDescriptor.flags) จึงสามารถเชื่อมต่อกับเส้นทางเสียงที่เชื่อมต่ออยู่ด้านล่าง HAL โดยสมบูรณ์ (ไม่สามารถเล่น หรือบันทึกสตรีมเสียงที่เปิดที่ HAL เสียง)

สร้างและเปิดใช้เอฟเฟกต์อุปกรณ์

คุณสร้างเอฟเฟกต์เสียงเฉพาะอุปกรณ์ได้โดยใช้ 1 ใน 2 วิธีด้านล่าง

ใช้ไฟล์การกำหนดค่าเอฟเฟกต์เสียง

วิธีการนี้ช่วยให้สร้างเอฟเฟกต์เสียงแบบคงที่ซึ่งแนบอย่างเป็นระบบ และเปิดใช้กับเส้นทางเสียงใดก็ได้ที่เลือกอุปกรณ์ที่ระบุเป็นซิงก์หรือแหล่งที่มา

ซึ่งทำได้ด้วยการเพิ่มหัวข้อที่เฉพาะเจาะจงใน 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);

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

คุณยังใช้ 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()

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