การจัดการ Hotplug

ความสามารถในการแสดงผล (เช่น โหมดการแสดงผลและประเภท HDR ที่รองรับ) สามารถเปลี่ยนแบบไดนามิกบนอุปกรณ์ที่มีจอแสดงผลที่เชื่อมต่อภายนอก (ที่มี HDMI หรือ DisplayPort) เช่น กล่องรับสัญญาณ Android TV (STB) และแบบ over-the-top (OTT) อุปกรณ์ การเปลี่ยนแปลงนี้อาจเกิดขึ้นจากสัญญาณฮอตปลั๊ก HDMI เช่น เมื่อผู้ใช้สลับจากจอแสดงผลหนึ่งไปยังอีกจอหนึ่ง หรือบูตอุปกรณ์โดยไม่มีจอแสดงผลที่เชื่อมต่ออยู่ Android 12 ขึ้นไปมีการเปลี่ยนแปลงในเฟรมเวิร์กเพื่อรองรับความสามารถในการเสียบปลั๊กและการแสดงผลแบบไดนามิก

หน้านี้อธิบายการจัดการฮอตปลั๊กของจอแสดงผลและการเปลี่ยนแปลงความสามารถในการแสดงผลในการใช้งาน Composer HAL นอกจากนี้ยังกล่าวถึงวิธีการจัดการเฟรมบัฟเฟอร์ที่เกี่ยวข้องและป้องกันสภาพการแข่งขันในสถานการณ์เหล่านี้

อัพเดตความสามารถในการแสดงผล

ส่วนนี้จะอธิบายวิธีที่เฟรมเวิร์ก Android จัดการกับการเปลี่ยนแปลงความสามารถในการแสดงผลที่เริ่มต้นโดย Composer HAL

ก่อนที่ Android จะสามารถจัดการกับการเปลี่ยนแปลงความสามารถในการแสดงผลได้อย่างเหมาะสม OEM จะต้องใช้งาน Composer HAL เพื่อให้ใช้ onHotplug(display, connection=CONNECTED) เพื่อแจ้งกรอบการทำงานเกี่ยวกับการเปลี่ยนแปลงความสามารถในการแสดงผล หลังจากที่ปรับใช้แล้ว Android จะจัดการกับการเปลี่ยนแปลงความสามารถในการแสดงดังต่อไปนี้:

  1. เมื่อตรวจพบการเปลี่ยนแปลงในความสามารถในการแสดงผล กรอบงานจะได้รับการแจ้งเตือน onHotplug(display, connection=CONNECTED)
  2. เมื่อได้รับการแจ้งเตือน เฟรมเวิร์กจะทิ้งสถานะการแสดงผลและสร้างใหม่ด้วยความสามารถใหม่จาก HAL โดยใช้เมธอด getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities และ getDisplayCapabilities
  3. หลังจากที่เฟรมเวิร์กสร้างสถานะการแสดงผลใหม่อีกครั้ง เฟรมเวิร์กจะส่งการเรียกกลับ onDisplayChanged ไปยังแอปที่กำลังรับฟังเหตุการณ์ดังกล่าว

เฟรมเวิร์กจะจัดสรร framebuffers ใหม่บนเหตุการณ์ onHotplug(display, connection=CONNECTED) ที่ตามมา ดู การจัดการ framebuffer ของไคลเอ็นต์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการจัดการหน่วยความจำ framebuffer อย่างเหมาะสมเพื่อหลีกเลี่ยงความล้มเหลวในระหว่างการจัดสรร framebuffer ใหม่

จัดการกับสถานการณ์การเชื่อมต่อทั่วไป

ส่วนนี้ครอบคลุมถึงวิธีจัดการกับสถานการณ์การเชื่อมต่อต่างๆ ในการใช้งานของคุณอย่างเหมาะสม เมื่อจอแสดงผลหลักเชื่อมต่อและยกเลิกการเชื่อมต่อ

เฟรมเวิร์ก 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 ไปยังแอป (เนื่องจากชุดโหมดที่รองรับมีการเปลี่ยนแปลง) โหมดการแสดงผลเดี่ยวนี้ต้องตรงกับโหมดที่ใช้งานล่าสุดของจอแสดงผลจริงก่อนที่จะตัดการเชื่อมต่อ เพื่อให้แอปไม่ได้รับ เหตุการณ์การเปลี่ยนแปลงการกำหนดค่า

ใช้รหัสการกำหนดค่าตามลำดับเพื่อป้องกันสภาพการแข่งขัน

สภาพการแข่งขันอาจเกิดขึ้นได้หาก Composer HAL อัพเดตการกำหนดค่าการแสดงผลที่รองรับพร้อมกับเฟรมเวิร์กที่เรียก setActiveConfig หรือ setActiveConfigWithConstraints วิธีแก้ไขคือการใช้ Composer HAL เพื่อใช้รหัสตามลำดับและป้องกันปัญหานี้

ส่วนนี้จะอธิบายว่าสภาพการแข่งขันอาจเกิดขึ้นได้อย่างไร ตามด้วยรายละเอียดเกี่ยวกับวิธีการใช้งาน Composer HAL เพื่อให้ใช้ ID ตามลำดับเพื่อป้องกันเงื่อนไขดังกล่าว

