हॉटप्लग हैंडलिंग

जिन डिवाइसों में बाहरी डिसप्ले (एचडीएमआई या DisplayPort के साथ) कनेक्ट किए जाते हैं उनमें डिसप्ले की सुविधाएं (जैसे, डिसप्ले मोड और एचडीआर के साथ काम करने वाले टाइप) डाइनैमिक तरीके से बदल सकती हैं. जैसे, Android TV सेट-टॉप-बॉक्स (एसटीबी) और ओवर-द-टॉप (ओटीटी) डिवाइस. यह बदलाव, एचडीएमआई हॉटप्लग सिग्नल की वजह से हो सकता है. जैसे, जब उपयोगकर्ता एक डिसप्ले से दूसरे डिसप्ले पर स्विच करता है या कनेक्ट किए गए डिसप्ले के बिना डिवाइस को बूट करता है. Android 12 और इसके बाद के वर्शन में, हॉटप्लगिंग और डाइनैमिक डिसप्ले की सुविधाओं को मैनेज करने के लिए, फ़्रेमवर्क में बदलाव किए गए हैं.

इस पेज पर, Composer HAL को लागू करने के दौरान, डिसप्ले हॉटप्लग और डिसप्ले की सुविधाओं में होने वाले बदलावों को मैनेज करने के बारे में बताया गया है. इसके अलावा, इसमें यह भी बताया गया है कि इससे जुड़े फ़्रेमबफ़र को कैसे मैनेज किया जाए और इन स्थितियों में रेस कंडीशन को कैसे रोका जाए.

डिसप्ले की सुविधाओं को अपडेट करना

इस सेक्शन में बताया गया है कि Android फ़्रेमवर्क, Composer HAL की मदद से शुरू की गई डिसप्ले की सुविधाओं में होने वाले बदलावों को कैसे मैनेज करता है.

Android, डिसप्ले की सुविधाओं में हुए बदलावों को ठीक से मैनेज कर सके, इसके लिए OEM को Composer HAL को इस तरह से लागू करना होगा कि वह onHotplug(display, connection=CONNECTED) का इस्तेमाल करके, डिसप्ले की सुविधाओं में हुए किसी भी बदलाव के बारे में फ़्रेमवर्क को सूचना दे सके. इसके बाद, Android, डिसप्ले की सुविधाओं में होने वाले बदलावों को इस तरह मैनेज करता है:

  1. डिस्प्ले की सुविधाओं में बदलाव का पता चलने पर, फ़्रेमवर्क को onHotplug(display, connection=CONNECTED) सूचना मिलती है.
  2. सूचना मिलने पर, फ़्रेमवर्क अपनी डिसप्ले स्टेट को हटा देता है. साथ ही, getActiveConfig, getDisplayConfigs, getDisplayAttribute, getColorModes, getHdrCapabilities, और getDisplayCapabilities तरीकों का इस्तेमाल करके, एचएएल की नई सुविधाओं के साथ इसे फिर से बनाता है.
  3. फ़्रेमवर्क, डिसप्ले की नई स्थिति को फिर से बनाने के बाद, उन ऐप्लिकेशन को onDisplayChanged कॉलबैक भेजता है जो इस तरह के इवेंट के लिए लिसनिंग कर रहे हैं.

फ़्रेमवर्क, बाद के onHotplug(display, connection=CONNECTED) इवेंट पर फ़्रेमबफ़र को फिर से असाइन करता है. नए फ़्रेमबफ़र के लिए मेमोरी असाइन करते समय होने वाली गड़बड़ियों से बचने के लिए, फ़्रेमबफ़र मेमोरी को सही तरीके से मैनेज करने के बारे में ज़्यादा जानने के लिए, क्लाइंट फ़्रेमबफ़र मैनेजमेंट देखें.

कनेक्शन से जुड़ी सामान्य समस्याओं को हल करना

इस सेक्शन में, प्राइमरी डिसप्ले के कनेक्ट और डिसकनेक्ट होने पर, कनेक्शन से जुड़ी अलग-अलग स्थितियों को सही तरीके से हैंडल करने का तरीका बताया गया है.

Android फ़्रेमवर्क को मोबाइल डिवाइसों के लिए बनाया गया है. इसलिए, इसमें डिसकनेक्ट किए गए प्राइमरी डिसप्ले के लिए, पहले से मौजूद सहायता उपलब्ध नहीं है. हालांकि, अगर प्राइमरी डिसप्ले को फ़िज़िकली डिसकनेक्ट कर दिया जाता है, तो HAL को फ़्रेमवर्क के साथ इंटरैक्शन करते समय, प्राइमरी डिसप्ले को प्लेसहोल्डर डिसप्ले से बदलना होगा.

