اداره کردن اتصال سریع

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

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

به‌روزرسانی قابلیت‌های نمایشگر

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

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

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

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

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

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

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

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

سناریو استفاده
نمایشگر متصل‌شده‌ای هنگام راه‌اندازی وجود ندارد
  • یک 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 فقط از وضوح‌های زیر پشتیبانی می‌کند:

  • ۷۲۰x۱۲۸۰
  • ‫۱۰۸۰×۱۹۲۰
  • ۲۱۶۰×۳۸۴۰
  • ۴۳۲۰x۷۶۸۰

وقتی گیرنده دیجیتال یا دانگل تلویزیون تلاش می‌کند وضوح پشتیبانی‌نشده‌ای را نمایش دهد، مثلاً ‫480i ازطریق اتصال CVBS، پیام خطایی به کاربر نشان داده می‌شود.

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

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

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

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

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

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

    • id=1،‏ ۱۰۸۰x۱۹۲۰‏ ۶۰ هرتز
    • id=2،‏ ۱۰۸۰x۱۹۲۰‏ ۵۰ هرتز
  2. چارچوب setActiveConfig(display, config=1) را فرا می‌خواند.

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

    • id=1،‏ ۲۱۶۰×۳۸۴۰،‏ ۶۰ هرتز
    • id=2،‏ ۲۱۶۰×۳۸۴۰ ۵۰ هرتز
    • id=3،‏ ۱۰۸۰x۱۹۲۰‏ ۶۰ هرتز
    • id=4،‏ ۱۰۸۰x۱۹۲۰ ۵۰ هرتز
  4. Composer HAL رویداد onHotplug را به چارچوب ارسال می‌کند تا اطلاع دهد که مجموعه حالت‌های پشتیبانی‌شده تغییر کرده است.

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

  6. ‫HAL تفسیر می‌کند که چارچوب درخواست تغییر پیکربندی به ۲۱۶۰x۳۸۴۰ ۶۰ هرتز را داده است، درحالی‌که درواقع ۱۰۸۰x۱۹۲۰ ۶۰ هرتز انتخاب شده است.

فرایند استفاده از تخصیص‌های شناسه غیرترتیبی در اینجا با تفسیر اشتباه تغییر پیکربندی انتخابی پایان می‌یابد.

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

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

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

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

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

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

    • id=1،‏ ۱۰۸۰x۱۹۲۰‏ ۶۰ هرتز
    • id=2،‏ ۱۰۸۰x۱۹۲۰‏ ۵۰ هرتز
  2. چارچوب setActiveConfig(display, config=1) را فرا می‌خواند.

  3. وقتی تغییر پیکربندی‌های نمایشگر پردازش می‌شود، مجموعه بعدی شناسه‌های پیکربندی از عدد صحیح استفاده‌نشده بعدی اختصاص داده می‌شود، که به‌صورت زیر نشان داده می‌شود:

    • id=3،‏ ۲۱۶۰×۳۸۴۰‏ ۶۰ هرتز

    • id=4،‏ ۲۱۶۰x۳۸۴۰ ۵۰ هرتز

    • id=5،‏ ۱۰۸۰x۱۹۲۰‏ ۶۰ هرتز

    • id=6،‏ ۱۰۸۰x۱۹۲۰‏ ۵۰ هرتز

  4. Composer HAL رویداد onHotplug را به چارچوب ارسال می‌کند تا اطلاع دهد که مجموعه حالت‌های پشتیبانی‌شده تغییر کرده است.

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

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

  7. چارچوب رویداد onHotplug را از مرحله ۴ دریافت و پردازش می‌کند. بااستفاده از توابع getDisplayConfigs و getDisplayAttribute، با Composer HAL تماس می‌گیرد. با این توابع، چارچوب شناسه جدید (۵) را برای وضوح و نرخ بازآوری انتخاب‌شده ۱۰۸۰x۱۹۲۰ و ۶۰ هرتز شناسایی می‌کند.

  8. چارچوب رویداد setActiveConfig دیگری با شناسه به‌روزشده ۵ ارسال می‌کند.

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

  10. «لایه انتزاع سخت‌افزار» به‌درستی تفسیر می‌کند که چارچوب درخواست تغییر پیکربندی به ۱۰۸۰x۱۹۲۰ پیکسل ۶۰ هرتز را داده است.

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