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

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

تستهدف هذه الميزة بشكل أساسي المصنّعين الأصليّين للسيارات ولكن يمكن استخدامها أيضًا في أجهزة Android أخرى من أشكال الأجهزة. مثال على تطبيق يدرج تأثيرًا لتحسين الصوت في موالف 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>
  

استخدام واجهة برمجة تطبيقات للنظام

تمت إضافة دالة إنشاء @SystemApi جديدة إلى android.media.audiofx.AudioEffect الفئة لإنشاء تأثير للجهاز وتفعيله:

AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

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

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

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

واجهات برمجة تطبيقات HAL الجديدة

طبقة تجريد الأجهزة (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().

طبقة تجريد الأجهزة (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 API من خلال تنفيذ إذا كان هناك حاجة إلى تنسيق بين HALs للصوت والتأثير عند تمكين تأثير أو إيقافه.