Xử lý phích cắm nóng

Khả năng hiển thị (chẳng hạn như chế độ hiển thị và loại HDR được hỗ trợ) có thể thay đổi linh hoạt trên các thiết bị có màn hình được kết nối bên ngoài (có HDMI hoặc DisplayPort), chẳng hạn như hộp giải mã tín hiệu Android TV (STB) và thiết bị ngoại vi (OTT) thiết bị. Thay đổi này có thể xảy ra do tín hiệu cắm nóng HDMI, chẳng hạn như khi người dùng chuyển từ màn hình này sang màn hình khác hoặc khởi động thiết bị mà không có màn hình được kết nối. Android 12 trở lên bao gồm các thay đổi trong khung để xử lý khả năng cắm nóng và hiển thị động.

Trang này mô tả cách xử lý các hotplug hiển thị và những thay đổi về khả năng hiển thị khi triển khai Composer HAL. Ngoài ra, nó còn thảo luận cách quản lý bộ đệm khung liên quan và ngăn chặn tình trạng tương tranh trong những tình huống này.

Cập nhật khả năng hiển thị

Phần này mô tả cách khung Android xử lý các thay đổi về khả năng hiển thị do Composer HAL khởi xướng.

Trước khi Android có thể xử lý đúng cách các thay đổi về khả năng hiển thị, OEM phải triển khai Composer HAL sao cho nó sử dụng onHotplug(display, connection=CONNECTED) để thông báo cho hệ thống về mọi thay đổi đối với khả năng hiển thị. Sau khi triển khai, Android xử lý các thay đổi về khả năng hiển thị như sau:

  1. Khi phát hiện sự thay đổi về khả năng hiển thị, khung sẽ nhận được thông báo onHotplug(display, connection=CONNECTED) .
  2. Khi nhận được thông báo, khung sẽ giảm trạng thái hiển thị và tạo lại trạng thái đó với các khả năng mới từ HAL bằng cách sử dụng các phương thức getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilitiesgetDisplayCapabilities .
  3. Sau khi khung tạo lại trạng thái hiển thị mới, khung sẽ gửi lệnh gọi lại onDisplayChanged tới các ứng dụng đang xử lý các sự kiện như vậy.

Khung này sẽ phân bổ lại bộ đệm khung trong các sự kiện onHotplug(display, connection=CONNECTED) tiếp theo. Xem Quản lý bộ đệm khung máy khách để biết thêm thông tin về cách quản lý bộ nhớ bộ đệm khung đúng cách nhằm tránh lỗi trong quá trình phân bổ bộ đệm khung mới.

Xử lý các tình huống kết nối phổ biến

Phần này đề cập đến cách xử lý đúng cách các tình huống kết nối khác nhau trong quá trình triển khai của bạn khi màn hình chính được kết nối và ngắt kết nối.

Đã được xây dựng cho thiết bị di động, khung Android không có hỗ trợ tích hợp cho màn hình chính bị ngắt kết nối. Thay vào đó, HAL phải thay thế màn hình chính bằng màn hình giữ chỗ trong các tương tác của nó với khung trong trường hợp màn hình chính bị ngắt kết nối vật lý.

Các tình huống sau có thể xảy ra trong STB và thiết bị thu phát TV có màn hình được kết nối bên ngoài có thể bị ngắt kết nối. Để triển khai hỗ trợ cho những trường hợp này, hãy sử dụng thông tin trong bảng bên dưới:

Kịch bản Sự điều khiển
Không có màn hình được kết nối khi khởi động
  • Gửi tín hiệu onHotplug(display, connection=CONNECTED) từ Composer HAL tới framework.
  • Thay thế trạng thái hiển thị vật lý bên trong Composer HAL bằng trạng thái hiển thị giữ chỗ.
Màn hình chính được kết nối vật lý
Màn hình chính bị ngắt kết nối vật lý
  • Gửi một sự kiện onHotplug(display, connection=CONNECTED) khác từ Composer HAL tới framework.
  • Thay thế trạng thái hiển thị vật lý bên trong Composer HAL bằng trạng thái hiển thị giữ chỗ. Màn hình giữ chỗ phải có một chế độ hiển thị duy nhất để khung gửi lệnh gọi lại onDisplayChanged tới các ứng dụng (vì tập hợp các chế độ được hỗ trợ đã thay đổi). Chế độ hiển thị đơn này phải khớp với chế độ hoạt động cuối cùng của màn hình vật lý trước khi ngắt kết nối để ứng dụng không nhận được các sự kiện thay đổi cấu hình .

Sử dụng ID cấu hình tuần tự để ngăn chặn điều kiện chạy đua

