از 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باشد.- اگر
sessionAudioSessionConsts.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 استفاده کند.