جابجایی هات پلاگ

قابلیت‌های نمایش (مانند حالت‌های نمایش و انواع HDR پشتیبانی‌شده) می‌توانند به صورت پویا در دستگاه‌هایی که نمایشگرهای متصل خارجی دارند (با HDMI یا DisplayPort)، مانند ست‌تاپ‌باکس‌های Android TV (STB) و over-the-top (OTT) تغییر کنند. دستگاه ها این تغییر می تواند در نتیجه سیگنال HDMI هات پلاگ اتفاق بیفتد، مانند زمانی که کاربر از یک نمایشگر به صفحه دیگر سوئیچ می کند یا دستگاه را بدون نمایشگر متصل بوت می کند. اندروید 12 و بالاتر شامل تغییراتی در چارچوب برای رسیدگی به قابلیت های هات پلاگ و نمایش پویا است.

این صفحه نحوه رسیدگی به هات پلاگ های نمایشگر و تغییرات در قابلیت های نمایش در پیاده سازی Composer HAL را شرح می دهد. علاوه بر این، نحوه مدیریت فریم بافر مرتبط و جلوگیری از شرایط مسابقه در این شرایط را مورد بحث قرار می دهد.

قابلیت های نمایش را به روز کنید

این بخش توضیح می‌دهد که چگونه چارچوب Android تغییرات در قابلیت‌های نمایش را که توسط Composer HAL آغاز شده است، مدیریت می‌کند.

قبل از اینکه Android بتواند تغییرات در قابلیت‌های نمایش را به درستی مدیریت کند، OEM باید Composer HAL را به گونه‌ای پیاده‌سازی کند که از onHotplug(display, connection=CONNECTED) برای اطلاع دادن به چارچوب از هرگونه تغییر در قابلیت‌های نمایش استفاده کند. پس از اجرای آن، اندروید تغییرات در قابلیت های نمایش را به صورت زیر انجام می دهد:

  1. با تشخیص تغییر در قابلیت‌های نمایش، چارچوب یک اعلان onHotplug(display, connection=CONNECTED) دریافت می‌کند.
  2. با دریافت اعلان، فریم ورک حالت نمایش خود را کاهش می دهد و با استفاده از متدهای getActiveConfig ، getDisplayConfigs ، getDisplayAttribute ، getColorModes ، getHdrCapabilities و getDisplayCapabilities ، آن را با قابلیت های جدید از HAL دوباره ایجاد می کند.
  3. پس از اینکه فریم ورک حالت نمایش جدیدی را ایجاد کرد، پاسخ تماس onDisplayChanged را به برنامه‌هایی که در حال گوش دادن به چنین رویدادهایی هستند ارسال می‌کند.

فریم‌ورک بافرهای فریم را در رویدادهای بعدی onHotplug(display, connection=CONNECTED) تخصیص می‌دهد. برای اطلاعات بیشتر در مورد نحوه مدیریت صحیح حافظه فریم بافر برای جلوگیری از خرابی در هنگام تخصیص فریم بافرهای جدید، به مدیریت فریم بافر مشتری مراجعه کنید.

سناریوهای اتصال رایج را مدیریت کنید

این بخش نحوه مدیریت صحیح سناریوهای اتصال مختلف در پیاده سازی های خود را هنگامی که صفحه نمایش اصلی متصل و قطع می شود را پوشش می دهد.

چارچوب Android که برای دستگاه های تلفن همراه ساخته شده است، پشتیبانی داخلی برای نمایشگر اصلی قطع شده ندارد. درعوض، HAL باید نمایشگر اصلی را با نمایشگر نگهدارنده در تعاملات خود با چارچوب در مواردی که صفحه نمایش اصلی به طور فیزیکی قطع شده است، جایگزین کند.

سناریوهای زیر ممکن است در STB ها و دانگل های تلویزیونی که دارای نمایشگرهای متصل خارجی هستند و قابل جدا شدن هستند رخ دهد. برای اجرای پشتیبانی از این سناریوها، از اطلاعات جدول زیر استفاده کنید:

سناریو هندلینگ
هیچ صفحه نمایش متصلی در زمان بوت وجود ندارد
  • یک سیگنال onHotplug(display, connection=CONNECTED) از Composer HAL به فریمورک ارسال کنید.
  • حالت نمایش فیزیکی داخل Composer HAL را با حالت نمایش نگهدارنده جایگزین کنید.
صفحه نمایش اصلی به صورت فیزیکی متصل است
  • یک رویداد onHotplug(display, connection=CONNECTED) دیگر از Composer HAL به چارچوب ارسال کنید.

    این باعث می شود که چارچوب تمام قابلیت های نمایش را دوباره بارگذاری کند.

