হটপ্লাগ পরিচালনা

যেসব ডিভাইসে বাহ্যিকভাবে ডিসপ্লে (HDMI বা DisplayPort-এর মাধ্যমে) সংযুক্ত থাকে, যেমন অ্যান্ড্রয়েড টিভি সেট-টপ-বক্স (STB) এবং ওভার-দ্য-টপ (OTT) ডিভাইস, সেগুলিতে ডিসপ্লের সক্ষমতা (যেমন ডিসপ্লে মোড এবং সমর্থিত HDR-এর ধরন) গতিশীলভাবে পরিবর্তিত হতে পারে। এই পরিবর্তনটি একটি HDMI হটপ্লাগ সিগন্যালের ফলে ঘটতে পারে, যেমন যখন ব্যবহারকারী একটি ডিসপ্লে থেকে অন্যটিতে পরিবর্তন করেন অথবা কোনো সংযুক্ত ডিসপ্লে ছাড়াই ডিভাইসটি চালু করেন। অ্যান্ড্রয়েড ১২ এবং এর পরবর্তী সংস্করণগুলিতে হটপ্লাগিং এবং গতিশীল ডিসপ্লের সক্ষমতা পরিচালনার জন্য ফ্রেমওয়ার্কে পরিবর্তন আনা হয়েছে।

এই পৃষ্ঠায় কম্পোজার HAL ইমপ্লিমেন্টেশনে ডিসপ্লে হটপ্লাগ এবং ডিসপ্লে সক্ষমতার পরিবর্তন পরিচালনার পদ্ধতি বর্ণনা করা হয়েছে। এছাড়াও, এই পরিস্থিতিগুলোতে সংশ্লিষ্ট ফ্রেমবাফার কীভাবে পরিচালনা করতে হয় এবং রেস কন্ডিশন কীভাবে প্রতিরোধ করতে হয়, তা আলোচনা করা হয়েছে।

ডিসপ্লে ক্ষমতা আপডেট করুন

এই অংশে বর্ণনা করা হয়েছে, কম্পোজার এইচএএল (Composer HAL) দ্বারা প্রবর্তিত ডিসপ্লে সক্ষমতার পরিবর্তনগুলো অ্যান্ড্রয়েড ফ্রেমওয়ার্ক কীভাবে পরিচালনা করে।

অ্যান্ড্রয়েড ডিসপ্লে ক্যাপাবিলিটির পরিবর্তনগুলো সঠিকভাবে পরিচালনা করার আগে, OEM-কে অবশ্যই কম্পোজার HAL এমনভাবে প্রয়োগ করতে হবে যাতে এটি onHotplug(display, connection=CONNECTED) ব্যবহার করে ফ্রেমওয়ার্ককে ডিসপ্লে ক্যাপাবিলিটির যেকোনো পরিবর্তন সম্পর্কে অবহিত করে। এটি প্রয়োগ করার পরে, অ্যান্ড্রয়েড ডিসপ্লে ক্যাপাবিলিটির পরিবর্তনগুলো নিম্নোক্তভাবে পরিচালনা করে:

  1. ডিসপ্লে সক্ষমতায় কোনো পরিবর্তন শনাক্ত হলে, ফ্রেমওয়ার্কটি একটি onHotplug(display, connection=CONNECTED) নোটিফিকেশন গ্রহণ করে।
  2. নোটিফিকেশনটি পাওয়ার পর, ফ্রেমওয়ার্কটি তার ডিসপ্লে স্টেট বাতিল করে দেয় এবং getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities , ও getDisplayCapabilities মেথডগুলো ব্যবহার করে HAL থেকে নতুন ক্যাপাবিলিটিসহ তা পুনরায় তৈরি করে।
  3. ফ্রেমওয়ার্কটি একটি নতুন ডিসপ্লে স্টেট পুনরায় তৈরি করার পর, এটি সেই অ্যাপগুলিতে onDisplayChanged কলব্যাকটি পাঠায় যেগুলি এই ধরনের ইভেন্টের জন্য অপেক্ষা করছে।

