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

เริ่มต้นใน 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 APIs สามารถใช้งานได้หากจำเป็นต้องมีการประสานงานระหว่างเสียงและเอฟเฟกต์ HAL เมื่อเปิดใช้งานหรือปิดใช้งานเอฟเฟกต์