جلوه‌های صوتی

از Android 11 به بعد، سازندگان دستگاه این قابلیت را دارند که وقتی دستگاه صوتی خاصی برای ضبط یا بازپخش صدا انتخاب می‌شود، جلوه‌های صوتی خاصی را به‌طور خودکار پیوست و فعال کنند. یکی از بهبودهای عمده این است که جلوه‌های صوتی درج‌شده در مسیر صوتی که به‌طور کامل در زیر HAL صوتی پیاده‌سازی شده است (اتصال مستقیم بین دستگاه ورودی و دستگاه خروجی) می‌تواند توسط چارچوب جلوه‌های صوتی کنترل شود.

این ویژگی دراصل برای تولیدکنندگان اصلی خودرو طراحی شده است اما در دیگر ضریب‌های شکل 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>
  

استفاده از میانای برنامه‌سازی کاربردی سیستم

سازنده جدید @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

لایه انتزاع سخت‌افزار جلوه صوتی

HAL V6.0 جلوه صوتی امضای جدیدی برای روش createEffect() دارد که امکان ایجاد جلوه متصل به دستگاه را فراهم می‌کند:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • AudioSession مشخص‌شده باید AudioSessionConsts.DEVICE باشد.
  • اگر session AudioSessionConsts.DEVICE باشد، AudioIoHandle نادیده گرفته می‌شود.
  • device با AudioPortHandle منحصربه‌فردی که چارچوب صوتی هنگام انتخاب دستگاه در لایه انتزاع سخت‌افزار صوتی با روش IDevice::createAudioPatch() اختصاص می‌دهد شناسایی می‌شود.

لایه انتزاع سخت‌افزار صوتی

برای پشتیبانی از ویژگی جلوه دستگاه، HAL صوتی باید کنترل مسیریابی صوتی را بااستفاده از میانای برنامه‌سازی کاربردی IDevice::createAudioPatch() پیاده‌سازی کند. این مورد با روش گزارش‌دهی IDevice::supportsAudioPatches() true نشان داده می‌شود.

دو روش جدید API، IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) و IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) به پیاده‌سازی HAL می‌گویند که جلوه دستگاه در دستگاهی معین فعال یا غیرفعال شده است.

دستگاه با شناسه AudioPortHandle آن شناسایی می‌شود که هنگام ایجاد وصله صوتی با روش IDevice::createAudioPatch() استفاده می‌شود.

اگر هنگام فعال یا غیرفعال شدن جلوه، هماهنگی بین HALهای صدا و جلوه لازم باشد، پیاده‌سازی می‌تواند از «میاناهای برنامه‌سازی کاربردی» Audio HAL استفاده کند.