जिन डिवाइसों में बाहरी डिसप्ले (एचडीएमआई या DisplayPort के साथ) कनेक्ट किए जाते हैं उनमें डिसप्ले की सुविधाएं (जैसे, डिसप्ले मोड और एचडीआर के साथ काम करने वाले टाइप) डाइनैमिक तरीके से बदल सकती हैं. जैसे, Android TV सेट-टॉप-बॉक्स (एसटीबी) और ओवर-द-टॉप (ओटीटी) डिवाइस. यह बदलाव, एचडीएमआई हॉटप्लग सिग्नल की वजह से हो सकता है. जैसे, जब उपयोगकर्ता एक डिसप्ले से दूसरे डिसप्ले पर स्विच करता है या कनेक्ट किए गए डिसप्ले के बिना डिवाइस को बूट करता है. Android 12 और इसके बाद के वर्शन में, हॉटप्लगिंग और डाइनैमिक डिसप्ले की सुविधाओं को मैनेज करने के लिए, फ़्रेमवर्क में बदलाव किए गए हैं.
इस पेज पर, Composer HAL को लागू करने के दौरान, डिसप्ले हॉटप्लग और डिसप्ले की सुविधाओं में होने वाले बदलावों को मैनेज करने के बारे में बताया गया है. इसके अलावा, इसमें यह भी बताया गया है कि इससे जुड़े फ़्रेमबफ़र को कैसे मैनेज किया जाए और इन स्थितियों में रेस कंडीशन को कैसे रोका जाए.
डिसप्ले की सुविधाओं को अपडेट करना
इस सेक्शन में बताया गया है कि Android फ़्रेमवर्क, Composer HAL की मदद से शुरू की गई डिसप्ले की सुविधाओं में होने वाले बदलावों को कैसे मैनेज करता है.
डिसप्ले की सुविधाओं में हुए बदलावों को Android सही तरीके से मैनेज कर सके, इसके लिए OEM को Composer HAL को इस तरह से लागू करना होगा कि वह डिसप्ले की सुविधाओं में हुए किसी भी बदलाव के बारे में फ़्रेमवर्क को सूचना देने के लिए, 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 को लागू करने के तरीके के बारे में जानकारी दी गई है, ताकि वह क्रम से आईडी का इस्तेमाल करके ऐसी स्थितियों को रोक सके.
यहां इवेंट का एक क्रम दिया गया है. इसमें नए डिसप्ले कॉन्फ़िगरेशन को नए और क्रम से आईडी असाइन नहीं किए जाते हैं. इससे रेस कंडीशन पैदा होती है:
डिसप्ले कॉन्फ़िगरेशन के इन आईडी का इस्तेमाल किया जा सकता है:
- 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इवेंट भेजता है, ताकि उसे यह सूचना दी जा सके कि काम करने वाले मोड के सेट में बदलाव हुआ है.कंपोज़र एचएएल को
setActiveConfig(display, config=1)मिलता है (दूसरे चरण से).HAL, फ़्रेमवर्क के इस अनुरोध को समझता है कि कॉन्फ़िगरेशन को 2160x3840 60 हर्ट्ज़ पर बदलना है. हालांकि, असल में 1080x1920 60 हर्ट्ज़ को चुना गया था.
क्रम से आईडी असाइन न करने की प्रोसेस यहां खत्म हो जाती है. साथ ही, कॉन्फ़िगरेशन में किए गए बदलाव की गलत व्याख्या की जाती है.
क्रम के मुताबिक आईडी इस्तेमाल करने के लिए, Composer HAL को कॉन्फ़िगर करना
इस तरह की रेस कंडीशन से बचने के लिए, OEM को Composer HAL को इस तरह लागू करना होगा:
- जब कंपोज़र HAL, काम करने वाली डिसप्ले कॉन्फ़िगरेशन को अपडेट करता है, तो वह नए डिसप्ले कॉन्फ़िगरेशन को नए और क्रम से आईडी असाइन करता है.
- जब फ़्रेमवर्क, अमान्य कॉन्फ़िगरेशन आईडी के साथ
setActiveConfigयाsetActiveConfigWithConstraintsको कॉल करता है, तो कंपोज़र एचएएल कॉल को अनदेखा कर देता है.
इन चरणों से रेस कंडीशन को रोकने में मदद मिलती है. इसके बारे में यहां बताया गया है.
नए डिसप्ले कॉन्फ़िगरेशन को क्रम से नए आईडी असाइन करते समय, इवेंट के इस क्रम पर ध्यान दें:
डिसप्ले कॉन्फ़िगरेशन के इन आईडी का इस्तेमाल किया जा सकता है:
- 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 हर्ट्ज़
कंपोज़र HAL, फ़्रेमवर्क को
onHotplugइवेंट भेजता है, ताकि उसे यह सूचना दी जा सके कि काम करने वाले मोड का सेट बदल गया है.कंपोज़र एचएएल को
setActiveConfig(display, config=1)मिलता है (दूसरे चरण से).आईडी अब मान्य नहीं है. इसलिए, कंपोज़र HAL इस कॉल को अनदेखा कर देता है.
फ़्रेमवर्क, चौथे चरण से
onHotplugइवेंट को पाता है और उसे प्रोसेस करता है. यहgetDisplayConfigsऔरgetDisplayAttributeफ़ंक्शन का इस्तेमाल करके, कंपोज़र एचएएल को कॉल करता है. इन फ़ंक्शन की मदद से फ़्रेमवर्क, चुने गए रिज़ॉल्यूशन और रीफ़्रेश रेट के लिए नया आईडी (5) पहचानता है. यहां रिज़ॉल्यूशन 1080x1920 और रीफ़्रेश रेट 60 हर्ट्ज़ है.फ़्रेमवर्क, अपडेट किए गए आईडी 5 के साथ एक और
setActiveConfigइवेंट भेजता है.कंपोज़र HAL को चरण 5 से
setActiveConfig(display, config=5)मिलता है.HAL, फ़्रेमवर्क के इस अनुरोध को सही तरीके से समझता है कि कॉन्फ़िगरेशन को 1080x1920 60 हर्ट्ज़ पर बदलना है.
ऊपर दिए गए उदाहरण में दिखाया गया है कि क्रम से आईडी असाइन करने की प्रोसेस, यह पुष्टि करती है कि रेस कंडीशन को रोका गया है और डिसप्ले कॉन्फ़िगरेशन में किया गया सही बदलाव अपडेट किया गया है.