از اندروید ۱۱ به بعد، تولیدکنندگان دستگاهها این قابلیت را دارند که هنگام انتخاب یک دستگاه صوتی مشخص برای ضبط یا پخش صدا، جلوههای صوتی خاصی را بهطور خودکار ضمیمه و فعال کنند. یکی از پیشرفتهای عمده این است که جلوههای صوتی درجشده در یک مسیر صوتی که بهطور کامل در زیر HAL صوتی (اتصال مستقیم بین یک دستگاه ورودی و یک دستگاه خروجی) پیادهسازی شده است، میتوانند توسط چارچوب جلوههای صوتی کنترل شوند.
این ویژگی در درجه اول برای تولیدکنندگان اصلی تجهیزات (OEM) خودرو در نظر گرفته شده است، اما میتواند در سایر فرم فاکتورهای اندروید نیز مورد استفاده قرار گیرد. یک برنامه نمونه، هنگام اتصال مستقیم به بلندگو از طریق DSP صوتی، یک جلوه تقویت صدا را روی خروجی تیونر FM قرار میدهد.
پیشنیازها
- همانند هر افکت صوتی دیگر، این افکت باید توسط یک کتابخانهی فروشنده پیادهسازی شده و در فایل پیکربندی
audio_effects.xmlفهرست شود. - افکت باید از نوع پیشپردازش یا پسپردازش باشد (flag
TYPE_PRE_PROCیاTYPE_POST_PROCدرEffectDescriptor.flagsتنظیم شده باشد). - اگر پیادهسازی افکت با HW acceleration (تنظیم پرچم
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);
رابطهای برنامهنویسی کاربردی جدید HAL
جلوه صوتی HAL
افکت صوتی HAL نسخه ۶.۰ یک امضای جدید برای متد createEffect() دارد که امکان ایجاد یک افکت متصل به یک دستگاه را فراهم میکند:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
-
AudioSessionمشخص شده بایدAudioSessionConsts.DEVICEباشد. - اگر
sessionبرابر باAudioSessionConsts.DEVICEباشد،AudioIoHandleنادیده گرفته میشود. - این
deviceتوسطAudioPortHandleمنحصر به فرد خود که توسط چارچوب صوتی اختصاص داده شده است، هنگام انتخاب دستگاه در HAL صوتی با روشIDevice::createAudioPatch()شناسایی میشود.
صوتی 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 صوتی توسط یک پیادهسازی استفاده کرد.