ফ্রেমওয়ার্কটি পরবর্তী onHotplug(display, connection=CONNECTED) ইভেন্টগুলিতে ফ্রেমবাফারগুলি পুনরায় বরাদ্দ করে। নতুন ফ্রেমবাফার বরাদ্দের সময় ব্যর্থতা এড়াতে কীভাবে ফ্রেমবাফার মেমরি সঠিকভাবে পরিচালনা করতে হয় সে সম্পর্কে আরও তথ্যের জন্য ক্লায়েন্ট ফ্রেমবাফার ব্যবস্থাপনা দেখুন।

সাধারণ সংযোগ পরিস্থিতিগুলি পরিচালনা করুন

এই অংশে আলোচনা করা হয়েছে, আপনার ইমপ্লিমেন্টেশনে প্রাইমারি ডিসপ্লে সংযুক্ত বা বিচ্ছিন্ন হওয়ার সময় বিভিন্ন সংযোগ পরিস্থিতি কীভাবে সঠিকভাবে সামাল দিতে হয়।

মোবাইল ডিভাইসের জন্য তৈরি হওয়ায়, অ্যান্ড্রয়েড ফ্রেমওয়ার্কে সংযোগ বিচ্ছিন্ন প্রাইমারি ডিসপ্লের জন্য কোনো অন্তর্নির্মিত সমর্থন নেই। এর পরিবর্তে, যখন কোনো প্রাইমারি ডিসপ্লে ভৌতভাবে সংযোগ বিচ্ছিন্ন হয়, তখন ফ্রেমওয়ার্কের সাথে যোগাযোগের সময় HAL-কে অবশ্যই প্রাইমারি ডিসপ্লেটিকে একটি প্লেসহোল্ডার ডিসপ্লে দিয়ে প্রতিস্থাপন করতে হয়।

যেসব STB এবং টিভি ডংগলে বাহ্যিকভাবে সংযুক্ত ডিসপ্লে থাকে যা সংযোগ বিচ্ছিন্ন করা যেতে পারে, সেগুলিতে নিম্নলিখিত পরিস্থিতিগুলি ঘটতে পারে। এই পরিস্থিতিগুলির জন্য সমর্থন বাস্তবায়ন করতে, নিম্নলিখিত সারণিতে দেওয়া তথ্য ব্যবহার করুন:

দৃশ্যকল্প পরিচালনা
বুট করার সময় কোনও সংযুক্ত ডিসপ্লে নেই
  • কম্পোজার HAL থেকে ফ্রেমওয়ার্কে একটি onHotplug(display, connection=CONNECTED) সিগন্যাল পাঠান।
  • কম্পোজার HAL-এর ভেতরের ফিজিক্যাল ডিসপ্লে স্টেটকে একটি প্লেসহোল্ডার ডিসপ্লে স্টেট দিয়ে প্রতিস্থাপন করুন।
প্রাথমিক ডিসপ্লেটি ভৌতভাবে সংযুক্ত
  • কম্পোজার HAL থেকে ফ্রেমওয়ার্কে আরেকটি onHotplug(display, connection=CONNECTED) ইভেন্ট পাঠান।

    এর ফলে ফ্রেমওয়ার্কটি সমস্ত ডিসপ্লে সক্ষমতা পুনরায় লোড করে।

প্রাথমিক ডিসপ্লেটি ভৌতভাবে সংযোগ বিচ্ছিন্ন
  • কম্পোজার HAL থেকে ফ্রেমওয়ার্কে আরেকটি onHotplug(display, connection=CONNECTED) ইভেন্ট পাঠান।
  • কম্পোজার HAL-এর ভিতরে ফিজিক্যাল ডিসপ্লে স্টেটকে একটি প্লেসহোল্ডার ডিসপ্লে স্টেট দিয়ে প্রতিস্থাপন করুন। প্লেসহোল্ডার ডিসপ্লেটির অবশ্যই একটিমাত্র ডিসপ্লে মোড থাকতে হবে, যাতে ফ্রেমওয়ার্ক অ্যাপগুলিতে onDisplayChanged কলব্যাক পাঠাতে পারে (কারণ সমর্থিত মোডগুলির সেট পরিবর্তিত হয়েছে)। এই একটিমাত্র ডিসপ্লে মোডকে অবশ্যই সংযোগ বিচ্ছিন্ন হওয়ার আগে ফিজিক্যাল ডিসপ্লের সর্বশেষ সক্রিয় মোডের সাথে মিলতে হবে, যাতে অ্যাপগুলি কনফিগারেশন পরিবর্তনের ইভেন্ট গ্রহণ না করে।

