يمكن أن تتغيّر إمكانات العرض (مثل أوضاع العرض وأنواع HDR المتوافقة) ديناميكيًا على الأجهزة التي تتضمّن شاشات متصلة خارجيًا (باستخدام HDMI أو DisplayPort)، مثل أجهزة Android TV وأجهزة البث المباشر (OTT). يمكن أن يحدث هذا التغيير نتيجة إشارة hotplug في HDMI، مثل عندما يبدّل المستخدم شاشة بأخرى أو يشغّل الجهاز بدون شاشة متصلة. يتضمّن الإصدار 12 من Android والإصدارات الأحدث تغييرات في إطار العمل للتعامل مع إمكانات التوصيل السريع والعرض الديناميكي.
توضِّح هذه الصفحة كيفية التعامل مع عمليات توصيل الشاشة وفصلها والتغييرات في قدرات الشاشة في عملية تنفيذ Composer HAL. بالإضافة إلى ذلك، يتناول المقال كيفية إدارة إطار التخزين المؤقت المرتبط ومنع حالات السباق في هذه المواقف.
تعديل إمكانات العرض
يصف هذا القسم كيفية تعامل إطار عمل Android مع التغييرات في قدرات الشاشة التي يبدأها Composer HAL.
لكي يتمكّن نظام Android من معالجة التغييرات في إمكانات العرض بشكلٍ سليم، على المصنّع الأصلي للجهاز
تنفيذ Composer HAL بحيث يستخدم onHotplug(display, connection=CONNECTED)
لإعلام إطار العمل بأي تغييرات تطرأ على إمكانات العرض. بعد تنفيذ ذلك، يعالج Android التغييرات في إمكانات العرض على النحو التالي:
- عند رصد تغيير في إمكانات العرض، يتلقّى إطار العمل إشعارًا
onHotplug(display, connection=CONNECTED)
. - عند تلقّي الإشعار، يتخلّص إطار العمل من حالة العرض ويعيد إنشائها باستخدام الإمكانات الجديدة من HAL باستخدام الطرق
getActiveConfig
،getDisplayConfigs
،getDisplayAttribute
،getColorModes
،getHdrCapabilities
، وgetDisplayCapabilities
. - بعد أن يُعيد إطار العمل إنشاء حالة عرض جديدة، يُرسِل الرمز المرجعي
onDisplayChanged
إلى التطبيقات التي تستمع إلى هذه الأحداث.
يعيد الإطار تخصيص ذاكرة التخزين المؤقت للإطارات في أحداث onHotplug(display, connection=CONNECTED)
التالية. راجِع مقالة إدارة ذاكرة إطار التخزين المؤقت للعملاء
لمزيد من المعلومات عن كيفية إدارة ذاكرة إطار التخزين المؤقت بشكلٍ سليم لتجنُّب
الأعطال أثناء تخصيص إطارات تخزين مؤقت جديدة.
التعامل مع سيناريوهات الاتصال الشائعة
يتناول هذا القسم كيفية التعامل بشكل صحيح مع سيناريوهات الاتصال المختلفة في عمليات التنفيذ عند توصيل الشاشة الأساسية وقطع الاتصال بها.
بما أنّ إطار عمل Android مصمّم للأجهزة الجوّالة، لا يتضمّن دعمًا مضمّنًا للشاشة الأساسية غير المتصلة. بدلاً من ذلك، يجب أن يحلّ HAL الشاشة الأساسية محل شاشة نائبة في تفاعلاته مع الإطار في حال انقطاع الاتصال المادي بالشاشة الأساسية.
يمكن أن تحدث السيناريوهات التالية في أجهزة فك التشفير وأجهزة بث الوسائط للتلفزيون التي تحتوي على شاشة متصلة خارجيًا ويمكن فصلها. لتنفيذ التوافق مع هذه السيناريوهات، استخدِم المعلومات الواردة في الجدول أدناه:
السيناريو | التعامل مع الجهاز |
---|---|
عدم توفُّر شاشة متصلة في وقت التشغيل |
|
الشاشة الأساسية متصلة بالجهاز |
|
الشاشة الأساسية غير متصلة بالجهاز |
|
اعتبارات متعلقة بتوصيل غير HDMI
لا يتيح Android TV سوى درجات الدقة التالية:
- 720x1280
- 1080×1920
- 2160x3840
- 4320x7680
عندما يحاول جهاز فك التشفير أو وحدة تحكم التلفزيون عرض درجة دقة غير متوافقة، مثل 480i عبر اتصال CVBS، تظهر رسالة خطأ للمستخدم.
إذا كان جهاز فك التشفير أو وحدة تحكم التلفزيون مزوّدًا بوصلات HDMI وغير HDMI، يكون اتصال HDMI هو الشاشة الأساسية ويكون اتصال غير HDMI غير مفعّل. نتيجةً لذلك، في حال انقطاع اتصال HDMI مع استمرار اتصال getDisplayAttribute
، يتم إرسال حدث إلى SurfaceFlinger ويجب أن تظهر iComposerClient
إمكانات شاشة العرض غير المزوّدة بمنفذ HDMI من خلال getDisplayAttribute
وواجهات برمجة التطبيقات الأخرى iComposerClient
(مثل getHdrCapabilities
).
استخدِم أرقام تعريف الإعدادات التسلسلية لمنع حالات تعارض المهام.
يمكن أن تحدث حالات تداخل في حال عدّل Composer HAL إعدادات الشاشة المتوافقة
بالتزامن مع إطار العمل الذي يستدعي setActiveConfig
أو setActiveConfigWithConstraints
.
يكمن الحل في تنفيذ Composer HAL لاستخدام المعرّفات التسلسلية ومنع
حدوث هذه المشكلة.
يوضّح هذا القسم كيفية حدوث حالات السباق، متبوعًا بتفاصيل حول كيفية تنفيذ Composer HAL لكي يستخدم أرقام تعريف متسلسلة لمنع حدوث مثل هذه الحالات.
فكِّر في تسلسل الأحداث التالي، عندما لا يتم تحديد أرقام تعريف جديدة متسلسلة لإعدادات العرض الجديدة، ما يؤدي إلى حدوث تعارض:
أرقام تعريف إعدادات العرض المتوافقة هي:
- id=1، بدقة 1080×1920 ومعدل 60 هرتز
- id=2، بدقة 1080×1920 ومعدل تكرار 50 هرتز
يُطلِق الإطار عمل
setActiveConfig(display, config=1)
.في الوقت نفسه، يعالج Composer HAL تغيير إعدادات العرض ويُعدِّل حالته الداخلية إلى مجموعة جديدة من إعدادات العرض، كما هو موضّح أدناه:
- id=1، بدقة 2160×3840 ومعدل 60 هرتز
- id=2، بدقة 2160×3840 ومعدل تكرار 50 هرتز
- id=3، بدقة 1080×1920 ومعدل 60 هرتز
- id=4، بدقة 1080×1920 ومعدل تكرار 50 هرتز
يُرسِل Composer HAL حدث
onHotplug
إلى إطار العمل لإعلامه بأنّه تم تغيير مجموعة الأوضاع المتوافقة.يتلقّى HAL في أداة إنشاء المحتوى
setActiveConfig(display, config=1)
(من الخطوة 2).يفسّر HAL أنّ الإطار طلب تغيير الإعدادات إلى 2160x3840 60 هرتز، على الرغم من أنّ المطلوب في الواقع هو 1080x1920 60 هرتز.
تنتهي العملية التي تستخدم عمليات منح أرقام تعريف غير متسلسلة هنا مع سوء تفسير لتغيير الإعداد المطلوب.
ضبط HAL في Composer لاستخدام أرقام التعريف التسلسلية
لتجنُّب حالات السباق هذه، على المصنّع الأصلي للجهاز تنفيذ واجهة برمجة التطبيقات Composer HAL على النحو التالي:
- عندما يعدّل Composer HAL إعدادات العرض المتوافقة، يحدّد أرقام تعريف جديدة متسلسلة لإعدادات العرض الجديدة.
- عندما يطلب إطار العمل
setActiveConfig
أوsetActiveConfigWithConstraints
مع معرّف إعدادات غير صالح، يتجاهل Composer HAL الطلب.
وتساعد هذه الخطوات في منع حالات السباق كما هو موضّح في المناقشة التالية.
راجِع تسلسل الأحداث التالي عند تعيين أرقام تعريف جديدة متسلسلة لإعدادات العرض الجديدة:
أرقام تعريف إعدادات العرض المتوافقة هي:
- id=1، بدقة 1080×1920 ومعدل 60 هرتز
- id=2، بدقة 1080×1920 ومعدل تكرار 50 هرتز
يُطلِق الإطار عمل
setActiveConfig(display, config=1)
.عند معالجة تغيير في إعدادات العرض، يتم تحديد المجموعة التالية من أرقام تعريف الإعدادات بدءًا من العدد الصحيح التالي غير المستخدَم، كما هو موضّح أدناه:
id=3، بدقة 2160×3840 ومعدل 60 هرتز
id=4، بدقة 2160×3840 ومعدل تكرار 50 هرتز
id=5، بدقة 1080×1920 ومعدل تكرار 60 هرتز
id=6، بدقة 1080×1920 ومعدل تكرار 50 هرتز
يُرسِل Composer HAL حدث
onHotplug
إلى إطار العمل لإعلامه بأنّه تم تغيير مجموعة الأوضاع المتوافقة.يتلقّى HAL في أداة إنشاء المحتوى
setActiveConfig(display, config=1)
(من الخطوة 2).يتجاهل Composer HAL المكالمة لأنّ رقم التعريف لم يعُد صالحًا.
يتلقّى الإطار العملي الحدث
onHotplug
من الخطوة 4 ويعالجه. ويُجري التطبيق مكالمة إلى HAL في أداة إنشاء المحتوى باستخدام الدالتَينgetDisplayConfigs
وgetDisplayAttribute
. باستخدام هذه الدوال، يحدِّد إطار العمل المعرّف الجديد (5) للدقة المطلوبة ومقدّر السرعة 1080×1920 و60 هرتز.يُرسِل إطار العمل حدث
setActiveConfig
آخر بمعرّف معدَّل هو 5.يتلقّى HAL في Composer
setActiveConfig(display, config=5)
من الخطوة 5.يفسّر HAL بشكل صحيح أنّ الإطار طلب تغييرًا في الإعدادات إلى 1080×1920 بتردد 60 هرتز.
كما هو موضّح في المثال أعلاه، تضمن العملية التي تستخدم عمليات منح أرقام تعريف متسلسلة منع حدوث حالة السباق وتعديل التغيير الصحيح لإعدادات الشاشة.