संगीतकार एचएएल में हॉट प्लग हैंडलिंग

प्रदर्शन क्षमताएं (जैसे डिस्प्ले मोड और समर्थित एचडीआर प्रकार) उन उपकरणों पर गतिशील रूप से बदल सकती हैं जिनमें बाहरी रूप से कनेक्टेड डिस्प्ले (एचडीएमआई या डिस्प्लेपोर्ट के माध्यम से) होते हैं, जैसे एंड्रॉइड टीवी सेट-टॉप-बॉक्स (एसटीबी) और ओवर-द-टॉप (ओटीटी) उपकरण। यह परिवर्तन एचडीएमआई हॉट प्लग सिग्नल के परिणामस्वरूप हो सकता है, जैसे कि जब उपयोगकर्ता एक डिस्प्ले से दूसरे डिस्प्ले पर स्विच करता है या बिना कनेक्टेड डिस्प्ले के डिवाइस को बूट करता है। एंड्रॉइड 12 से, हॉट प्लगिंग और गतिशील प्रदर्शन क्षमताओं को संभालने के लिए ढांचे में बदलाव किए गए हैं।

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

प्रदर्शन क्षमताओं को अद्यतन करना

यह खंड वर्णन करता है कि एंड्रॉइड फ्रेमवर्क संगीतकार एचएएल द्वारा शुरू की गई प्रदर्शन क्षमताओं में परिवर्तन को कैसे संभालता है।

इससे पहले कि एंड्रॉइड डिस्प्ले क्षमताओं में बदलाव को ठीक से संभाल सके, ओईएम को कंपोजर एचएएल को इस तरह लागू करना चाहिए कि वह onHotplug(display, connection=CONNECTED) का उपयोग करता है ताकि डिस्प्ले क्षमताओं में किसी भी बदलाव के ढांचे को सूचित किया जा सके। एक बार इसे लागू करने के बाद, एंड्रॉइड निम्नानुसार क्षमताओं को प्रदर्शित करने के लिए परिवर्तनों को संभालता है:

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

फ्रेमवर्क फ्रेमबफ़र्स को बाद में onHotplug(display, connection=CONNECTED) घटनाओं पर पुन: आवंटित करता है। इसे कैसे हैंडल करें, इस बारे में अधिक जानकारी के लिए फ्रेमबफर मेमोरी को मैनेज करना देखें।

सामान्य कनेक्शन परिदृश्यों को संभालना

यह खंड कवर करता है कि प्राथमिक प्रदर्शन कनेक्ट और डिस्कनेक्ट होने पर आपके कार्यान्वयन में विभिन्न कनेक्शन परिदृश्यों को ठीक से कैसे संभालना है।

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

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

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

    नोट: हम अनुशंसा करते हैं कि प्लेसहोल्डर डिस्प्ले में 1080x1920 के रिज़ॉल्यूशन वाला एकल समर्थित मोड और 60 हर्ट्ज़ की ताज़ा दर हो, क्योंकि यह डिस्प्ले मोड अधिकांश ऐप्स द्वारा समर्थित है।

प्राथमिक प्रदर्शन शारीरिक रूप से जुड़ा हुआ है
  • संगीतकार एचएएल से फ्रेमवर्क में एक और onHotplug(display, connection=CONNECTED) ईवेंट भेजें।

    यह ढांचे को सभी प्रदर्शन क्षमताओं को पुनः लोड करने का कारण बनता है।

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

फ़्रेमबफ़र मेमोरी प्रबंधित करना

जब पहले से कनेक्टेड डिस्प्ले को बाद में onHotplug(display, connection=CONNECTED) अधिसूचना घटना प्राप्त होती है, तो फ्रेमवर्क इस डिस्प्ले से जुड़े फ्रेमबफर को पुन: आवंटित करता है। डिवाइस कार्यान्वयन को इस व्यवहार का अनुमान लगाना चाहिए और फ़्रेमबफ़र मेमोरी को ठीक से प्रबंधित करना चाहिए। अपने कार्यान्वयन में निम्नलिखित दिशानिर्देशों का प्रयोग करें:

  • बाद में onHotplug(display, connection=CONNECTED) अधिसूचना ईवेंट भेजने से पहले, फ्रेमबफ़र्स को हैंडल जारी करना सुनिश्चित करें ताकि सिस्टम उन्हें पुन: आवंटित करने से पहले उन्हें ठीक से हटा सके। यदि डीलोकेशन सफल नहीं होता है, तो स्मृति की कमी के कारण पुन: आवंटन विफल हो सकता है।

  • हम फ्रेमबफ़र्स के लिए एक समर्पित मेमोरी पूल आवंटित करने की अनुशंसा करते हैं जो बाकी ग्राफिक मेमोरी बफर से अलग है।