صفحه نمایش اصلی از نظر فیزیکی قطع شده است
  • یک رویداد onHotplug(display, connection=CONNECTED) دیگر از Composer HAL به چارچوب ارسال کنید.
  • حالت نمایش فیزیکی داخل Composer HAL را با حالت نمایش نگهدارنده جایگزین کنید. نمایش مکان نگهدار باید یک حالت نمایش واحد داشته باشد، به طوری که فریم ورک پاسخ تماس onDisplayChanged را به برنامه ها ارسال می کند (زیرا مجموعه حالت های پشتیبانی شده تغییر کرده است). این حالت نمایش تکی باید با آخرین حالت فعال نمایشگر فیزیکی قبل از قطع ارتباط مطابقت داشته باشد تا برنامه‌ها رویدادهای تغییر پیکربندی را دریافت نکنند.

ملاحظات اتصال غیر HDMI

Android TV فقط از رزولوشن های زیر پشتیبانی می کند:

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

هنگامی که یک دانگل STB یا تلویزیون سعی می کند وضوح پشتیبانی نشده مانند 480i را از طریق اتصال CVBS نمایش دهد، یک پیام خطا به کاربر ارائه می شود.

اگر دانگل STB یا تلویزیون دارای هر دو اتصال HDMI و غیر HDMI باشد، اتصال HDMI نمایشگر اصلی است و اتصال غیر HDMI غیرفعال است. در نتیجه، اگر اتصال HDMI در حالی که اتصال غیر HDMI هنوز متصل است قطع شود، رویدادی به SurfaceFlinger ارسال می‌شود و قابلیت‌های نمایشگر غیر HDMI باید از طریق getDisplayAttribute و سایر APIهای iComposerClient (مانند getHdrCapabilities ) منعکس شود.

از شناسه های پیکربندی متوالی برای جلوگیری از شرایط مسابقه استفاده کنید

اگر Composer HAL تنظیمات نمایشگر پشتیبانی شده را همزمان با چارچوبی که setActiveConfig یا setActiveConfigWithConstraints فراخوانی می‌کند، به‌روزرسانی کند، شرایط مسابقه ممکن است ایجاد شود. راه حل پیاده سازی Composer HAL برای استفاده از شناسه های متوالی و جلوگیری از این مشکل است.

این بخش چگونگی رخ دادن شرایط مسابقه را توضیح می‌دهد و به دنبال آن جزئیاتی در مورد نحوه پیاده‌سازی Composer HAL به طوری که از شناسه‌های متوالی برای جلوگیری از چنین شرایطی استفاده می‌کند، توضیح می‌دهد.

توالی رویدادهای زیر را در نظر بگیرید، زمانی که شناسه‌های متوالی جدید به پیکربندی‌های نمایشگر جدید اختصاص داده نمی‌شوند و باعث ایجاد شرایط مسابقه می‌شوند:

  1. شناسه های پیکربندی نمایشگر پشتیبانی شده عبارتند از:

    • id=1 ، 1080x1920 60 هرتز
    • id=2 ، 1080x1920 50 هرتز
  2. فریم ورک setActiveConfig(display, config=1) را فراخوانی می کند.

  3. همزمان، Composer HAL تغییر تنظیمات نمایشگر را پردازش می‌کند و وضعیت داخلی آن را به مجموعه جدیدی از تنظیمات نمایشگر به‌روزرسانی می‌کند که به صورت زیر نشان داده شده است:

    • id=1 ، 2160x3840 60 هرتز
    • id=2 ، 2160x3840 50 هرتز
    • id=3 ، 1080x1920 60 هرتز
    • id=4 ، 1080x1920 50 هرتز
  4. Composer HAL یک رویداد onHotplug را به فریمورک ارسال می کند تا به شما اطلاع دهد که مجموعه حالت های پشتیبانی شده تغییر کرده است.

  5. Composer HAL setActiveConfig(display, config=1) دریافت می کند (از مرحله 2).

  6. HAL تعبیر می کند که چارچوب درخواست تغییر پیکربندی به 2160x3840 60 هرتز را داده است، اگرچه در واقعیت 1080x1920 60 هرتز مورد نظر است.

فرآیند استفاده از تخصیص های غیر متوالی ID در اینجا با تفسیر نادرست از تغییر پیکربندی مورد نظر به پایان می رسد.

Composer HAL را برای استفاده از شناسه های متوالی پیکربندی کنید

