التعامل مع مقبس كهربائي

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

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

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

يصف هذا القسم كيفية تعامل إطار عمل Android مع التغييرات في قدرات الشاشة التي يبدأها Composer HAL.

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

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

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

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

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

اعتبارات متعلّقة بتوصيل الجهاز بدون كابل HDMI

لا يتوافق Android TV إلا مع درجات الدقة التالية:

  • ‫720x1280
  • ‫1080×1920
  • ‫2160x3840
  • ‫4320x7680

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

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

استخدام أرقام تعريف الإعدادات التسلسلية لمنع شروط السباق

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

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

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

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

    • id=1، بدقة 1080×1920 ومعدل تكرار 60 هرتز
    • id=2، بدقة 1080×1920 ومعدل تكرار 50 هرتز
  2. يُطلِق الإطار عمل setActiveConfig(display, config=1).

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

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

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

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

تنتهي العملية التي تستخدم عمليات منح أرقام تعريف غير متسلسلة هنا مع سوء تفسير لتغيير الإعداد المطلوب.

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

لتجنّب شروط السباق هذه، على المصنّع الأصلي للجهاز تنفيذ HAL الخاص بالمؤلف على النحو التالي:

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

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

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

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

    • id=1، بدقة 1080×1920 ومعدل تكرار 60 هرتز
    • id=2، بدقة 1080×1920 ومعدل تكرار 50 هرتز
  2. يُطلِق الإطار عمل setActiveConfig(display, config=1).

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

    • id=3، بدقة 2160×3840 ومعدل 60 هرتز

    • id=4, 2160x3840 50 هرتز

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

    • id=6, 1080x1920 50 هرتز

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

  5. يتلقّى HAL في أداة إنشاء المحتوى setActiveConfig(display, config=1) (من الخطوة 2).

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

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

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

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

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

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