الحد الأقصى لعدد أنواع الأجهزة

في صوت Android، يُستخدَم الرمز audio_devices_t لتمثيل نوع الجهاز الصوتي. ويُستخدَم على نطاق واسع في رمز مصدر الصوت كحقل بتات لفلترة جهاز واحد أو أكثر أو اختياره. قبل نظام التشغيل Android 11، كان الحد الأقصى المسموح به هو 30 نوعًا لأجهزة إدخال/إخراج الصوت، ولم تكن هناك خانات فارغة لإضافة أنواع جديدة من أجهزة الصوت. لقد أزلنا الحد الأقصى لعدد أنواع أجهزة الصوت للسماح بإضافة أنواع جديدة من أجهزة الصوت.

لإزالة الحد الأقصى لعدد أنواع أجهزة الصوت، أصبحت أنواع أجهزة الصوت الآن قيمًا مُدرَجة بدلاً من أقنعة بت.

يتم الاحتفاظ بجميع أنواع أجهزة الصوت الحالية كما هي. ويبقى AUDIO_DEVICE_BIT_IN مُستخدَمًا للتمييز بين أجهزة الإدخال أو الإخراج. عند إضافة أنواع أجهزة صوت جديدة، يتم إدراج قيمها في الفجوات بين القيم الحالية.

يجب ألا تستخدم المصنّعين الأصليّين للأجهزة القيمة audio_devices_t كقناع بتات، لأنّ ذلك قد يؤدي إلى نتائج غير متوقّعة عند إضافة أنواع جديدة من أجهزة الصوت المُدرَجة.

الأمثلة والمصدر

قبل الإصدار 11 من Android، كان هناك نوعان شائعان من استخدام أنواع أجهزة الصوت كأقنعة بت.

  • استخدام القيمة audio_devices_t لتمثيل أجهزة صوت متعددة
  • التحقّق مما إذا كانت قيمة audio_devices_t تحتوي على أنواع أجهزة صوت من فئة محدّدة

لتمثيل أنواع متعدّدة من أجهزة الصوت، يتم استخدام فئة باسم DeviceTypeSet في /libaudiofoundation/include/media/AudioContainers.h ، وهي حاوية std::set من audio_devices_t. يتمّ تعريف الفئة في مكتبة libaudiofoundation المتاحة للمورّد. لتمثيل أنواع أجهزة صوت متعددة في رمز C، يمكن استخدام صفيف أو قائمة audio_devices_t.

للتحقّق مما إذا كان نوع جهاز واحد ينتمي إلى فئة محدّدة، استخدِم الدوالّ المساعِدة audio_is_.*_device في /system/media/audio/include/system/audio.h. في حال توفّر أنواع متعددة من أجهزة الصوت، استخدِم الدوال المساعِدة في libaudiofoundation. على سبيل المثال، استخدِم areAllOfSameDeviceType (DeviceTypeSet, std::function) في AudioContainers.h للتحقّق مما إذا كانت جميع أنواع أجهزة الصوت المُدرَجة من النوع نفسه.

التنفيذ

