جلوه های صوتی

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

این ویژگی در درجه اول برای OEM های خودرو هدف گذاری شده است، اما می تواند در سایر عوامل فرم اندروید نیز مورد استفاده قرار گیرد. یک برنامه مثال، درج یک جلوه بهبود صدا در خروجی تیونر FM زمانی است که مستقیماً از طریق DSP صوتی به بلندگو متصل است.

پیش نیازها

  • مانند هر جلوه صوتی دیگری، افکت باید توسط یک کتابخانه فروشنده پیاده‌سازی شود و در فایل پیکربندی audio_effects.xml فهرست شود.
  • افکت باید از نوع پیش پردازش یا پس پردازش باشد (پرچم 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);

پس از ایجاد افکت با تعیین شناسه افکت صوتی منحصر به فرد و توصیفگر دستگاه صوتی، می توان آن را با API های AudioEffect موجود فعال یا غیرفعال کرد.

اگر پیاده‌سازی از ترکیب دستگاه/افکت معینی پشتیبانی می‌کند، یک 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 باشد.
  • اگر session AudioSessionConsts.DEVICE باشد AudioIoHandle نادیده گرفته می شود.
  • وقتی دستگاه در HAL صوتی با روش IDevice::createAudioPatch() انتخاب می‌شود، device با AudioPortHandle منحصربه‌فرد آن که توسط چارچوب صوتی اختصاص داده می‌شود، شناسایی می‌شود.

HAL صوتی

برای پشتیبانی از ویژگی جلوه دستگاه، HAL صوتی باید کنترل مسیریابی صدا را با استفاده از API 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های صوتی و جلوه‌ای هنگام فعال یا غیرفعال کردن یک افکت، می‌توان از APIهای HAL صوتی توسط یک پیاده‌سازی استفاده کرد.