एसटीबी और टीवी डॉन्गल में ये स्थितियां हो सकती हैं. इनमें ऐसे डिसप्ले होते हैं जो बाहरी तौर पर कनेक्ट होते हैं और जिन्हें डिसकनेक्ट किया जा सकता है. इन स्थितियों में सहायता पाने के लिए, यहां दी गई टेबल में मौजूद जानकारी का इस्तेमाल करें:

स्थिति फ़ोन के रखरखाव का सही तरीका
बूट होने के समय कोई डिसप्ले कनेक्ट नहीं है
  • Composer HAL से फ़्रेमवर्क को onHotplug(display, connection=CONNECTED) सिग्नल भेजता है.
  • Composer HAL में, फ़िज़िकल डिसप्ले की स्थिति को प्लेसहोल्डर डिसप्ले की स्थिति से बदलें.
प्राइमरी डिसप्ले को फ़िज़िकली कनेक्ट किया गया हो
  • Composer HAL से फ़्रेमवर्क को दूसरा onHotplug(display, connection=CONNECTED) इवेंट भेजें.

    इससे फ़्रेमवर्क, डिसप्ले से जुड़ी सभी सुविधाओं को फिर से लोड करता है.

प्राइमरी डिसप्ले को डिसकनेक्ट कर दिया गया है
  • Composer HAL से फ़्रेमवर्क को दूसरा onHotplug(display, connection=CONNECTED) इवेंट भेजें.
  • Composer HAL में, फ़िज़िकल डिसप्ले की स्थिति को प्लेसहोल्डर डिसप्ले की स्थिति से बदलें. प्लेसहोल्डर डिसप्ले में एक ही डिसप्ले मोड होना चाहिए, ताकि फ़्रेमवर्क, ऐप्लिकेशन को onDisplayChanged कॉलबैक भेज सके. ऐसा इसलिए, क्योंकि इस्तेमाल किए जा सकने वाले मोड का सेट बदल गया है. यह सिंगल डिसप्ले मोड, डिसकनेक्ट होने से पहले फ़िज़िकल डिसप्ले के आखिरी ऐक्टिव मोड से मेल खाना चाहिए, ताकि ऐप्लिकेशन को कॉन्फ़िगरेशन में बदलाव से जुड़े इवेंट न मिलें.

एचडीएमआई के अलावा किसी अन्य तरीके से कनेक्ट करने से जुड़ी बातें

Android TV पर सिर्फ़ इन रिज़ॉल्यूशन का इस्तेमाल किया जा सकता है:

  • 720x1280
  • 1080x1920
  • 2160x3840
  • 4320x7680

जब कोई एसटीबी या टीवी डोंगल, CVBS कनेक्शन पर 480i जैसे रिज़ॉल्यूशन को दिखाने की कोशिश करता है, तो उपयोगकर्ता को गड़बड़ी का मैसेज दिखता है.

अगर एसटीबी या टीवी डॉन्गल में एचडीएमआई और नॉन-एचडीएमआई, दोनों तरह के कनेक्शन हैं, तो एचडीएमआई कनेक्शन प्राइमरी डिसप्ले होता है और नॉन-एचडीएमआई कनेक्शन काम नहीं करता. इसलिए, अगर एचडीएमआई कनेक्शन डिसकनेक्ट हो जाता है और नॉन-एचडीएमआई कनेक्शन अब भी कनेक्ट है, तो SurfaceFlinger को एक इवेंट भेजा जाता है. साथ ही, नॉन-एचडीएमआई डिसप्ले की सुविधाओं को getDisplayAttribute और अन्य iComposerClient एपीआई (जैसे कि getHdrCapabilities) के ज़रिए दिखाया जाना चाहिए.

रेस कंडीशन को रोकने के लिए, क्रम के मुताबिक कॉन्फ़िगरेशन आईडी का इस्तेमाल करना

अगर कंपोज़र HAL, setActiveConfig या setActiveConfigWithConstraints को कॉल करने वाले फ़्रेमवर्क के साथ-साथ, डिसप्ले कॉन्फ़िगरेशन को अपडेट करता है, तो रेस कंडीशन की समस्या हो सकती है. इस समस्या को रोकने के लिए, क्रम से आईडी का इस्तेमाल करने के लिए Composer HAL को लागू करें.

इस सेक्शन में बताया गया है कि रेस कंडीशन कैसे हो सकती हैं. इसके बाद, Composer HAL को लागू करने के तरीके के बारे में जानकारी दी गई है, ताकि वह क्रम से आईडी का इस्तेमाल करके ऐसी स्थितियों को रोक सके.