على المصنّعين الأصليّين للأجهزة إزالة تمثيل حقل البتات لنوع الجهاز الصوتي من تنفيذ HAL للصوت.

  1. إزالة جميع مساحة التخزين للأجهزة في حقل بت

    يجب عدم استخدام audio_devices_t لتمثيل عدة أنواع من أجهزة الصوت. بدلاً من ذلك، استخدِم قائمة أو متجهًا.

  2. توقَّف عن استخدام عمليات البتات في مقارنات أنواع الأجهزة.

    قبل الإصدار 11 من Android، يمكن استخدام أنواع أجهزة الصوت كجدول ملف شخصي. في هذه الحالة، من الشائع استخدام عمليات البتات لمقارنات أنواع الأجهزة. عند إضافة أنواع جديدة من أجهزة الصوت المُدرَجة، قد تؤدي عمليات البت إلى نتائج غير متوقّعة. بدلاً من ذلك، استخدِم الدوالّ المساعِدة كبديل. إذا كان هناك نوع واحد لأجهزة الصوت، استخدِم المقارنة المباشرة لمقارنة القيمتَين. للتحقّق مما إذا كان نوع جهاز الصوت ينتمي إلى فئة محدّدة، استخدِم الدوالّ المساعِدة في /system/media/audio/include/system/audio.h. على سبيل المثال: audio_is_output_device(audio_devices_t device).

  3. توقّف عن استخدام القيم المحدّدة مسبقًا لمجموعات أنواع أجهزة الصوت.

    هناك بعض القيم المحدّدة مسبقًا لمجموعات أنواع أجهزة الصوت، AUDIO_DEVICE_OUT_ALL، في system/media/audio/include/system/audio-base-utils.h. كل هذه القيم محجوزة، ولكن قد يتم إيقافها نهائيًا لأنّها لن تكون صحيحة عند إضافة أنواع جديدة من أجهزة الصوت المُدرَجة. هناك مجموعات جديدة من أنواع الأجهزة الصوتية محدّدة في audio-base-utils.h، وهي صفائف من أنواع الأجهزة الصوتية، مثل AUDIO_DEVICE_OUT_ALL_ARRAY.

  4. نفِّذ الطريقتَين create_audio_patch() وrelease_audio_patch() لتوجيه البيانات بدلاً من set_parameters.

    تستخدِم طريقة set_parameters أنواع الأجهزة الصوتية كمجموعة بتات، لذا قد تَظهر نتائج غير متوقّعة في حال إضافة أنواع جديدة من الأجهزة الصوتية المُدرَجة.

    هناك نوعان من تصحيحات الصوت مطلوبان حاليًا:

    • مزج المحتوى مع تصحيحات الجهاز لتشغيله
    • جهاز لخلط المقاطع الصوتية وتسجيلها

    في التحديثات اللاحقة، قد تكون هناك حاجة إلى تصحيحات إضافية للاتصال بين الأجهزة.

    عند إنشاء تصحيح صوتي، إذا لم يتم تحديد اسم معرِّف التصحيح، يجب أن ينشئ HAL الصوتي اسم معرِّف تصحيح فريدًا يمكنه تحديد التصحيح الصوتي. بخلاف ذلك، يجب أن يستخدم HAL للصوت معرّف تصحيح الصوت المحدَّد لتعديل تصحيح الصوت.

    في حال استخدام HAL الصوتي القديم وملف AOSP HIDL wrapper، يجب أن يضبط HAL الصوتي القديم الإصدار الرئيسي من HAL على 3.0.

    لتفعيل ميزة تصحيح الصوت، يجب ضبط واجهة HAL للصوت على الإصدار الرئيسي لواجهة HAL على 3.0 أو إصدار أحدث. يُرجى الرجوع إلى Device::supportsAudioPatches() في تنفيذ HIDL التلقائي لمزيد من المعلومات، والتي يمكن العثور عليها أيضًا في HAL للصوت في Cuttlefish.

التخصيص

لا يمكن إيقاف الميزة أو التراجع عن إعادة صياغة جهاز الصوت في الإطار الذي يتيح إضافة أنواع أجهزة الصوت.

تسمح جميع أنواع أجهزة الصوت المُضافة بتمثيل نوع جهاز باستخدام مجموعة بت واحدة، وبالتالي ستظل عمليات تنفيذ HAL الحالية صالحة.

في حال إضافة أنواع جديدة من أجهزة الصوت وأرادت المصنّعين الأصليّين للأجهزة استخدامها، عليهم ترقية تنفيذ HAL للصوت والانتقال إلى الإصدار 6.0 من HIDL أو إصدار أحدث. من الواجب ترقية الإصدار الرئيسي من HAL إلى 3.0 وتنفيذ الطريقتَين create_audio_patch وrelease_audio_patch، لأنّ استخدام set_parameters لتوجيه البث يمكن أن يؤدي إلى نتائج غير متوقّعة عند إضافة أنواع جديدة من أجهزة الصوت.

التحقُّق

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