برای جلوگیری از چنین شرایط مسابقه ای، OEM باید Composer HAL را به صورت زیر پیاده سازی کند:

  • هنگامی که Composer HAL پیکربندی های نمایشگر پشتیبانی شده را به روز می کند، شناسه های جدید و متوالی را به پیکربندی های نمایشگر جدید اختصاص می دهد.
  • وقتی فریم ورک setActiveConfig یا setActiveConfigWithConstraints با شناسه پیکربندی نامعتبر فراخوانی می‌کند، Composer HAL تماس را نادیده می‌گیرد.

همانطور که در بحث زیر نشان داده شده است، این مراحل برای جلوگیری از شرایط مسابقه مفید است.

وقتی شناسه‌های متوالی جدید به پیکربندی‌های نمایشگر جدید اختصاص داده می‌شوند، توالی رویدادهای زیر را در نظر بگیرید:

  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. Composer HAL یک رویداد onHotplug را به فریمورک ارسال می کند تا اطلاع دهد که مجموعه حالت های پشتیبانی شده تغییر کرده است.

  5. Composer HAL setActiveConfig(display, config=1) دریافت می کند (از مرحله 2).

  6. Composer HAL تماس را نادیده می گیرد زیرا شناسه دیگر معتبر نیست.

  7. فریم ورک رویداد onHotplug را از مرحله 4 دریافت و پردازش می کند. با استفاده از توابع getDisplayConfigs و getDisplayAttribute به Composer HAL فراخوانی می کند. با این توابع، چارچوب شناسه جدید (5) را برای وضوح و نرخ تازه سازی مورد نظر 1080x1920 و 60 هرتز شناسایی می کند.

  8. فریم ورک یک رویداد setActiveConfig دیگر با شناسه به روز شده 5 ارسال می کند.

  9. Composer HAL setActiveConfig(display, config=5) از مرحله 5 دریافت می کند.

  10. HAL به درستی تفسیر می کند که چارچوب درخواست تغییر پیکربندی به 1080x1920 60 هرتز را داده است.

همانطور که در مثال بالا نشان داده شده است، فرآیند با استفاده از تخصیص های متوالی شناسه تضمین می کند که از شرایط مسابقه جلوگیری شده و تغییر پیکربندی صحیح نمایشگر به روز می شود.

،

قابلیت‌های نمایش (مانند حالت‌های نمایش و انواع HDR پشتیبانی‌شده) می‌توانند به صورت پویا در دستگاه‌هایی که نمایشگرهای متصل خارجی دارند (با HDMI یا DisplayPort)، مانند ست‌تاپ‌باکس‌های Android TV (STB) و over-the-top (OTT) تغییر کنند. دستگاه ها این تغییر می تواند در نتیجه سیگنال HDMI هات پلاگ اتفاق بیفتد، مانند زمانی که کاربر از یک نمایشگر به صفحه دیگر سوئیچ می کند یا دستگاه را بدون نمایشگر متصل بوت می کند. اندروید 12 و بالاتر شامل تغییراتی در چارچوب برای رسیدگی به قابلیت های هات پلاگ و نمایش پویا است.

این صفحه نحوه رسیدگی به هات پلاگ های نمایشگر و تغییرات در قابلیت های نمایش در پیاده سازی Composer HAL را شرح می دهد. علاوه بر این، نحوه مدیریت فریم بافر مرتبط و جلوگیری از شرایط مسابقه در این شرایط را مورد بحث قرار می دهد.

قابلیت های نمایش را به روز کنید

این بخش توضیح می‌دهد که چگونه چارچوب Android تغییرات در قابلیت‌های نمایش را که توسط Composer HAL آغاز شده است، مدیریت می‌کند.

قبل از اینکه Android بتواند تغییرات در قابلیت‌های نمایش را به درستی مدیریت کند، OEM باید Composer HAL را به گونه‌ای پیاده‌سازی کند که از onHotplug(display, connection=CONNECTED) برای اطلاع دادن به چارچوب از هرگونه تغییر در قابلیت‌های نمایش استفاده کند. پس از اجرای آن، اندروید تغییرات در قابلیت های نمایش را به صورت زیر انجام می دهد:

  1. با تشخیص تغییر در قابلیت‌های نمایش، چارچوب یک اعلان onHotplug(display, connection=CONNECTED) دریافت می‌کند.
  2. با دریافت اعلان، فریم ورک حالت نمایش خود را کاهش می دهد و با استفاده از متدهای getActiveConfig ، getDisplayConfigs ، getDisplayAttribute ، getColorModes ، getHdrCapabilities و getDisplayCapabilities ، آن را با قابلیت های جدید از HAL دوباره ایجاد می کند.
  3. پس از اینکه فریم ورک حالت نمایش جدیدی را ایجاد کرد، پاسخ تماس onDisplayChanged را به برنامه‌هایی که در حال گوش دادن به چنین رویدادهایی هستند ارسال می‌کند.

