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

بدءًا من 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);

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

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

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

واجهات HAL API الجديدة

طبقة HAL للتأثيرات الصوتية

يتضمّن التأثير الصوتي HAL V6.0 توقيعًا جديدًا لطريقة createEffect()، ما يتيح إنشاء تأثير مرتبط بالجهاز:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • يجب أن يكون AudioSession المحدَّد هو AudioSessionConsts.DEVICE.
  • يتم تجاهل AudioIoHandle إذا كان session هو AudioSessionConsts.DEVICE.
  • يتم التعرّف على device من خلال AudioPortHandle الفريد الذي يتم تحديده من خلال إطار عمل الصوت عندما يتم اختيار الجهاز في HAL الصوت باستخدام طريقة IDevice::createAudioPatch().

Audio 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 للصوت والتأثير عند تفعيل تأثير أو إيقافه.