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

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

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

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

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

API HAL ใหม่

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