قابلیتهای نمایش (مانند حالتهای نمایش و انواع HDR پشتیبانیشده) میتوانند به صورت پویا در دستگاههایی که نمایشگرهای خارجی (با HDMI یا DisplayPort) دارند، مانند گیرندههای تلویزیون اندروید (STB) و دستگاههای OTT، تغییر کنند. این تغییر میتواند در نتیجه سیگنال اتصال داغ HDMI رخ دهد، مانند زمانی که کاربر از یک نمایشگر به نمایشگر دیگر سوئیچ میکند یا دستگاه را بدون نمایشگر متصل بوت میکند. اندروید ۱۲ و بالاتر شامل تغییراتی در چارچوب برای مدیریت اتصال داغ و قابلیتهای نمایش پویا است.
این صفحه نحوهی مدیریت hotplug های نمایشگر و تغییرات در قابلیتهای نمایشگر در پیادهسازی Composer HAL را شرح میدهد. علاوه بر این، در مورد نحوهی مدیریت framebuffer مرتبط و جلوگیری از شرایط رقابتی در این موقعیتها بحث میکند.
بهروزرسانی قابلیتهای نمایش
این بخش نحوه مدیریت تغییرات در قابلیتهای نمایش توسط Composer HAL توسط چارچوب اندروید را شرح میدهد.
قبل از اینکه اندروید بتواند تغییرات در قابلیتهای نمایش را به درستی مدیریت کند، تولیدکننده اصلی (OEM) باید Composer HAL را طوری پیادهسازی کند که از onHotplug(display, connection=CONNECTED)
برای اطلاعرسانی به فریمورک در مورد هرگونه تغییر در قابلیتهای نمایش استفاده کند. پس از پیادهسازی آن، اندروید تغییرات در قابلیتهای نمایش را به شرح زیر مدیریت میکند:
- با تشخیص تغییر در قابلیتهای نمایش، چارچوب یک اعلان
onHotplug(display, connection=CONNECTED)
دریافت میکند. - با دریافت اعلان، چارچوب، وضعیت نمایش خود را حذف کرده و با استفاده از متدهای
getActiveConfig
،getDisplayConfigs
،getDisplayAttribute
،getColorModes
،getHdrCapabilities
وgetDisplayCapabilities
، آن را با قابلیتهای جدید از HAL بازسازی میکند. - پس از اینکه چارچوب، یک وضعیت نمایش جدید را بازسازی میکند، تابع فراخوانی
onDisplayChanged
را به برنامههایی که منتظر چنین رویدادهایی هستند، ارسال میکند.
این چارچوب، فریمبافرها را در رویدادهای بعدی onHotplug(display, connection=CONNECTED)
مجدداً تخصیص میدهد. برای اطلاعات بیشتر در مورد نحوه مدیریت صحیح حافظه فریمبافر برای جلوگیری از خطا در هنگام تخصیص فریمبافرهای جدید، به مدیریت فریمبافر کلاینت مراجعه کنید.
سناریوهای اتصال رایج را مدیریت کنید
این بخش نحوهی مدیریت صحیح سناریوهای مختلف اتصال در پیادهسازیهای شما، هنگام اتصال و قطع اتصال نمایشگر اصلی را پوشش میدهد.
از آنجایی که این فریمورک اندروید برای دستگاههای تلفن همراه ساخته شده است، پشتیبانی داخلی برای نمایشگر اصلی جدا شده ندارد. در عوض، HAL باید در تعاملات خود با فریمورک، در صورت قطع فیزیکی نمایشگر اصلی، نمایشگر اصلی را با یک نمایشگر جایگزین جایگزین کند.
سناریوهای زیر میتواند در STBها و دانگلهای تلویزیونی که دارای نمایشگرهای خارجی متصل به تلویزیون هستند و میتوان آنها را جدا کرد، رخ دهد. برای پیادهسازی پشتیبانی از این سناریوها، از اطلاعات جدول زیر استفاده کنید:
سناریو | جابجایی |
---|---|
عدم اتصال نمایشگر در زمان بوت |
|
نمایشگر اصلی به صورت فیزیکی متصل است |
|
نمایشگر اصلی از نظر فیزیکی قطع شده است |
|
ملاحظات اتصال غیر HDMI
اندروید تیوی فقط از رزولوشنهای زیر پشتیبانی میکند:
- ۷۲۰x۱۲۸۰
- 1080x1920
- ۲۱۶۰x۳۸۴۰
- ۴۳۲۰x۷۶۸۰
وقتی یک گیرنده دیجیتال یا دانگل تلویزیون سعی میکند وضوح تصویر پشتیبانی نشدهای مانند ۴۸۰i را از طریق اتصال CVBS نمایش دهد، یک پیام خطا به کاربر نمایش داده میشود.
اگر دستگاه پخش دیجیتال یا دانگل تلویزیون هم اتصال HDMI و هم اتصال غیر HDMI داشته باشد، اتصال HDMI نمایشگر اصلی است و اتصال غیر HDMI غیرفعال است. در نتیجه، اگر اتصال HDMI قطع شود در حالی که اتصال غیر HDMI هنوز متصل است، رویدادی به SurfaceFlinger ارسال میشود و قابلیتهای نمایشگر غیر HDMI باید از طریق getDisplayAttribute
و سایر APIهای IComposerClient
(مانند getHdrCapabilities
) منعکس شود.
استفاده از شناسههای پیکربندی ترتیبی برای جلوگیری از شرایط رقابتی
اگر Composer HAL پیکربندیهای نمایش پشتیبانیشده را همزمان با چارچوبی که setActiveConfig
یا setActiveConfigWithConstraints
فراخوانی میکند، بهروزرسانی کند، ممکن است شرایط رقابتی ایجاد شود. راهحل، پیادهسازی Composer HAL برای استفاده از شناسههای ترتیبی و جلوگیری از این مشکل است.
این بخش چگونگی وقوع شرایط رقابتی را شرح میدهد و به دنبال آن جزئیاتی در مورد چگونگی پیادهسازی Composer HAL ارائه میدهد تا از شناسههای متوالی برای جلوگیری از چنین شرایطی استفاده کند.
توالی رویدادهای زیر را در نظر بگیرید، زمانی که شناسههای متوالی جدید به پیکربندیهای نمایشگر جدید اختصاص داده نمیشوند و باعث ایجاد شرایط رقابتی میشوند:
شناسههای پیکربندی نمایش پشتیبانیشده عبارتند از:
- شناسه=۱ ، وضوح تصویر ۱۰۸۰x۱۹۲۰، ۶۰ هرتز
- شناسه=۲ ، وضوح تصویر ۱۰۸۰x۱۹۲۰، فرکانس ۵۰ هرتز
این چارچوب، تابع
setActiveConfig(display, config=1)
را فراخوانی میکند.همزمان، Composer HAL تغییر پیکربندیهای نمایش را پردازش میکند و وضعیت داخلی خود را به مجموعهای جدید از پیکربندیهای نمایش بهروزرسانی میکند، که به شرح زیر نشان داده شده است:
- شناسه=۱ ، ۲۱۶۰x۳۸۴۰ ۶۰ هرتز
- شناسه=۲ ، ۲۱۶۰x۳۸۴۰، ۵۰ هرتز
- شناسه=۳ ، وضوح تصویر ۱۰۸۰x۱۹۲۰، ۶۰ هرتز
- شناسه=۴ ، وضوح تصویر ۱۰۸۰x۱۹۲۰، فرکانس ۵۰ هرتز
کامپوزر HAL یک رویداد
onHotplug
را به فریمورک ارسال میکند تا اطلاع دهد که مجموعه حالتهای پشتیبانیشده تغییر کرده است.کامپوزر HAL تابع
setActiveConfig(display, config=1)
(از مرحله 2) را دریافت میکند.HAL تفسیر میکند که این چارچوب درخواست تغییر پیکربندی به 2160x3840 60 هرتز را داده است، اگرچه در واقعیت 1080x1920 60 هرتز انتخاب شده بود.
فرآیند استفاده از تخصیصهای شناسه غیرمتوالی در اینجا با تفسیر نادرست تغییر پیکربندی انتخابشده به پایان میرسد.
پیکربندی Composer HAL برای استفاده از شناسههای ترتیبی
برای جلوگیری از چنین شرایط رقابتی، تولیدکننده اصلی تجهیزات (OEM) باید Composer HAL را به شرح زیر پیادهسازی کند:
- وقتی Composer HAL پیکربندیهای نمایشگر پشتیبانیشده را بهروزرسانی میکند، شناسههای جدید و متوالی را به پیکربندیهای نمایشگر جدید اختصاص میدهد.
- وقتی چارچوب
setActiveConfig
یاsetActiveConfigWithConstraints
با یک شناسه پیکربندی نامعتبر فراخوانی میکند، Composer HAL این فراخوانی را نادیده میگیرد.
این مراحل برای جلوگیری از شرایط رقابتی، همانطور که در بحث زیر نشان داده شده است، عمل میکنند.
توالی رویدادهای زیر را در نظر بگیرید، زمانی که شناسههای متوالی جدید به پیکربندیهای نمایش جدید اختصاص داده میشوند:
شناسههای پیکربندی نمایش پشتیبانیشده عبارتند از:
- شناسه=۱ ، وضوح تصویر ۱۰۸۰x۱۹۲۰، ۶۰ هرتز
- شناسه=۲ ، وضوح تصویر ۱۰۸۰x۱۹۲۰، فرکانس ۵۰ هرتز
این چارچوب، تابع
setActiveConfig(display, config=1)
را فراخوانی میکند.وقتی تغییری در پیکربندیهای نمایش پردازش میشود، مجموعه بعدی شناسههای پیکربندی با شروع از عدد صحیح استفاده نشده بعدی، به صورت زیر اختصاص داده میشوند:
شناسه=۳ ، ۲۱۶۰x۳۸۴۰، ۶۰ هرتز
شناسه=۴ ، ۲۱۶۰x۳۸۴۰، ۵۰ هرتز
شناسه=۵ ، وضوح تصویر ۱۰۸۰x۱۹۲۰، ۶۰ هرتز
شناسه=۶ ، وضوح تصویر ۱۰۸۰x۱۹۲۰، فرکانس ۵۰ هرتز
Composer HAL یک رویداد
onHotplug
را به فریمورک ارسال میکند تا اطلاع دهد که مجموعه حالتهای پشتیبانیشده تغییر کرده است.کامپوزر HAL تابع
setActiveConfig(display, config=1)
(از مرحله 2) را دریافت میکند.آهنگساز HAL تماس را نادیده میگیرد زیرا شناسه دیگر معتبر نیست.
این چارچوب، رویداد
onHotplug
را از مرحله ۴ دریافت و پردازش میکند. این رویداد با استفاده از توابعgetDisplayConfigs
وgetDisplayAttribute
تابع HAL در Composer را فراخوانی میکند. با استفاده از این توابع، چارچوب، شناسه جدید (5) را برای وضوح تصویر و نرخ نوسازی انتخاب شده ۱۰۸۰x۱۹۲۰ و ۶۰ هرتز شناسایی میکند.این چارچوب یک رویداد
setActiveConfig
دیگر با شناسه بهروزرسانیشده ۵ ارسال میکند.کامپوزر HAL از مرحله ۵،
setActiveConfig(display, config=5)
دریافت میکند.HAL به درستی تفسیر میکند که فریمورک درخواست تغییر پیکربندی به 1080x1920 60 هرتز را داده است.
همانطور که در مثال قبلی نشان داده شده است، فرآیندی که از تخصیصهای متوالی شناسه استفاده میکند، تأیید میکند که از شرایط رقابتی جلوگیری شده و تغییر پیکربندی نمایش صحیح بهروزرسانی شده است.