فریم‌ورک بافرهای فریم را در رویدادهای بعدی onHotplug(display, connection=CONNECTED) تخصیص می‌دهد. برای اطلاعات بیشتر در مورد نحوه مدیریت صحیح حافظه فریم بافر برای جلوگیری از خرابی در هنگام تخصیص فریم بافرهای جدید، به مدیریت فریم بافر مشتری مراجعه کنید.

سناریوهای اتصال رایج را مدیریت کنید

این بخش نحوه مدیریت صحیح سناریوهای اتصال مختلف در پیاده سازی های خود را هنگامی که صفحه نمایش اصلی متصل و قطع می شود را پوشش می دهد.

چارچوب Android که برای دستگاه های تلفن همراه ساخته شده است، پشتیبانی داخلی برای نمایشگر اصلی قطع شده ندارد. درعوض، HAL باید نمایشگر اصلی را با نمایشگر نگهدارنده در تعاملات خود با چارچوب در مواردی که صفحه نمایش اصلی به طور فیزیکی قطع شده است، جایگزین کند.

سناریوهای زیر ممکن است در STB ها و دانگل های تلویزیونی که دارای نمایشگرهای متصل خارجی هستند و قابل جدا شدن هستند رخ دهد. برای اجرای پشتیبانی از این سناریوها، از اطلاعات جدول زیر استفاده کنید:

سناریو هندلینگ
هیچ صفحه نمایش متصلی در زمان بوت وجود ندارد
  • یک سیگنال onHotplug(display, connection=CONNECTED) از Composer HAL به فریمورک ارسال کنید.
  • حالت نمایش فیزیکی داخل Composer HAL را با حالت نمایش نگهدارنده جایگزین کنید.
صفحه نمایش اصلی به صورت فیزیکی متصل است
  • یک رویداد onHotplug(display, connection=CONNECTED) دیگر از Composer HAL به چارچوب ارسال کنید.

    این باعث می شود که چارچوب تمام قابلیت های نمایش را دوباره بارگذاری کند.

صفحه نمایش اصلی از نظر فیزیکی قطع شده است
  • یک رویداد onHotplug(display, connection=CONNECTED) دیگر از Composer HAL به چارچوب ارسال کنید.
  • حالت نمایش فیزیکی داخل Composer HAL را با حالت نمایش نگهدارنده جایگزین کنید. نمایش مکان نگهدار باید یک حالت نمایش واحد داشته باشد، به طوری که فریم ورک پاسخ تماس onDisplayChanged را به برنامه ها ارسال می کند (زیرا مجموعه حالت های پشتیبانی شده تغییر کرده است). این حالت نمایش تکی باید با آخرین حالت فعال نمایشگر فیزیکی قبل از قطع ارتباط مطابقت داشته باشد تا برنامه‌ها رویدادهای تغییر پیکربندی را دریافت نکنند.

ملاحظات اتصال غیر HDMI

Android TV فقط از رزولوشن های زیر پشتیبانی می کند:

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

هنگامی که یک دانگل STB یا تلویزیون سعی می کند وضوح پشتیبانی نشده مانند 480i را از طریق اتصال CVBS نمایش دهد، یک پیام خطا به کاربر ارائه می شود.

اگر دانگل STB یا تلویزیون دارای هر دو اتصال HDMI و غیر HDMI باشد، اتصال HDMI نمایشگر اصلی است و اتصال غیر HDMI غیرفعال است. در نتیجه، اگر اتصال HDMI در حالی که اتصال غیر HDMI هنوز متصل است قطع شود، رویدادی به SurfaceFlinger ارسال می‌شود و قابلیت‌های نمایشگر غیر HDMI باید از طریق getDisplayAttribute و سایر APIهای iComposerClient (مانند getHdrCapabilities ) منعکس شود.

از شناسه های پیکربندی متوالی برای جلوگیری از شرایط مسابقه استفاده کنید

اگر Composer HAL تنظیمات نمایشگر پشتیبانی شده را همزمان با چارچوبی که setActiveConfig یا setActiveConfigWithConstraints فراخوانی می‌کند، به‌روزرسانی کند، شرایط مسابقه ممکن است ایجاد شود. راه حل پیاده سازی Composer HAL برای استفاده از شناسه های متوالی و جلوگیری از این مشکل است.