Điều kiện cạnh tranh có thể phát sinh nếu Composer HAL cập nhật đồng thời các cấu hình hiển thị được hỗ trợ với khung gọi setActiveConfig hoặc setActiveConfigWithConstraints . Giải pháp là triển khai Composer HAL để sử dụng ID tuần tự và ngăn chặn sự cố này.

Phần này mô tả cách các điều kiện tương tranh có thể xảy ra, tiếp theo là chi tiết về cách triển khai Composer HAL để nó sử dụng ID tuần tự nhằm ngăn chặn các điều kiện đó.

Hãy xem xét chuỗi sự kiện sau đây, khi ID tuần tự mới KHÔNG được gán cho cấu hình hiển thị mới, gây ra tình trạng tương tranh:

  1. ID cấu hình hiển thị được hỗ trợ là:

    • id=1 , 1080x1920 60 Hz
    • id=2 , 1080x1920 50 Hz
  2. Khung gọi setActiveConfig(display, config=1) .

  3. Đồng thời, Composer HAL xử lý thay đổi cấu hình hiển thị và cập nhật trạng thái bên trong của nó thành một bộ cấu hình hiển thị mới, được hiển thị như sau:

    • id=1 , 2160x3840 60 Hz
    • id=2 , 2160x3840 50 Hz
    • id=3 , 1080x1920 60 Hz
    • id=4 , 1080x1920 50 Hz
  4. Trình soạn thảo HAL gửi sự kiện onHotplug tới khung để thông báo rằng tập hợp các chế độ được hỗ trợ đã thay đổi.

  5. Composer HAL nhận setActiveConfig(display, config=1) (từ bước 2).

  6. HAL giải thích rằng hệ thống đã yêu cầu thay đổi cấu hình thành 2160x3840 60 Hz , mặc dù trên thực tế mong muốn là 1080x1920 60 Hz .

Quá trình sử dụng các phép gán ID không tuần tự kết thúc ở đây với việc hiểu sai về thay đổi cấu hình mong muốn.

Định cấu hình Composer HAL để sử dụng ID tuần tự

Để tránh các điều kiện chạy đua như vậy, OEM phải triển khai Composer HAL như sau:

  • Khi Composer HAL cập nhật các cấu hình hiển thị được hỗ trợ, nó sẽ gán các ID tuần tự mới cho các cấu hình hiển thị mới.
  • Khi khung gọi setActiveConfig hoặc setActiveConfigWithConstraints với ID cấu hình không hợp lệ, Composer HAL sẽ bỏ qua cuộc gọi.

Các bước này nhằm mục đích ngăn chặn các điều kiện chạy đua như được trình bày trong phần thảo luận sau đây.

Hãy xem xét chuỗi sự kiện sau đây khi các ID tuần tự mới được gán cho cấu hình hiển thị mới:

  1. ID cấu hình hiển thị được hỗ trợ là:

    • id=1 , 1080x1920 60 Hz
    • id=2 , 1080x1920 50 Hz
  2. Khung gọi setActiveConfig(display, config=1) .

  3. Khi thay đổi cấu hình hiển thị được xử lý, bộ ID cấu hình tiếp theo sẽ được chỉ định bắt đầu từ số nguyên chưa sử dụng tiếp theo, được hiển thị như sau:

    • id=3 , 2160x3840 60 Hz

    • id=4 , 2160x3840 50 Hz

    • id=5 , 1080x1920 60 Hz

    • id=6 , 1080x1920 50 Hz

  4. Composer HAL gửi sự kiện onHotplug tới framework để thông báo rằng tập hợp các chế độ được hỗ trợ đã thay đổi.

  5. Composer HAL nhận setActiveConfig(display, config=1) (từ bước 2).

  6. Composer HAL bỏ qua cuộc gọi vì ID không còn hợp lệ.

  7. Khung này nhận và xử lý sự kiện onHotplug từ bước 4. Nó gọi vào Composer HAL bằng cách sử dụng các hàm getDisplayConfigsgetDisplayAttribute . Với các chức năng này, khung xác định ID mới (5) cho độ phân giải và tốc độ làm mới mong muốn là 1080x1920 và 60 Hz.

  8. Khung này sẽ gửi một sự kiện setActiveConfig khác có ID cập nhật là 5.

  9. Composer HAL nhận setActiveConfig(display, config=5) từ bước 5.

  10. HAL giải thích chính xác rằng khung đã yêu cầu thay đổi cấu hình thành 1080x1920 60 Hz.

Như được hiển thị trong ví dụ trên, quy trình sử dụng các phép gán ID tuần tự đảm bảo rằng tình trạng chủng tộc được ngăn chặn và thay đổi cấu hình hiển thị chính xác được cập nhật.