হটপ্লাগ হ্যান্ডেল করা

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

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

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

এই বিভাগে বর্ণনা করা হয়েছে যে Composer HAL-এর মাধ্যমে শুরু করা ডিসপ্লে ক্ষমতার পরিবর্তন 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 ফ্রেমওয়ার্কে ডিসকানেক্ট করা প্রাইমারি ডিসপ্লের জন্য বিল্ট-ইন সহায়তা নেই। এর পরিবর্তে, প্রাইমারি ডিসপ্লে ফিজিক্যালি ডিসকানেক্ট করা হলে, ফ্রেমওয়ার্কের সাথে ইন্টার‍্যাকশনের সময় HAL-কে প্রাইমারি ডিসপ্লের জায়গায় প্লেসহোল্ডার ডিসপ্লে রাখতে হবে।

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

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

    এর ফলে ফ্রেমওয়ার্ক সব ডিসপ্লে ক্যাপাবিলিটি আবার লোড করে।

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

নন-HDMI কানেকশন সংক্রান্ত বিবেচ্য বিষয়

Android TV-তে শুধু নিম্নলিখিত রেজোলিউশন কাজ করে:

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

STB বা TV ডঙ্গল যখন কোনও কাজ করে না এমন রেজোলিউশন দেখানোর চেষ্টা করে, যেমন CVBS কানেকশনের মাধ্যমে 480i, তখন ব্যবহারকারীকে একটি সমস্যার মেসেজ দেখানো হয়।

STB বা TV ডঙ্গলে 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, ১০৮০x১৯২০ ৫০ Hz
  2. ফ্রেমওয়ার্ক setActiveConfig(display, config=1)-কে কল করে।

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

    • id=1, ২১৬০x৩৮৪০ ৬০ Hz
    • id=2, ২১৬০x৩৮৪০ ৫০ Hz
    • id=3, 1080x1920 60 Hz
    • id=4, ১০৮০x১৯২০ ৫০ Hz
  4. Composer HAL ফ্রেমওয়ার্কে একটি onHotplug ইভেন্ট পাঠায়, যাতে সমর্থিত মোডের সেট পরিবর্তন হয়েছে বলে জানানো যায়।

  5. Composer HAL setActiveConfig(display, config=1) পায় (থেকে ধাপ ২)।

  6. HAL ইন্টারপ্রেট করে যে ফ্রেমওয়ার্কটি ২১৬০x৩৮৪০ ৬০ Hz-এ কনফিগারেশন পরিবর্তনের অনুরোধ করেছে, যদিও বাস্তবে ১০৮০x১৯২০ ৬০ Hz বেছে নেওয়া হয়েছে।

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

ক্রমিক আইডি ব্যবহার করার জন্য Composer HAL কনফিগার করা

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

  • Composer HAL, কাজ করে এমন ডিসপ্লে কনফিগারেশন আপডেট করলে, নতুন ডিসপ্লে কনফিগারেশনকে নতুন, ক্রমিক আইডি অ্যাসাইন করে।
  • ফ্রেমওয়ার্ক ভুল কনফিগারেশন আইডি সহ setActiveConfig বা setActiveConfigWithConstraints কল করলে, Composer HAL কলটি উপেক্ষা করে।

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

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

  1. কাজ করে এমন ডিসপ্লে কনফিগারেশন আইডি হল:

    • id=1, 1080x1920 60 Hz
    • id=2, ১০৮০x১৯২০ ৫০ Hz
  2. ফ্রেমওয়ার্ক setActiveConfig(display, config=1)-কে কল করে।

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

    • id=3, ২১৬০x৩৮৪০ ৬০ Hz

    • id=4, ২১৬০x৩৮৪০ ৫০ Hz

    • id=5, ১০৮০x১৯২০ ৬০ Hz

    • id=6, ১০৮০x১৯২০ ৫০ Hz

  4. Composer HAL ফ্রেমওয়ার্কে একটি onHotplug ইভেন্ট পাঠায়, যাতে সেটি বুঝতে পারে যে কাজ করে এমন মোডের সেট পরিবর্তন করা হয়েছে।

  5. Composer HAL setActiveConfig(display, config=1) (ধাপ ২ থেকে) রিসিভ করে।

  6. Composer HAL কলটি উপেক্ষা করে কারণ আইডিটি আর বৈধ নয়।

  7. ফ্রেমওয়ার্কটি ধাপ ৪ থেকে onHotplug ইভেন্ট পায় এবং প্রসেস করে। এটি getDisplayConfigs ও getDisplayAttribute ফাংশন ব্যবহার করে কম্পোজার HAL-এ কল করে। এইসব ফাংশনের মাধ্যমে ফ্রেমওয়ার্ক ১০৮০x১৯২০-এর বেছে নেওয়া রেজোলিউশন ও রিফ্রেশ রেট এবং ৬০ Hz-এর জন্য নতুন আইডি (৫) শনাক্ত করে।

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

  9. Composer HAL, ধাপ ৫ থেকে setActiveConfig(display, config=5) পায়।

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

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