معالجة التوصيل السريع

يمكن أن تتغيّر إمكانات العرض (مثل أوضاع العرض وأنواع HDR المتوافقة) بشكل ديناميكي على الأجهزة التي تتضمّن شاشات عرض متصلة خارجيًا (باستخدام HDMI أو DisplayPort)، مثل أجهزة فك التشفير (STB) وأجهزة البث المباشر (OTT) على Android TV. يمكن أن يحدث هذا التغيير نتيجة لإشارة توصيل HDMI السريع، مثلما يحدث عندما ينتقل المستخدم من شاشة إلى أخرى أو عندما يبدأ تشغيل الجهاز بدون شاشة متصلة. يتضمّن نظام التشغيل Android 12 والإصدارات الأحدث تغييرات في إطار العمل للتعامل مع التوصيل السريع وإمكانات العرض الديناميكية.

توضّح هذه الصفحة كيفية التعامل مع عمليات التوصيل السريع لشاشات العرض والتغييرات في إمكانات شاشات العرض في تنفيذ Composer HAL. بالإضافة إلى ذلك، يتناول هذا المستند كيفية إدارة إطار المخزن المؤقت المرتبط ومنع حالات التنازع في هذه الحالات.

تعديل إمكانات العرض

يوضّح هذا القسم كيف يتعامل إطار عمل Android مع التغييرات في إمكانات العرض التي يبدأها Composer HAL.

قبل أن يتمكّن Android من التعامل مع التغييرات في إمكانات العرض بشكل صحيح، على الشركة المصنّعة للمعدات الأصلية تنفيذ Composer HAL بطريقة تستخدم onHotplug(display, connection=CONNECTED) لإعلام إطار العمل بأي تغييرات في إمكانات العرض. بعد تنفيذ ذلك، يتعامل نظام التشغيل Android مع التغييرات في إمكانات العرض على النحو التالي:

  1. عند رصد تغيير في إمكانات العرض، يتلقّى إطار العمل إشعارًا onHotplug(display, connection=CONNECTED).
  2. عند تلقّي الإشعار، يتجاهل إطار العمل حالة العرض ويعيد إنشاءها باستخدام الإمكانات الجديدة من طبقة تجريد الأجهزة (HAL) من خلال استخدام الطرق getActiveConfig وgetDisplayConfigs وgetDisplayAttribute وgetColorModes وgetHdrCapabilities وgetDisplayCapabilities.
  3. بعد أن يعيد إطار العمل إنشاء حالة عرض جديدة، يرسل الدالة onDisplayChanged إلى التطبيقات التي تستمع إلى مثل هذه الأحداث.

يعيد إطار العمل تخصيص مخازن مؤقتة للإطارات عند وقوع أحداث onHotplug(display, connection=CONNECTED) لاحقة. راجِع إدارة مخزن الإطارات في ذاكرة الفيديو لمزيد من المعلومات حول كيفية إدارة ذاكرة مخزن الإطارات بشكل سليم لتجنُّب حدوث أخطاء أثناء تخصيص مخازن إطارات جديدة.

التعامل مع سيناريوهات الربط الشائعة

يتناول هذا القسم كيفية التعامل بشكل صحيح مع سيناريوهات الاتصال المختلفة في عمليات التنفيذ عند توصيل الشاشة الأساسية وفصلها.

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

يمكن أن تحدث السيناريوهات التالية في أجهزة فك التشفير وأجهزة التلفزيون التي تتضمّن شاشات متصلة خارجيًا يمكن فصلها. لتنفيذ دعم لهذه السيناريوهات، استخدِم المعلومات الواردة في الجدول التالي:

السيناريو التعامل مع الجهاز
عدم توفّر شاشة متّصلة عند بدء التشغيل
  • أرسِل إشارة onHotplug(display, connection=CONNECTED) من Composer HAL إلى إطار العمل.
  • استبدِل حالة العرض الفعلي داخل Composer HAL بحالة عرض عنصر نائب.
شاشة العرض الأساسية متصلة فعليًا
  • أرسِل حدثًا آخر onHotplug(display, connection=CONNECTED) من Composer HAL إلى إطار العمل.

    يؤدي ذلك إلى إعادة تحميل جميع إمكانات العرض في إطار العمل.

تم فصل شاشة العرض الأساسية
  • أرسِل حدثًا آخر onHotplug(display, connection=CONNECTED) من Composer HAL إلى إطار العمل.
  • استبدِل حالة العرض الفعلي داخل Composer HAL بحالة عرض عنصر نائب. يجب أن يتضمّن العرض الخاص بالعنصر النائب وضع عرض واحدًا، كي يرسل إطار العمل معاودة الاتصال onDisplayChanged إلى التطبيقات (لأنّ مجموعة أوضاع العرض المتوافقة قد تغيّرت). يجب أن يتطابق وضع العرض الفردي هذا مع وضع العرض النشط الأخير على الشاشة المادية قبل قطع الاتصال، وذلك حتى لا تتلقّى التطبيقات أحداث تغيير الإعدادات.

اعتبارات الاتصال غير HDMI

لا يتيح Android TV سوى درجات الدقة التالية:

  • ‫720x1280
  • 1080x1920
  • 2160x3840
  • 4320x7680

عندما يحاول جهاز فك ترميز أو مفتاح إلكتروني تلفزيوني عرض درجة دقة غير متوافقة، مثل 480i عبر اتصال CVBS، تظهر رسالة خطأ للمستخدم.