নন-এইচডিএমআই সংযোগ সংক্রান্ত বিবেচ্য বিষয়

অ্যান্ড্রয়েড টিভি শুধুমাত্র নিম্নলিখিত রেজোলিউশনগুলো সমর্থন করে:

  • ৭২০x১২৮০
  • ১০৮০x১৯২০
  • ২১৬০x৩৮৪০
  • ৪৩২০x৭৬৮০

যখন কোনো STB বা টিভি ডংগল CVBS সংযোগের মাধ্যমে 480i-এর মতো কোনো অসমর্থিত রেজোলিউশন প্রদর্শন করার চেষ্টা করে, তখন ব্যবহারকারীকে একটি ত্রুটির বার্তা দেখানো হয়।

যদি STB বা টিভি ডংগলে HDMI এবং নন-HDMI উভয় সংযোগ থাকে, তবে HDMI সংযোগটি প্রাথমিক ডিসপ্লে হিসেবে কাজ করে এবং নন-HDMI সংযোগটি নিষ্ক্রিয় থাকে। ফলে, নন-HDMI সংযোগটি সংযুক্ত থাকা অবস্থায় যদি HDMI সংযোগটি বিচ্ছিন্ন হয়ে যায়, তবে SurfaceFlinger-এ একটি ইভেন্ট পাঠানো হয় এবং getDisplayAttribute ও অন্যান্য IComposerClient API (যেমন getHdrCapabilities )-এর মাধ্যমে নন-HDMI ডিসপ্লের সক্ষমতাগুলো অবশ্যই প্রতিফলিত করতে হয়।

রেস কন্ডিশন এড়াতে ক্রমিক কনফিগারেশন আইডি ব্যবহার করুন।

ফ্রেমওয়ার্ক যখন setActiveConfig বা setActiveConfigWithConstraints কল করে, ঠিক সেই সময়ে যদি Composer HAL সমর্থিত ডিসপ্লে কনফিগারেশনগুলো আপডেট করে, তাহলে রেস কন্ডিশন দেখা দিতে পারে। এর সমাধান হলো Composer HAL-কে সিকোয়েনশিয়াল আইডি ব্যবহার করার জন্য ইমপ্লিমেন্ট করা এবং এই সমস্যাটি প্রতিরোধ করা।

এই অংশে বর্ণনা করা হয়েছে কীভাবে রেস কন্ডিশন ঘটতে পারে, এবং এরপর কম্পোজার এইচএএল (Composer HAL) কীভাবে প্রয়োগ করতে হয় তার বিশদ বিবরণ দেওয়া হয়েছে, যাতে এটি ক্রমিক আইডি ব্যবহার করে এই ধরনের পরিস্থিতি প্রতিরোধ করতে পারে।

নিম্নলিখিত ঘটনাপ্রবাহটি বিবেচনা করুন, যখন নতুন ডিসপ্লে কনফিগারেশনগুলিতে নতুন, ক্রমিক আইডি বরাদ্দ করা হয় না, যার ফলে একটি রেস কন্ডিশন তৈরি হয়:

  1. সমর্থিত ডিসপ্লে কনফিগারেশন আইডিগুলো হলো:

    • id=1 , 1080x1920 60 Hz
    • id=2 , 1080x1920 50 Hz
  2. ফ্রেমওয়ার্কটি setActiveConfig(display, config=1) কল করে।

  3. একই সাথে, কম্পোজার এইচএএল ডিসপ্লে কনফিগারেশনের পরিবর্তন প্রক্রিয়া করে এবং এর অভ্যন্তরীণ অবস্থাকে নতুন এক সেট ডিসপ্লে কনফিগারেশনে আপডেট করে, যা নিম্নরূপে দেখানো হয়েছে:

    • id=1 , 2160x3840 60 Hz
    • id=2 , 2160x3840 50 Hz
    • id=3 , 1080x1920 60 Hz
    • id=4 , 1080x1920 50 Hz
  4. সমর্থিত মোডগুলোর সেট পরিবর্তিত হয়েছে তা জানানোর জন্য কম্পোজার এইচএএল ফ্রেমওয়ার্ককে একটি onHotplug ইভেন্ট পাঠায়।

  5. কম্পোজার HAL setActiveConfig(display, config=1) (ধাপ ২ থেকে) গ্রহণ করে।

  6. HAL-এর ব্যাখ্যা অনুযায়ী, ফ্রেমওয়ার্কটি 2160x3840 60 Hz- এ কনফিগারেশন পরিবর্তনের অনুরোধ করেছে, যদিও বাস্তবে 1080x1920 60 Hz নির্বাচন করা হয়েছিল।

