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

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

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

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

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

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

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

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

  • عندما تعدّل طبقة HAL الخاصة بـ Composer إعدادات العرض المتوافقة، فإنّها تعيّن أرقام تعريف جديدة ومتسلسلة لإعدادات العرض الجديدة.
  • عندما يستدعي إطار العمل 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 هرتز

    • 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 هرتز.

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