إذا كان جهاز فك التشفير أو دونغل التلفزيون يتضمّن كلاً من توصيلات HDMI وغير HDMI، ستكون توصيلة HDMI هي شاشة العرض الأساسية، وستكون توصيلة غير HDMI غير نشطة. نتيجةً لذلك، إذا تم قطع اتصال HDMI بينما كان الاتصال غير HDMI لا يزال نشطًا، سيتم إرسال حدث إلى SurfaceFlinger، ويجب أن تنعكس إمكانات شاشة العرض غير HDMI من خلال getDisplayAttribute وواجهات برمجة التطبيقات الأخرى IComposerClient (مثل getHdrCapabilities).

استخدام أرقام تعريف متسلسلة للإعدادات لتجنُّب حالات التزامن

يمكن أن تحدث حالات تزامن إذا عدّل Composer HAL إعدادات العرض المتوافقة بشكل متزامن مع إطار العمل الذي يستدعي setActiveConfig أو setActiveConfigWithConstraints. الحلّ هو تنفيذ Composer HAL لاستخدام أرقام تعريف تسلسلية وتجنُّب هذه المشكلة.

يوضّح هذا القسم كيف يمكن أن تحدث حالات التزامن، ثم يقدّم تفاصيل حول كيفية تنفيذ Composer HAL بحيث تستخدم أرقام تعريف تسلسلية لمنع حدوث مثل هذه الحالات.

يُرجى مراعاة تسلسل الأحداث التالي، عندما لا يتم تعيين معرّفات تسلسلية جديدة لتصنيفات العرض الجديدة، ما يؤدي إلى حدوث حالة سباق:

  1. معرّفات إعدادات العرض المتوافقة هي:

    • id=1، ‏1080x1920، ‏60 هرتز
    • id=2, 1080x1920 50 Hz
  2. يستدعي إطار العمل setActiveConfig(display, config=1).

  3. في الوقت نفسه، يعالج Composer HAL تغييرًا في إعدادات العرض ويعدّل حالته الداخلية إلى مجموعة جديدة من إعدادات العرض، كما هو موضّح أدناه:

    • id=1، ‏2160x3840 60 هرتز
    • id=2، ‏2160x3840، ‏50 هرتز
    • id=3، ‏1080x1920 60 هرتز
    • id=4، ‏1080x1920، ‏50 هرتز
  4. يرسل Composer HAL حدث onHotplug إلى إطار العمل لإعلامه بأنّ مجموعة الأوضاع المتوافقة قد تغيّرت.

  5. يتلقّى Composer HAL setActiveConfig(display, config=1) (من الخطوة 2).

  6. يفسّر HAL أنّ إطار العمل قد طلب تغيير الإعداد إلى 2160x3840 60 هرتز، على الرغم من أنّه تم في الواقع اختيار 1080x1920 60 هرتز.

تنتهي العملية التي تستخدم عمليات تعيين معرّفات غير متسلسلة هنا مع حدوث سوء فهم لتغيير الإعدادات المحدّدة.

ضبط Composer HAL لاستخدام أرقام تعريف تسلسلية

لتجنُّب حالات التعارض هذه، يجب أن ينفّذ المصنّع الأصلي للجهاز Composer HAL على النحو التالي:

  • عندما يحدِّث Composer HAL إعدادات العرض المتوافقة، يمنحها أرقام تعريف جديدة متسلسلة.
  • عندما يستدعي إطار العمل setActiveConfig أو setActiveConfigWithConstraints باستخدام معرّف إعداد غير صالح، تتجاهل طبقة تجريد الأجهزة (HAL) الخاصة بـ Composer عملية الاستدعاء.

تساعد هذه الخطوات في منع حالات التزامن كما هو موضّح في المناقشة التالية.

ضع في اعتبارك تسلسل الأحداث التالي عند تعيين أرقام تعريف تسلسلية جديدة لإعدادات العرض الجديدة:

  1. معرّفات إعدادات العرض المتوافقة هي:

    • id=1، ‏1080x1920، ‏60 هرتز
    • id=2, 1080x1920 50 Hz
  2. يستدعي إطار العمل setActiveConfig(display, config=1).

  3. عند معالجة تغيير في إعدادات العرض، يتم تعيين المجموعة التالية من أرقام تعريف الإعدادات بدءًا من العدد الصحيح التالي غير المستخدَم، كما هو موضّح أدناه:

    • id=3، ‏2160x3840، ‏60 هرتز

    • id=4, 2160x3840 50 Hz

    • id=5، ‏1080x1920، ‏60 هرتز

    • id=6، ‏1080x1920، ‏50 هرتز

  4. يرسل Composer HAL حدث onHotplug إلى إطار العمل لإعلامه بأنّ مجموعة الأوضاع المتوافقة قد تغيّرت.

  5. يتلقّى Composer HAL setActiveConfig(display, config=1) (من الخطوة 2).

  6. يتجاهل Composer HAL المكالمة لأنّ رقم التعريف لم يعُد صالحًا.

  7. يتلقّى إطار العمل الحدث onHotplug من الخطوة 4 ويعالجه. يتم استدعاء Composer HAL باستخدام الدالتين getDisplayConfigs وgetDisplayAttribute. باستخدام هاتين الدالتين، يحدّد إطار العمل المعرّف الجديد (5) لدرجة الدقة ومعدّل التحديث المحدّدَين 1080x1920 و60 هرتز.

  8. يرسل إطار العمل حدث setActiveConfig آخر بمعرّف معدَّل يساوي 5.

  9. يتلقّى Composer HAL setActiveConfig(display, config=5) من الخطوة 5.

  10. يفسّر HAL بشكل صحيح أنّ إطار العمل قد طلب تغيير الإعداد إلى 1080x1920 بتردد 60 هرتز.

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