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

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

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

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

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

डिसप्ले की सुविधाओं में हुए बदलावों को 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 फ़्रेमवर्क, मोबाइल डिवाइसों के लिए बनाया गया है. इसलिए, इसमें डिसकनेक्ट किए गए मुख्य डिसप्ले के लिए, पहले से कोई सुविधा नहीं होती. इसके बजाय, अगर प्राइमरी डिसप्ले फ़िज़िकली डिसकनेक्ट हो जाता है, तो एचएएल को फ़्रेमवर्क के साथ इंटरैक्ट करते समय, प्राइमरी डिसप्ले को प्लेसहोल्डर डिसप्ले से बदलना चाहिए.

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

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

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

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

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

Android TV पर सिर्फ़ इन रिज़ॉल्यूशन में वीडियो चलाए जा सकते हैं:

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

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

अगर एसटीबी या टीवी डोंगल में एचडीएमआई और नॉन-एचडीएमआई, दोनों कनेक्शन हैं, तो एचडीएमआई कनेक्शन को प्राइमरी डिसप्ले माना जाता है और नॉन-एचडीएमआई कनेक्शन को बंद कर दिया जाता है. इसलिए, अगर एचडीएमआई कनेक्शन डिसकनेक्ट हो जाता है, लेकिन नॉन-एचडीएमआई कनेक्शन अब भी कनेक्ट है, तो SurfaceFlinger को एक इवेंट भेजा जाता है. साथ ही, नॉन-एचडीएमआई डिसप्ले की सुविधाओं को 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. साथ ही, Composer HAL, डिसप्ले कॉन्फ़िगरेशन में हुए बदलाव को प्रोसेस करता है और अपनी इंटरनल स्थिति को डिसप्ले कॉन्फ़िगरेशन के नए सेट में अपडेट करता है. इसे यहां दिखाया गया है:

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

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

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

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

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

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

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

नीचे दी गई चर्चा के हिसाब से, यह तरीका रेस की स्थितियों को रोकने का काम करता है.

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

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

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

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

    • id=3, 2160x3840 60 Hz

    • id=4, 2160x3840 50 Hz

    • id=5, 1080x1920 60 Hz

    • id=6, 1080x1920 50 Hz

  4. Composer HAL, फ़्रेमवर्क को onHotplug इवेंट भेजता है. इससे यह पता चलता है कि काम करने वाले मोड का सेट बदल गया है.

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

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

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

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

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

  10. एचएएल सही तरीके से यह समझता है कि फ़्रेमवर्क ने कॉन्फ़िगरेशन को 1080x1920 60 Hz पर बदलने का अनुरोध किया है.

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