অক্রমিক আইডি নির্ধারণ ব্যবহার করার প্রক্রিয়াটি নির্বাচিত কনফিগারেশন পরিবর্তনের ভুল ব্যাখ্যার মাধ্যমে এখানে শেষ হয়।

ক্রমিক আইডি ব্যবহার করার জন্য কম্পোজার HAL কনফিগার করুন।

এই ধরনের রেস কন্ডিশন এড়ানোর জন্য, OEM-কে অবশ্যই কম্পোজার HAL নিম্নরূপে প্রয়োগ করতে হবে:

  • যখন কম্পোজার এইচএএল সমর্থিত ডিসপ্লে কনফিগারেশনগুলো আপডেট করে, তখন এটি নতুন ডিসপ্লে কনফিগারেশনগুলোতে নতুন, ক্রমিক আইডি বরাদ্দ করে।
  • যখন ফ্রেমওয়ার্ক একটি অবৈধ কনফিগারেশন আইডি দিয়ে setActiveConfig বা setActiveConfigWithConstraints কল করে, তখন কম্পোজার HAL সেই কলটিকে উপেক্ষা করে।

নিম্নলিখিত আলোচনায় যেমন দেখানো হয়েছে, এই পদক্ষেপগুলো রেস কন্ডিশন প্রতিরোধ করতে সাহায্য করে।

নতুন ডিসপ্লে কনফিগারেশনগুলিতে যখন নতুন, ক্রমিক আইডি বরাদ্দ করা হয়, তখন নিম্নলিখিত ঘটনাপ্রবাহটি বিবেচনা করুন:

  1. সমর্থিত ডিসপ্লে কনফিগারেশন আইডিগুলো হলো:

    • id=1 , 1080x1920 60 Hz
    • 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. সমর্থিত মোডগুলোর সেট পরিবর্তিত হয়েছে তা জানানোর জন্য কম্পোজার HAL ফ্রেমওয়ার্ককে একটি onHotplug ইভেন্ট পাঠায়।

  5. কম্পোজার HAL setActiveConfig(display, config=1) (ধাপ ২ থেকে) গ্রহণ করে।

  6. কম্পোজার এইচএএল কলটি উপেক্ষা করে, কারণ আইডিটি আর বৈধ নয়।

  7. ফ্রেমওয়ার্কটি ধাপ 4 থেকে onHotplug ইভেন্টটি গ্রহণ করে এবং প্রক্রিয়া করে। এটি getDisplayConfigs এবং getDisplayAttribute ফাংশনগুলি ব্যবহার করে Composer HAL-কে কল করে। এই ফাংশনগুলির সাহায্যে ফ্রেমওয়ার্কটি 1080x1920 এবং 60 Hz নির্বাচিত রেজোলিউশন এবং রিফ্রেশ রেটের জন্য নতুন ID (5) সনাক্ত করে।

  8. ফ্রেমওয়ার্কটি ৫ আইডি-র একটি আপডেট সহ আরেকটি setActiveConfig ইভেন্ট পাঠায়।

  9. কম্পোজার HAL, ৫ নং ধাপ থেকে setActiveConfig(display, config=5) গ্রহণ করে।

  10. HAL সঠিকভাবে অনুধাবন করছে যে ফ্রেমওয়ার্কটি 1080x1920 60 Hz-এ কনফিগারেশন পরিবর্তনের অনুরোধ করেছে।

পূর্ববর্তী উদাহরণে যেমন দেখানো হয়েছে, ক্রমিক আইডি নির্ধারণ ব্যবহারকারী প্রক্রিয়াটি যাচাই করে যে রেস কন্ডিশন প্রতিরোধ করা হয়েছে এবং সঠিক ডিসপ্লে কনফিগারেশন পরিবর্তনটি আপডেট করা হয়েছে।