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

Các chức năng hiển thị (chẳng hạn như các 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 số (STB) cho Android TV và thiết bị trực tiếp qua Internet (OTT). Thay đổi này có thể xảy ra do tín hiệu cắm nóng của 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 có các thay đổi trong khung để xử lý các khả năng hiển thị động và chèn nóng.

Trang này mô tả cách xử lý các nút nóng cho màn hình và những thay đổi về khả năng hiển thị trong quá trình triển khai HAL (Lớp trừu tượng phần cứng) cho Composer. Ngoài ra, bài viết còn thảo luận cách quản lý vùng đệm khung liên kết và ngăn chặn các tình huống tương tranh trong những tình huống này.

Cập nhật chức 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 HAL (Lớp trừu tượng phần cứng) của trình soạn thảo khởi tạo.

Trước khi Android có thể xử lý đúng cách các thay đổi về chức năng hiển thị, OEM phải triển khai HAL (Lớp trừu tượng phần cứng) cho trình soạn thảo để sử dụng onHotplug(display, connection=CONNECTED) nhằm thông báo cho khung về mọi thay đổi đối với khả năng hiển thị. Sau khi triển khai, Android sẽ xử lý các thay đổi đối với khả năng hiển thị như sau:

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

Khung này sẽ phân bổ lại các vùng đệm khung trên các sự kiện onHotplug(display, connection=CONNECTED) tiếp theo. Xem bài viết Quản lý vùng đệm khung của máy khách để biết thêm thông tin về cách quản lý bộ nhớ đệm khung đúng cách nhằm tránh xảy ra lỗi trong quá trình phân bổ vùng đệ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 khi màn hình chính được kết nối và ngắt kết nối.

Vốn được tạo cho thiết bị di động, nên khung Android không hỗ trợ tích hợp sẵn cho màn hình chính đã 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 hoạt động tương tác của màn hình với khung trong trường hợp màn hình chính bị ngắt kết nối.

Các trường hợp sau có thể xảy ra trong STB và thiết bị phần cứng TV có màn hình kết nối bên ngoài và có thể ngắt kết nối. Để triển khai tính năng 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:

Trường hợp Sử dụng
Không có màn hình nào được kết nối tại thời điểm khởi động
  • Gửi tín hiệu onHotplug(display, connection=CONNECTED) từ HAL (Lớp trừu tượng phần cứng) cho trình soạn thảo đến khung.
  • Thay thế trạng thái hiển thị thực tế bên trong HAL (Lớp trừu tượng phần cứng) của Composer bằng trạng thái hiển thị phần giữ chỗ.
Màn hình chính đã kết nối thực
  • Gửi một sự kiện onHotplug(display, connection=CONNECTED) khác từ HAL (Lớp trừu tượng phần cứng) cho trình soạn thảo đến khung.

    Việc này sẽ khiến khung tải lại tất cả các chức năng hiển thị.

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

Những điều cần lưu ý khi kết nối không phải HDMI

Android TV chỉ hỗ trợ các độ phân giải sau:

  • 720x1280
  • 1080x1920
  • 2160x3840
  • 4320x7680

Khi một thiết bị phần cứng STB hoặc TV cố gắng hiển thị độ phân giải không được hỗ trợ, chẳng hạn như 480i qua kết nối CVBS, người dùng sẽ thấy một thông báo lỗi.

Nếu thiết bị phần cứng STB hoặc TV có cả kết nối HDMI và không phải HDMI, thì kết nối HDMI là màn hình chính và kết nối không phải HDMI sẽ không hoạt động. Do đó, nếu bạn bị ngắt kết nối HDMI trong khi vẫn đang kết nối kết nối không phải HDMI, thì một sự kiện sẽ được gửi đến SurfaceFlinger và các chức năng của màn hình không phải HDMI phải được phản ánh thông qua getDisplayAttribute và các API iComposerClient khác (chẳng hạn như getHdrCapabilities).

Sử dụng mã cấu hình tuần tự để ngăn tình trạng tương tranh

Các điều kiện tranh đấu có thể phát sinh nếu HAL (Lớp trừu tượng phần cứng) của Composer cập nhật các cấu hình màn hình được hỗ trợ đồng thời với khung gọi setActiveConfig hoặc setActiveConfigWithConstraints. Giải pháp cho trường hợp này là triển khai HAL của trình soạn thảo để sử dụng mã nhận dạng 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 tranh đấu có thể xảy ra, tiếp theo là thông tin chi tiết về cách triển khai HAL của trình soạn thảo để sử dụng mã nhận dạng tuần tự nhằm ngăn chặn các điều kiện đó.

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

  1. Sau đây là các mã cấu hình hiển thị được hỗ trợ:

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

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

    • id=1, 2160x3840 60 Hz
    • id=2, 2160x3840 50 Hz
    • id=3, 1080x1920 60 Hz
    • id=4, 1080x1920 50 Hz
  4. HAL (Lớp trừu tượng phần cứng) sẽ gửi một sự kiện onHotplug đến khung để thông báo rằng nhóm chế độ được hỗ trợ đã thay đổi.

  5. HAL (Lớp trừu tượng phần cứng) cho trình soạn thảo nhận được setActiveConfig(display, config=1) (từ bước 2).

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

Quá trình sử dụng việc chỉ định mã không theo tuần tự sẽ kết thúc ở đây do bạn hiểu sai về thay đổi cấu hình mong muốn.

Định cấu hình HAL (Lớp trừu tượng phần cứng) cho trình soạn thảo để sử dụng mã nhận dạng tuần tự

Để tránh các điều kiện tranh đấu như vậy, OEM phải triển khai HAL (Lớp trừu tượng phần cứng) cho trình kết hợp như sau:

  • Khi HAL (Lớp trừu tượng phần cứng) cập nhật các cấu hình hiển thị được hỗ trợ, HAL sẽ gán mã nhận dạng 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 mã nhận dạng cấu hình không hợp lệ, HAL (Lớp trừu tượng) của Composer sẽ bỏ qua lệnh gọi.

Các bước này dùng để ngăn các tình huống tương tranh như minh hoạ trong nội dung thảo luận sau đây.

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

  1. Sau đây là các mã cấu hình hiển thị được hỗ trợ:

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

  3. Khi xử lý thay đổi về cấu hình hiển thị, nhóm mã cấu hình tiếp theo sẽ được chỉ định bắt đầu từ số nguyên tiếp theo không dùng đến, như sau:

    • id=3, 2160x3840 60 Hz

    • id=4, 2160x3840 50 Hz

    • id=5, 1080x1920 60 Hz

    • id=6, 1080x1920 50 Hz

  4. HAL (Lớp trừu tượng phần cứng) của trình soạn thảo gửi một sự kiện onHotplug đến khung để thông báo rằng nhóm chế độ được hỗ trợ đã thay đổi.

  5. HAL (Lớp trừu tượng phần cứng) cho trình soạn thảo nhận setActiveConfig(display, config=1) (từ bước 2).

  6. HAL của trình soạn thảo bỏ qua lệnh gọi vì mã nhận dạng không còn hợp lệ.

  7. Khung này sẽ tiếp nhận và xử lý sự kiện onHotplug từ bước 4. Lớp này gọi vào HAL của trình soạn thảo bằng cách sử dụng các hàm getDisplayConfigsgetDisplayAttribute. Với các hàm này, khung sẽ xác định mã nhận dạng 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 với mã nhận dạng đã cập nhật là 5.

  9. HAL (Lớp trừu tượng phần cứng) cho trình soạn thảo nhận setActiveConfig(display, config=5) từ bước 5.

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

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