این بخش چگونگی رخ دادن شرایط مسابقه را توضیح می‌دهد و به دنبال آن جزئیاتی در مورد نحوه پیاده‌سازی Composer HAL به طوری که از شناسه‌های متوالی برای جلوگیری از چنین شرایطی استفاده می‌کند، توضیح می‌دهد.

توالی رویدادهای زیر را در نظر بگیرید، زمانی که شناسه‌های متوالی جدید به پیکربندی‌های نمایشگر جدید اختصاص داده نمی‌شوند و باعث ایجاد شرایط مسابقه می‌شوند:

  1. شناسه های پیکربندی نمایشگر پشتیبانی شده عبارتند از:

    • id=1 ، 1080x1920 60 هرتز
    • id=2 ، 1080x1920 50 هرتز
  2. فریم ورک setActiveConfig(display, config=1) را فراخوانی می کند.

  3. همزمان، Composer HAL تغییر تنظیمات نمایشگر را پردازش می‌کند و وضعیت داخلی آن را به مجموعه جدیدی از تنظیمات نمایشگر به‌روزرسانی می‌کند که به صورت زیر نشان داده شده است:

    • id=1 ، 2160x3840 60 هرتز
    • id=2 ، 2160x3840 50 هرتز
    • id=3 ، 1080x1920 60 هرتز
    • id=4 ، 1080x1920 50 هرتز
  4. Composer HAL یک رویداد onHotplug را به فریمورک ارسال می کند تا به شما اطلاع دهد که مجموعه حالت های پشتیبانی شده تغییر کرده است.

  5. Composer HAL setActiveConfig(display, config=1) دریافت می کند (از مرحله 2).

  6. HAL تعبیر می کند که چارچوب درخواست تغییر پیکربندی به 2160x3840 60 هرتز را داده است، اگرچه در واقعیت 1080x1920 60 هرتز مورد نظر است.

فرآیند استفاده از تخصیص های غیر متوالی ID در اینجا با تفسیر نادرست از تغییر پیکربندی مورد نظر به پایان می رسد.

Composer HAL را برای استفاده از شناسه های متوالی پیکربندی کنید

برای جلوگیری از چنین شرایط مسابقه ای، OEM باید Composer HAL را به صورت زیر پیاده سازی کند:

  • هنگامی که Composer HAL پیکربندی های نمایشگر پشتیبانی شده را به روز می کند، شناسه های جدید و متوالی را به پیکربندی های نمایشگر جدید اختصاص می دهد.
  • وقتی فریم ورک setActiveConfig یا setActiveConfigWithConstraints با شناسه پیکربندی نامعتبر فراخوانی می‌کند، Composer HAL تماس را نادیده می‌گیرد.

همانطور که در بحث زیر نشان داده شده است، این مراحل برای جلوگیری از شرایط مسابقه مفید است.

وقتی شناسه‌های متوالی جدید به پیکربندی‌های نمایشگر جدید اختصاص داده می‌شوند، توالی رویدادهای زیر را در نظر بگیرید:

  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. Composer HAL یک رویداد onHotplug را به فریمورک ارسال می کند تا اطلاع دهد که مجموعه حالت های پشتیبانی شده تغییر کرده است.

  5. Composer HAL setActiveConfig(display, config=1) دریافت می کند (از مرحله 2).

  6. Composer HAL تماس را نادیده می گیرد زیرا شناسه دیگر معتبر نیست.

  7. فریم ورک رویداد onHotplug را از مرحله 4 دریافت و پردازش می کند. با استفاده از توابع getDisplayConfigs و getDisplayAttribute به Composer HAL فراخوانی می کند. با این توابع، چارچوب شناسه جدید (5) را برای وضوح و نرخ تازه سازی مورد نظر 1080x1920 و 60 هرتز شناسایی می کند.

  8. فریم ورک یک رویداد setActiveConfig دیگر با شناسه به روز شده 5 ارسال می کند.

  9. Composer HAL setActiveConfig(display, config=5) از مرحله 5 دریافت می کند.

  10. HAL به درستی تفسیر می کند که چارچوب درخواست تغییر پیکربندی به 1080x1920 60 هرتز را داده است.

همانطور که در مثال بالا نشان داده شده است، فرآیند با استفاده از تخصیص های متوالی شناسه تضمین می کند که از شرایط مسابقه جلوگیری شده و تغییر پیکربندی صحیح نمایشگر به روز می شود.