تأثيرات الصوت

بدءًا من Android 11، يمكن لمصنّعي الأجهزة تفعيل تأثيرات صوتية معيّنة وإرفاقها تلقائيًا عند اختيار جهاز صوتي معيّن لتسجيل الصوت أو تشغيله. أحد التحسينات الرئيسية هو إمكانية التحكّم في تأثيرات الصوت التي يتم إدراجها في مسار صوتي يتم تنفيذه بالكامل أسفل طبقة تجريد الأجهزة الصوتية (HAL) (اتصال مباشر بين جهاز إدخال وجهاز إخراج) من خلال إطار عمل تأثيرات الصوت.

تستهدف هذه الميزة بشكل أساسي مصنّعي المعدات الأصلية للسيارات، ولكن يمكن استخدامها أيضًا في أشكال أخرى من أجهزة Android. أحد الأمثلة على التطبيقات هو إدراج تأثير تحسين الصوت على مخرج موالف FM عند الاتصال مباشرةً بمكبّر الصوت من خلال معالج الإشارات الرقمية للصوت.

المتطلّبات الأساسية

  • بالنسبة إلى أي تأثير صوتي آخر، يجب أن يتم تنفيذ التأثير من خلال مكتبة مورِّد وإدراجه في ملف الإعداد 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);

بعد إنشاء التأثير من خلال تحديد المعرّف الفريد للتأثير الصوتي ووصف جهاز الصوت، يمكن تفعيله أو إيقافه باستخدام واجهات برمجة التطبيقات الحالية AudioEffect.

تتوفّر أيضًا واجهة برمجة تطبيقات للاستعلام عمّا إذا كان التنفيذ يتيح استخدام مجموعة معيّنة من الأجهزة/التأثيرات.

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

واجهات برمجة تطبيقات جديدة في طبقة تجريد الأجهزة

طبقة تجريد الأجهزة للتأثيرات الصوتية

يحتوي الإصدار 6.0 من طبقة تجريد الأجهزة (HAL) الخاصة بتأثيرات الصوت على توقيع جديد للطريقة 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(). ويتم الإشارة إلى ذلك من خلال IDevice::supportsAudioPatches() طريقة إعداد التقارير true.

تخبر طريقتان جديدتان في واجهة برمجة التطبيقات، IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) و IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)، تنفيذ طبقة تجريد الأجهزة (HAL) بأنّه تم تفعيل أو إيقاف تأثير جهاز معيّن على جهاز محدّد.

يتم تحديد الجهاز من خلال معرّف AudioPortHandle، ويتم استخدامه عند إنشاء رقعة صوتية باستخدام طريقة IDevice::createAudioPatch().

يمكن استخدام واجهات برمجة تطبيقات Audio HAL في عملية التنفيذ إذا كانت هناك حاجة إلى التنسيق بين واجهات برمجة تطبيقات الصوت والتأثير HAL عند تفعيل تأثير أو إيقافه.