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

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

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

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

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

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

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

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

कनेक्शन की सामान्य स्थितियों को मैनेज करना

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

Android फ़्रेमवर्क को मोबाइल डिवाइस के लिए बनाया गया है. इसलिए, इसमें डिसकनेक्ट किए गए मुख्य डिसप्ले के लिए बिल्ट-इन सुविधा नहीं है. इसके बजाय, एचएएल को प्राइमरी डिसप्ले के बजाय प्लेसहोल्डर डिसप्ले का इस्तेमाल करना चाहिए. ऐसा तब होता है, जब प्राइमरी डिसप्ले डिवाइस से डिसकनेक्ट हो जाता है.

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

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

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

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

नॉन-एचडीएमआई कनेक्शन से जुड़ी ज़रूरी बातें

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

क्रम से लगाए जाने वाले आईडी का इस्तेमाल करने के लिए, कंपोज़र एचएएल को कॉन्फ़िगर करना

ऐसी स्थितियों से बचने के लिए, OEM को कंपोज़र एचएएल को इस तरह लागू करना होगा:

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

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

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

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

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

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

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

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

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

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

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