यह महत्वपूर्ण है क्योंकि फ़्रेमबफ़र्स के डीलोकेशन और पुन: आवंटन के बीच, एक तृतीय पक्ष प्रक्रिया ग्राफिक्स मेमोरी को आवंटित करने का प्रयास कर सकती है। यदि फ़्रेमबफ़र द्वारा समान ग्राफ़िक्स मेमोरी पूल का उपयोग किया जाता है और यदि ग्राफ़िक्स मेमोरी भर जाती है, तो तृतीय पक्ष प्रक्रिया फ़्रेमबफ़र द्वारा पहले आवंटित की गई ग्राफ़िक्स मेमोरी पर कब्जा कर सकती है, इस प्रकार फ़्रेमबफ़र पुनर्वितरण (या संभवतः मेमोरी स्पेस को खंडित करने) के लिए अपर्याप्त मेमोरी छोड़ती है। .

दौड़ की स्थिति को रोकने के लिए अनुक्रमिक कॉन्फ़िगरेशन आईडी का उपयोग करना

रेस की स्थिति उत्पन्न हो सकती है यदि संगीतकार एचएएल समर्थित डिस्प्ले कॉन्फिग को समवर्ती रूप से फ्रेमवर्क कॉलिंग setActiveConfig या setActiveConfigWithConstraints कॉन्फिगविथकॉन्स्ट्रेन्स के साथ अपडेट करता है। इसका समाधान संगीतकार एचएएल को अनुक्रमिक आईडी का उपयोग करने और इस समस्या को रोकने के लिए लागू करना है।

यह खंड वर्णन करता है कि दौड़ की स्थिति कैसे हो सकती है, इसके बाद संगीतकार एचएएल को कैसे लागू किया जाए, इस पर विवरण दिया गया है ताकि ऐसी स्थितियों को रोकने के लिए अनुक्रमिक आईडी का उपयोग किया जा सके।

घटनाओं के निम्नलिखित अनुक्रम पर विचार करें, जब नई, अनुक्रमिक आईडी नई डिस्प्ले कॉन्फ़िगरेशन को असाइन नहीं की जाती हैं, जिससे दौड़ की स्थिति उत्पन्न होती है:

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

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

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

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

  5. संगीतकार एचएएल को setActiveConfig(display, config=1) (चरण 2 से) प्राप्त होता है।

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

गैर-अनुक्रमिक आईडी असाइनमेंट का उपयोग करने की प्रक्रिया यहां वांछित कॉन्फ़िगरेशन परिवर्तन की गलत व्याख्या के साथ समाप्त होती है।

अनुक्रमिक आईडी का उपयोग करने के लिए संगीतकार एचएएल को कॉन्फ़िगर करना

ऐसी दौड़ की स्थिति से बचने के लिए, OEM को संगीतकार एचएएल को निम्नानुसार लागू करना चाहिए:

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

ये कदम दौड़ की स्थिति को रोकने के लिए काम करते हैं जैसा कि निम्नलिखित चर्चा में दिखाया गया है।

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

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

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

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

    • आईडी = 3 , 2160x3840 60 हर्ट्ज

    • आईडी = 4 , 2160x3840 50 हर्ट्ज

    • आईडी = 5 , 1080x1920 60 हर्ट्ज

    • आईडी = 6 , 1080x1920 50 हर्ट्ज

  4. संगीतकार एचएएल एक onHotplug इवेंट को फ्रेमवर्क में भेजता है, यह सूचित करने के लिए कि समर्थित मोड का सेट बदल गया है।

  5. संगीतकार एचएएल को setActiveConfig(display, config=1) (चरण 2 से) प्राप्त होता है।

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

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

  8. फ्रेमवर्क 5 की अद्यतन आईडी के साथ एक और setActiveConfig ईवेंट भेजता है।

  9. संगीतकार HAL को चरण 5 से setActiveConfig(display, config=5) प्राप्त होता है।

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

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