טיפול ב-hotplug

יכולות תצוגה (כגון מצבי תצוגה וסוגי HDR נתמכים) יכולות להשתנות באופן דינמי במכשירים שיש להם צגים מחוברים חיצונית (עם HDMI או DisplayPort), כגון ממיר אנדרואיד TV (STBs) ו-Over-the-top (OTT) מכשירים. שינוי זה יכול לקרות כתוצאה מאות HDMI Hotplug, כגון כאשר המשתמש עובר מתצוגה אחת לאחרת או מאתחל את המכשיר ללא צג מחובר. אנדרואיד 12 ומעלה כולל שינויים במסגרת לטיפול בחיבור חם ויכולות תצוגה דינמית.

דף זה מתאר את הטיפול ב-hotplugs לתצוגה ושינויים ביכולות התצוגה ביישום Composer HAL. בנוסף הוא דן כיצד לנהל את ה-framebuffer המשויך ולמנוע תנאי מרוץ במצבים אלה.

עדכן את יכולות התצוגה

סעיף זה מתאר כיצד מסגרת Android מטפלת בשינויים ביכולות התצוגה שיזם Composer HAL.

לפני ש-Android יוכל לטפל בשינויים ביכולות התצוגה כראוי, ה-OEM חייב ליישם Composer HAL כך שישתמש ב- onHotplug(display, connection=CONNECTED) כדי להודיע ​​למסגרת על כל שינוי ביכולות התצוגה. לאחר יישום זה, אנדרואיד מטפל בשינויים ביכולות התצוגה באופן הבא:

  1. בזיהוי שינוי ביכולות התצוגה, המסגרת מקבלת הודעת onHotplug(display, connection=CONNECTED) .
  2. עם קבלת ההודעה, המסגרת מורידה את מצב התצוגה שלה ויוצרת אותה מחדש עם היכולות החדשות מה-HAL על ידי שימוש בשיטות getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities ו- getDisplayCapabilities .
  3. לאחר שהמסגרת יוצרת מחדש מצב תצוגה חדש, היא שולחת את ה- onDisplayChanged השיחה חזרה לאפליקציות שמאזינות לאירועים כאלה.

המסגרת מקצה מחדש את ה-framebuffers באירועי onHotplug(display, connection=CONNECTED) הבאים. ראה ניהול framebuffer של לקוח למידע נוסף על אופן ניהול נכון של זיכרון framebuffer כדי למנוע כשלים במהלך הקצאת מאגרי מסגרות חדשים.

טפל בתרחישי חיבור נפוצים

סעיף זה מכסה כיצד לטפל כראוי בתרחישי חיבור שונים ביישומים שלך כאשר התצוגה הראשית מחוברת ומתנתקת.

לאחר שנבנה למכשירים ניידים, למסגרת אנדרואיד אין תמיכה מובנית בתצוגה ראשית מנותקת. במקום זאת, ה-HAL חייב להחליף את התצוגה הראשית בתצוגת מציין מיקום באינטראקציות שלה עם המסגרת במקרה שבו תצוגה ראשית מנותקת פיזית.

התרחישים הבאים יכולים להתרחש ב-STBs ובדונגלים לטלוויזיה שיש להם צגים מחוברים חיצונית שניתנים לניתוק. כדי ליישם תמיכה בתרחישים אלה, השתמש במידע בטבלה שלהלן:

תַרחִישׁ טיפול
אין תצוגה מחוברת בזמן האתחול
  • שלח אות onHotplug(display, connection=CONNECTED) מה-Composer HAL למסגרת.
  • החלף את מצב התצוגה הפיזי בתוך Composer HAL במצב תצוגה של מציין מיקום.
התצוגה הראשית מחוברת פיזית
התצוגה הראשית מנותקת פיזית
  • שלח עוד אירוע onHotplug(display, connection=CONNECTED) מה-Composer HAL למסגרת.
  • החלף את מצב התצוגה הפיזי בתוך Composer HAL במצב תצוגה של מציין מיקום. תצוגת מציין המיקום חייבת להיות במצב תצוגה יחיד, כך שהמסגרת תשלח את ה- onDisplayChanged התקשרות חזרה לאפליקציות (מכיוון שסט המצבים הנתמכים השתנה). מצב תצוגה יחיד זה חייב להתאים למצב הפעיל האחרון של התצוגה הפיזית לפני הניתוק, כדי שאפליקציות לא יקבלו אירועים של שינוי תצורה .

השתמש במזהי תצורה עוקבים כדי למנוע תנאי מרוץ

תנאי מרוץ יכולים להיווצר אם ה-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 הרץ היה רצוי.

התהליך המשתמש בהקצאות מזהות לא עוקבות מסתיים כאן עם פרשנות שגויה של שינוי התצורה הרצוי.

הגדר את 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. היא קוראת ל-Composer HAL באמצעות הפונקציות getDisplayConfigs ו- getDisplayAttribute . בעזרת פונקציות אלו המסגרת מזהה את המזהה החדש (5) עבור הרזולוציה וקצב הרענון הרצויים של 1080x1920 ו-60 הרץ.

  8. המסגרת שולחת אירוע setActiveConfig נוסף עם מזהה מעודכן של 5.

  9. ה-Composer HAL מקבל setActiveConfig(display, config=5) משלב 5.

  10. ה-HAL מפרש נכון שהמסגרת ביקשה שינוי תצורה ל-1080x1920 60 הרץ.

כפי שמוצג בדוגמה לעיל, התהליך המשתמש בהקצאות מזהות רציפות מבטיח שמצב המירוץ נמנע ושינוי תצורת התצוגה הנכון מתעדכן.