พิจารณาลำดับของเหตุการณ์ต่อไปนี้ เมื่อไม่ได้กำหนด ID ลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่ ทำให้เกิดสภาวะการแข่งขัน:

  1. ID การกำหนดค่าการแสดงผลที่รองรับคือ:

    • รหัส=1 , 1080x1920 60 เฮิรตซ์
    • รหัส=2 , 1080x1920 50 เฮิร์ต
  2. กรอบงานเรียก setActiveConfig(display, config=1)

  3. ในขณะเดียวกัน Composer HAL จะประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผลและอัปเดตสถานะภายในเป็นการกำหนดค่าการแสดงผลชุดใหม่ ดังที่แสดงดังต่อไปนี้:

    • รหัส=1 , 2160x3840 60 เฮิรตซ์
    • รหัส=2 , 2160x3840 50 เฮิรตซ์
    • รหัส=3 , 1080x1920 60 เฮิรตซ์
    • รหัส=4 , 1080x1920 50 เฮิรตซ์
  4. ผู้แต่ง HAL ส่งเหตุการณ์ onHotplug ไปยังเฟรมเวิร์ก เพื่อแจ้งให้ทราบว่าชุดของโหมดที่รองรับมีการเปลี่ยนแปลง

  5. Composer HAL ได้รับ setActiveConfig(display, config=1) (จากขั้นตอนที่ 2)

  6. HAL ตีความว่าเฟรมเวิร์กได้ร้องขอการเปลี่ยนแปลงการกำหนดค่าเป็น 2160x3840 60 Hz แม้ว่าในความเป็นจริง 1080x1920 60 Hz จะเป็นที่ต้องการก็ตาม

กระบวนการที่ใช้การกำหนด ID ที่ไม่ต่อเนื่องจะสิ้นสุดที่นี่พร้อมกับการตีความการเปลี่ยนแปลงการกำหนดค่าที่ต้องการอย่างไม่ถูกต้อง

กำหนดค่า Composer HAL เพื่อใช้รหัสตามลำดับ

เพื่อหลีกเลี่ยงสภาพการแข่งขันดังกล่าว OEM ต้องใช้ Composer HAL ดังต่อไปนี้:

  • เมื่อ Composer HAL อัพเดตการกำหนดค่าการแสดงผลที่รองรับ มันจะกำหนด ID ตามลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่
  • เมื่อเฟรมเวิร์กเรียก setActiveConfig หรือ setActiveConfigWithConstraints ด้วย ID การกำหนดค่าที่ไม่ถูกต้อง Composer HAL จะละเว้นการเรียก

ขั้นตอนเหล่านี้มีไว้เพื่อป้องกันสภาพการแข่งขันดังที่แสดงในการสนทนาต่อไปนี้

พิจารณาลำดับเหตุการณ์ต่อไปนี้ เมื่อมีการกำหนด ID ลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่:

  1. ID การกำหนดค่าการแสดงผลที่รองรับคือ:

    • รหัส=1 , 1080x1920 60 เฮิรตซ์
    • รหัส=2 , 1080x1920 50 เฮิร์ต
  2. กรอบงานเรียก setActiveConfig(display, config=1)

  3. เมื่อประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผล ชุด ID การกำหนดค่าถัดไปจะถูกกำหนดโดยเริ่มจากจำนวนเต็มที่ไม่ได้ใช้ถัดไป แสดงดังต่อไปนี้:

    • id=3 , 2160x3840 60 เฮิรตซ์

    • รหัส=4 , 2160x3840 50 เฮิรตซ์

    • รหัส=5 , 1080x1920 60 เฮิรตซ์

    • รหัส=6 , 1080x1920 50 เฮิรตซ์

  4. Composer HAL จะส่งเหตุการณ์ onHotplug ไปยังเฟรมเวิร์ก เพื่อแจ้งให้ทราบว่าชุดของโหมดที่รองรับมีการเปลี่ยนแปลง

  5. Composer HAL ได้รับ setActiveConfig(display, config=1) (จากขั้นตอนที่ 2)

  6. Composer HAL ละเว้นการโทรเนื่องจาก ID ไม่ถูกต้องอีกต่อไป

  7. เฟรมเวิร์กรับและประมวลผลเหตุการณ์ onHotplug จากขั้นตอนที่ 4 โดยเรียกเข้าสู่ Composer HAL โดยใช้ฟังก์ชัน getDisplayConfigs และ getDisplayAttribute ด้วยฟังก์ชันเหล่านี้ เฟรมเวิร์กจะระบุ ID ใหม่ (5) สำหรับความละเอียดและอัตราการรีเฟรชที่ต้องการที่ 1080x1920 และ 60 Hz

  8. เฟรมเวิร์กส่งเหตุการณ์ setActiveConfig อื่นด้วย ID ที่อัปเดตเป็น 5

  9. Composer HAL ได้รับ setActiveConfig(display, config=5) จากขั้นตอนที่ 5

  10. HAL ตีความอย่างถูกต้องว่าเฟรมเวิร์กได้ร้องขอการเปลี่ยนแปลงการกำหนดค่าเป็น 1080x1920 60 Hz

ดังที่แสดงในตัวอย่างข้างต้น กระบวนการที่ใช้การกำหนด ID ตามลำดับช่วยให้แน่ใจว่าสภาวะการแข่งขันได้รับการป้องกัน และการเปลี่ยนแปลงการกำหนดค่าการแสดงผลที่ถูกต้องได้รับการอัปเดต