जिन डिवाइसों में एचडीएमआई या DisplayPort के ज़रिए बाहरी डिसप्ले कनेक्ट किए जाते हैं उनमें डिसप्ले की सुविधाएं (जैसे, डिसप्ले मोड और एचडीआर के साथ काम करने वाले टाइप) डाइनैमिक तरीके से बदल सकती हैं. जैसे, Android TV सेट-टॉप-बॉक्स (एसटीबी) और ओवर-द-टॉप (ओटीटी) डिवाइस. एचडीएमआई हॉटप्लग सिग्नल की वजह से, यह बदलाव हो सकता है. जैसे, जब उपयोगकर्ता एक डिसप्ले से दूसरे डिसप्ले पर स्विच करता है या कनेक्ट किए गए डिसप्ले के बिना डिवाइस को बूट करता है. Android 12 और इसके बाद के वर्शन में, हॉटप्लगिंग और डाइनैमिक डिसप्ले की सुविधाओं को मैनेज करने के लिए फ़्रेमवर्क में बदलाव किए गए हैं.
इस पेज पर, Composer HAL को लागू करने के दौरान, डिसप्ले हॉटप्लग और डिसप्ले की क्षमताओं में होने वाले बदलावों को मैनेज करने के बारे में बताया गया है. इसके अलावा, इसमें यह भी बताया गया है कि इससे जुड़े फ़्रेमबफ़र को कैसे मैनेज किया जाए और इन स्थितियों में रेस कंडीशन को कैसे रोका जाए.
डिसप्ले की सुविधाओं को अपडेट करना
इस सेक्शन में बताया गया है कि Android फ़्रेमवर्क, कंपोज़र एचएएल की वजह से डिसप्ले की क्षमताओं में हुए बदलावों को कैसे मैनेज करता है.
Android को डिसप्ले की सुविधाओं में हुए बदलावों को ठीक से मैनेज करने से पहले, ओईएम को कंपोज़र एचएएल को इस तरह से लागू करना होगा कि वह onHotplug(display, connection=CONNECTED) का इस्तेमाल करके, डिसप्ले की सुविधाओं में हुए किसी भी बदलाव के बारे में फ़्रेमवर्क को सूचना दे. इसे लागू करने के बाद, Android डिसप्ले की सुविधाओं में होने वाले बदलावों को इस तरह मैनेज करता है:
- डिस्प्ले की सुविधाओं में बदलाव का पता चलने पर, फ़्रेमवर्क को
onHotplug(display, connection=CONNECTED)सूचना मिलती है. - सूचना मिलने पर, फ़्रेमवर्क अपनी डिसप्ले स्टेट को हटा देता है और एचएएल की नई सुविधाओं के साथ इसे फिर से बनाता है. इसके लिए, वह
getActiveConfig,getDisplayConfigs,getDisplayAttribute,getColorModes,getHdrCapabilities, औरgetDisplayCapabilitiesतरीकों का इस्तेमाल करता है. - फ़्रेमवर्क, डिसप्ले की नई स्थिति को फिर से बनाने के बाद,
onDisplayChangedकॉलबैक को उन ऐप्लिकेशन पर भेजता है जो इस तरह के इवेंट के लिए लिसनिंग कर रहे हैं.
फ़्रेमवर्क, बाद के onHotplug(display, connection=CONNECTED) इवेंट पर फ़्रेमबफ़र को फिर से असाइन करता है. नए फ़्रेमबफ़र असाइन करते समय होने वाली गड़बड़ियों से बचने के लिए, फ़्रेमबफ़र मेमोरी को सही तरीके से मैनेज करने के बारे में ज़्यादा जानने के लिए, क्लाइंट फ़्रेमबफ़र मैनेजमेंट देखें.
कनेक्शन से जुड़ी सामान्य समस्याओं को हल करना
इस सेक्शन में, प्राइमरी डिसप्ले के कनेक्ट और डिसकनेक्ट होने पर, कनेक्शन से जुड़ी अलग-अलग स्थितियों को सही तरीके से हैंडल करने का तरीका बताया गया है.
Android फ़्रेमवर्क को फ़ोन या टैबलेट के लिए बनाया गया है. इसलिए, इसमें डिसकनेक्ट किए गए प्राइमरी डिसप्ले के लिए, पहले से मौजूद सहायता उपलब्ध नहीं है. हालांकि, अगर प्राइमरी डिसप्ले को फ़िज़िकली डिसकनेक्ट कर दिया जाता है, तो HAL को फ़्रेमवर्क के साथ इंटरैक्शन करते समय, प्राइमरी डिसप्ले को प्लेसहोल्डर डिसप्ले से बदलना होगा.
एसटीबी और टीवी डॉन्गल में ये स्थितियां हो सकती हैं. इनमें ऐसे डिसप्ले होते हैं जो बाहरी तौर पर कनेक्ट होते हैं और जिन्हें डिसकनेक्ट किया जा सकता है. इन स्थितियों में सहायता पाने के लिए, यहां दी गई टेबल में मौजूद जानकारी का इस्तेमाल करें:
| परिदृश्य | फ़ोन के रखरखाव का सही तरीका |
|---|---|
| बूट होने के समय कोई डिसप्ले कनेक्ट नहीं है |
|
| प्राइमरी डिसप्ले को फ़िज़िकली कनेक्ट किया गया हो |
|
| प्राइमरी डिसप्ले को फ़िज़िकली डिसकनेक्ट कर दिया गया है |
|
एचडीएमआई के अलावा किसी अन्य तरीके से कनेक्ट करने से जुड़ी बातें
Android TV पर सिर्फ़ इन रिज़ॉल्यूशन का इस्तेमाल किया जा सकता है:
- 720x1280
- 1080x1920
- 2160x3840
- 4320x7680
जब कोई एसटीबी या टीवी डोंगल, CVBS कनेक्शन पर 480i जैसे काम न करने वाले रिज़ॉल्यूशन को दिखाने की कोशिश करता है, तो उपयोगकर्ता को गड़बड़ी का मैसेज दिखता है.
अगर एसटीबी या टीवी डोंगल में एचडीएमआई और नॉन-एचडीएमआई, दोनों तरह के कनेक्शन हैं, तो एचडीएमआई कनेक्शन प्राइमरी डिसप्ले होता है. साथ ही, नॉन-एचडीएमआई कनेक्शन काम नहीं करता. इसलिए, अगर एचडीएमआई कनेक्शन के डिसकनेक्ट होने के दौरान, नॉन-एचडीएमआई कनेक्शन चालू रहता है, तो SurfaceFlinger को एक इवेंट भेजा जाता है. साथ ही, नॉन-एचडीएमआई डिसप्ले की क्षमताओं को getDisplayAttribute और अन्य IComposerClient एपीआई (जैसे कि getHdrCapabilities) के ज़रिए दिखाया जाना चाहिए.
रेस कंडीशन को रोकने के लिए, क्रम के मुताबिक कॉन्फ़िगरेशन आईडी का इस्तेमाल करना
अगर कंपोज़र HAL, setActiveConfig या setActiveConfigWithConstraints को कॉल करने वाले फ़्रेमवर्क के साथ-साथ, डिसप्ले कॉन्फ़िगरेशन को अपडेट करता है, तो रेस कंडीशन हो सकती है. इस समस्या से बचने के लिए, Composer HAL को लागू करें, ताकि क्रम से आईडी का इस्तेमाल किया जा सके.
इस सेक्शन में बताया गया है कि रेस कंडीशन कैसे हो सकती हैं. इसके बाद, Composer HAL को लागू करने के तरीके के बारे में जानकारी दी गई है, ताकि वह क्रम से आईडी का इस्तेमाल करके ऐसी स्थितियों को रोक सके.
यहां इवेंट का एक क्रम दिया गया है. इसमें नए डिसप्ले कॉन्फ़िगरेशन को नए क्रम वाले आईडी असाइन नहीं किए जाते हैं. इससे रेस कंडीशन पैदा होती है:
डिसप्ले कॉन्फ़िगरेशन के ये आईडी इस्तेमाल किए जा सकते हैं:
- id=1, 1080x1920 60 हर्ट्ज़
- id=2, 1080x1920 50 हर्ट्ज़
फ़्रेमवर्क,
setActiveConfig(display, config=1)को कॉल करता है.इसके साथ ही, कंपोज़र HAL, डिसप्ले कॉन्फ़िगरेशन में हुए बदलाव को प्रोसेस करता है. साथ ही, अपनी इंटरनल स्थिति को डिसप्ले कॉन्फ़िगरेशन के नए सेट में अपडेट करता है. इसे इस तरह दिखाया गया है:
- id=1, 2160x3840 60 हर्ट्ज़
- id=2, 2160x3840 50 हर्ट्ज़
- id=3, 1080x1920 60 हर्ट्ज़
- id=4, 1080x1920 50 हर्ट्ज़
कंपोज़र HAL, फ़्रेमवर्क को
onHotplugइवेंट भेजता है, ताकि उसे यह सूचना दी जा सके कि काम करने वाले मोड का सेट बदल गया है.Composer HAL को
setActiveConfig(display, config=1)मिलता है (दूसरे चरण से).HAL, फ़्रेमवर्क के इस अनुरोध को समझता है कि कॉन्फ़िगरेशन को 2160x3840 60 हर्ट्ज़ पर बदलना है. हालांकि, असल में 1080x1920 60 हर्ट्ज़ चुना गया था.
क्रम से आईडी असाइन न करने की प्रोसेस यहां खत्म हो जाती है. साथ ही, कॉन्फ़िगरेशन में किए गए बदलाव की गलत व्याख्या की जाती है.
क्रम के मुताबिक आईडी इस्तेमाल करने के लिए, कंपोज़र एचएएल को कॉन्फ़िगर करना
इस तरह की रेस कंडीशन से बचने के लिए, OEM को Composer HAL को इस तरह लागू करना होगा:
- जब कंपोज़र HAL, डिसप्ले कॉन्फ़िगरेशन को अपडेट करता है, तब वह नए डिसप्ले कॉन्फ़िगरेशन को नए और क्रम से आईडी असाइन करता है.
- जब फ़्रेमवर्क, अमान्य कॉन्फ़िगरेशन आईडी के साथ
setActiveConfigयाsetActiveConfigWithConstraintsको कॉल करता है, तो कंपोज़र HAL कॉल को अनदेखा कर देता है.
इन चरणों से रेस कंडीशन को रोकने में मदद मिलती है. इसके बारे में यहां बताया गया है.
नए डिसप्ले कॉन्फ़िगरेशन को क्रम से नए आईडी असाइन करते समय, इवेंट के इस क्रम पर ध्यान दें:
डिसप्ले कॉन्फ़िगरेशन के ये आईडी इस्तेमाल किए जा सकते हैं:
- id=1, 1080x1920 60 हर्ट्ज़
- id=2, 1080x1920 50 हर्ट्ज़
फ़्रेमवर्क,
setActiveConfig(display, config=1)को कॉल करता है.डिसप्ले कॉन्फ़िगरेशन में बदलाव होने पर, कॉन्फ़िगरेशन आईडी का अगला सेट असाइन किया जाता है. यह सेट, इस्तेमाल न की गई अगली पूर्णांक संख्या से शुरू होता है. इसे इस तरह दिखाया जाता है:
id=3, 2160x3840 60 हर्ट्ज़
id=4, 2160x3840 50 हर्ट्ज़
id=5, 1080x1920 60 हर्ट्ज़
id=6, 1080x1920 50 हर्ट्ज़
Composer HAL, फ़्रेमवर्क को
onHotplugइवेंट भेजता है, ताकि उसे यह सूचना दी जा सके कि काम करने वाले मोड का सेट बदल गया है.Composer HAL को
setActiveConfig(display, config=1)मिलता है (दूसरे चरण से).कंपोज़र HAL, कॉल को अनदेखा करता है, क्योंकि आईडी अब मान्य नहीं है.
फ़्रेमवर्क, चौथे चरण से मिले
onHotplugइवेंट को प्रोसेस करता है. यहgetDisplayConfigsऔरgetDisplayAttributeफ़ंक्शन का इस्तेमाल करके, कंपोज़र एचएएल को कॉल करता है. इन फ़ंक्शन की मदद से फ़्रेमवर्क, चुने गए रिज़ॉल्यूशन और रीफ़्रेश रेट के लिए नया आईडी (5) तय करता है. इस मामले में, रिज़ॉल्यूशन 1080x1920 और रीफ़्रेश रेट 60 हर्ट्ज़ है.फ़्रेमवर्क, अपडेट किए गए आईडी 5 के साथ एक और
setActiveConfigइवेंट भेजता है.Composer HAL को चरण 5 से
setActiveConfig(display, config=5)मिलता है.HAL, फ़्रेमवर्क के अनुरोध को सही तरीके से समझता है. इसमें, कॉन्फ़िगरेशन को 1080x1920 60 हर्ट्ज़ पर बदलने का अनुरोध किया गया है.
ऊपर दिए गए उदाहरण में दिखाया गया है कि क्रम से आईडी असाइन करने की प्रोसेस, यह पुष्टि करती है कि रेस कंडीशन को रोका गया है और डिसप्ले कॉन्फ़िगरेशन में सही बदलाव अपडेट किया गया है.