यहां इवेंट का एक क्रम दिया गया है. इसमें नए डिसप्ले कॉन्फ़िगरेशन को नए और क्रम से आईडी असाइन नहीं किए जाते हैं. इससे रेस कंडीशन पैदा होती है:

  1. डिसप्ले कॉन्फ़िगरेशन के इन आईडी का इस्तेमाल किया जा सकता है:

    • id=1, 1080x1920 60 हर्ट्ज़
    • id=2, 1080x1920 50 हर्ट्ज़
  2. फ़्रेमवर्क, setActiveConfig(display, config=1) को कॉल करता है.

  3. इसके साथ ही, कंपोज़र HAL, डिसप्ले कॉन्फ़िगरेशन में हुए बदलाव को प्रोसेस करता है. साथ ही, अपनी इंटरनल स्थिति को डिसप्ले कॉन्फ़िगरेशन के नए सेट में अपडेट करता है. इसे इस तरह दिखाया गया है:

    • id=1, 2160x3840 60 हर्ट्ज़
    • id=2, 2160x3840 50 हर्ट्ज़
    • id=3, 1080x1920 60 हर्ट्ज़
    • id=4, 1080x1920 50 हर्ट्ज़
  4. कंपोज़र HAL, फ़्रेमवर्क को onHotplug इवेंट भेजता है, ताकि यह सूचना दी जा सके कि काम करने वाले मोड का सेट बदल गया है.

  5. कंपोज़र HAL को setActiveConfig(display, config=1) मिलता है (दूसरे चरण से).

  6. HAL को लगता है कि फ़्रेमवर्क ने कॉन्फ़िगरेशन में बदलाव करने का अनुरोध किया है. यह अनुरोध 2160x3840 60 Hz के लिए किया गया है. हालांकि, असल में 1080x1920 60 Hz के लिए अनुरोध किया गया था.

आईडी असाइन करने की इस प्रोसेस में, आईडी क्रम से असाइन नहीं किए जाते. इसलिए, यहां कॉन्फ़िगरेशन में किए गए बदलाव को गलत तरीके से समझा जाता है.

क्रम के मुताबिक आईडी इस्तेमाल करने के लिए, Composer HAL को कॉन्फ़िगर करना

इस तरह की रेस कंडीशन से बचने के लिए, OEM को Composer HAL को इस तरह लागू करना होगा:

  • जब कंपोज़र HAL, काम करने वाली डिसप्ले कॉन्फ़िगरेशन को अपडेट करता है, तो वह नए डिसप्ले कॉन्फ़िगरेशन को नए और क्रम से आईडी असाइन करता है.
  • जब फ़्रेमवर्क, अमान्य कॉन्फ़िगरेशन आईडी के साथ setActiveConfig या setActiveConfigWithConstraints को कॉल करता है, तो कंपोज़र HAL कॉल को अनदेखा कर देता है.

इन चरणों से रेस कंडीशन को रोकने में मदद मिलती है. इसके बारे में यहां बताया गया है.

नए डिसप्ले कॉन्फ़िगरेशन को क्रम से नए आईडी असाइन करते समय, इवेंट के इस क्रम पर ध्यान दें:

  1. डिसप्ले कॉन्फ़िगरेशन के इन आईडी का इस्तेमाल किया जा सकता है:

    • id=1, 1080x1920 60 हर्ट्ज़
    • id=2, 1080x1920 50 हर्ट्ज़
  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. कंपोज़र एचएएल को setActiveConfig(display, config=1) मिलता है (दूसरे चरण से).

  6. आईडी अब मान्य नहीं है. इसलिए, कंपोज़र HAL इस कॉल को अनदेखा कर देता है.

  7. फ़्रेमवर्क, चौथे चरण से onHotplug इवेंट को पाता है और उसे प्रोसेस करता है. यह getDisplayConfigs और getDisplayAttribute फ़ंक्शन का इस्तेमाल करके, कंपोज़र एचएएल को कॉल करता है. इन फ़ंक्शन की मदद से फ़्रेमवर्क, 1080x1920 के रिज़ॉल्यूशन और 60 हर्ट्ज़ की रीफ़्रेश दर के लिए नया आईडी (5) तय करता है.

  8. फ़्रेमवर्क, अपडेट किए गए आईडी 5 के साथ एक और setActiveConfig इवेंट भेजता है.

  9. कंपोज़र HAL को पांचवें चरण से setActiveConfig(display, config=5) मिलता है.

  10. HAL, फ़्रेमवर्क के अनुरोध को सही तरीके से समझता है. इसमें, कॉन्फ़िगरेशन को 1080x1920 60 हर्ट्ज़ पर बदलने का अनुरोध किया गया है.

ऊपर दिए गए उदाहरण में दिखाया गया है कि क्रम से आईडी असाइन करने की प्रोसेस यह पक्का करती है कि रेस कंडीशन को रोका जाए और डिसप्ले कॉन्फ़िगरेशन में सही बदलाव अपडेट किया जाए.