Định tuyến thiết bị âm thanh kết hợp

Tính năng định tuyến thiết bị âm thanh kết hợp sẽ hỗ trợ thêm tính năng phát trực tuyến âm thanh tới nhiều thiết bị âm thanh cùng lúc. Khi sử dụng tính năng này, các ứng dụng có đặc quyền có thể chọn nhiều thiết bị ưu tiên cho một chiến lược cụ thể thông qua API hệ thống. Các ứng dụng có thể khám phá nhiều chức năng của thiết bị âm thanh hơn chính xác bằng cách sử dụng các API công khai do tính năng này cung cấp. Đối với Android phiên bản 11 trở xuống, việc triển khai khung âm thanh đã hỗ trợ hạn chế cho nhiều thiết bị âm thanh cùng loại (ví dụ: 2 Tai nghe Bluetooth A2DP) được kết nối đồng thời. Chế độ định tuyến âm thanh mặc định cũng không cho phép người dùng chọn nhiều thiết bị cùng loại cho một trường hợp sử dụng cụ thể.

Kể từ Android 12, các giới hạn này sẽ được loại bỏ nhằm cho phép các trường hợp sử dụng mới như phát âm thanh, phát đa hướng tới một nhóm tai nghe âm thanh BLE hoặc chọn đồng thời một số thẻ âm thanh USB. Định tuyến tới nhiều thiết bị USB cùng lúc không được hỗ trợ.

Kể từ Android 14, khung USB hỗ trợ định tuyến đến nhiều thiết bị USB miễn là thiết bị USB có âm thanh khác nhau và có hỗ trợ nhân hệ điều hành và nhà cung cấp để kết nối nhiều USB nhiều thiết bị cùng lúc.

Trang này trình bày cách triển khai tính năng hỗ trợ phát trực tuyến âm thanh cho nhiều thiết bị âm thanh và cách xác thực cấu hình triển khai của bạn của tính năng này.

Hỗ trợ truyền phát âm thanh đến nhiều thiết bị âm thanh

Có 2 bộ API trong Android 12 hỗ trợ tính năng này:

  • API hệ thống xử lý nhiều thiết bị ưu tiên cho một chiến lược.
  • Giao diện HIDL do nhà cung cấp triển khai như một phần của HAL âm thanh, báo cáo khả năng của thiết bị.

Các phần sau đây sẽ thảo luận chi tiết hơn về từng API này.

Xử lý nhiều thiết bị ưu tiên cho một chiến lược

Trình quản lý chính sách âm thanh cung cấp các API hệ thống để hỗ trợ tốt hơn việc truyền trực tuyến âm thanh đến nhiều thiết bị âm thanh cùng lúc. Các API hệ thống này cho phép cài đặt, nhận và xoá nhiều thiết bị ưu tiên cho một chiến lược cụ thể. Cho đến Android 12, tính năng này chỉ được hỗ trợ trên một thiết bị.

Trình quản lý chính sách âm thanh giới thiệu khái niệm thiết bị đa phương tiện đang hoạt động để mô tả các thiết bị có nhiều khả năng được chọn nhất để phát nội dung nghe nhìn. Thời gian một thiết bị có thể tháo rời được kết nối, thì các luồng đầu ra HAL âm thanh có thể được gửi đến thiết bị này. Bạn có thể phải mở và thăm dò các thuộc tính được hỗ trợ.

Bạn phải chỉ định thiết bị âm thanh khi mở luồng đầu ra. Phương thức thiết bị đa phương tiện là thiết bị dùng khi các luồng đầu ra được mở trong ngữ cảnh này.

Lựa chọn thiết bị đa phương tiện đang hoạt động có thể thay đổi tuỳ theo thiết bị thực tế đã kết nối hoặc đã bị ngắt kết nối. Trình quản lý chính sách âm thanh sử dụng loạt video sau quy tắc để chọn thiết bị đa phương tiện đang hoạt động:

  1. Nếu có tất cả thiết bị ưu tiên cho nội dung nghe nhìn, thì tất cả các thiết bị đó đều được chọn làm thiết bị đang hoạt động.
  2. Nếu không, thiết bị có thể tháo rời được kết nối gần đây nhất sẽ được chọn.
  3. Nếu không có thiết bị có thể tháo rời nào được kết nối, thì các quy tắc về chính sách âm thanh mặc định sẽ áp dụng để chọn thiết bị đầu ra sẽ được áp dụng để chọn thiết bị đang hoạt động.

Luồng đầu ra phải đáp ứng các tiêu chí sau để được mở lại và định tuyến vào thiết bị đang hoạt động để chọn cấu hình phù hợp nhất cho nội dung phát:

  • Luồng đầu ra phải hỗ trợ các thiết bị đang hoạt động.
  • Luồng đầu ra phải hỗ trợ các hồ sơ động.
  • Hiện tại, bạn không được định tuyến luồng đầu ra đến thiết bị đang hoạt động.

Để áp dụng lựa chọn thiết bị mới, Trình quản lý chính sách âm thanh sẽ đóng và mở lại luồng đầu ra khi kết nối thiết bị nếu luồng đầu ra ở trạng thái rảnh, hoặc trì hoãn thời điểm luồng đầu ra được đặt ở chế độ chờ.

Trình quản lý chính sách âm thanh cung cấp danh sách các API hệ thống sau(như định nghĩa trong AudioManager.java):

  • setPreferredDeviceForStrategy

    Thiết lập thiết bị ưu tiên để định tuyến âm thanh cho một chiến lược cụ thể. Ghi chú thiết bị có thể không sử dụng được tại thời điểm thiết bị ưu tiên nhưng sẽ được sử dụng khi có sẵn.

  • removePreferredDeviceForStrategy

    Xoá(các) thiết bị âm thanh ưu tiên đã đặt trước đó bằng setPreferredDeviceForStrategy hoặc setPreferredDevicesForStrategy.

  • getPreferredDeviceForStrategy

    Trả về thiết bị ưu tiên cho chiến lược âm thanh đã đặt trước đó bằng setPreferredDeviceForStrategy hoặc setPreferredDevicesForStrategy.

  • setPreferredDevicesForStrategy

    Đặt các thiết bị ưu tiên cho một chiến lược cụ thể.

  • getPreferredDevicesForStrategy

    Trả về các thiết bị ưu tiên cho chiến lược âm thanh đã thiết lập trước đó bằng setPreferredDeviceForStrategy hoặc setPreferredDevicesForStrategy.

  • OnPreferredDevicesForStrategyChangedListener

    Xác định một giao diện thông báo về các thay đổi trong âm thanh ưu tiên được thiết lập cho một chiến lược âm thanh cụ thể.

  • addOnPreferredDevicesForStrategyChangedListener

    Thêm trình nghe để nhận thông báo về các thay đổi đối với âm thanh ưu tiên chiến lược thiết bị.

  • removeOnPreferredDevicesForStrategyChangedListener

    Xoá trình nghe thay đổi đã thêm trước đó đối với chiến lược ưu tiên thiết bị âm thanh.

Báo cáo khả năng của thiết bị

Trong quá trình triển khai HAL âm thanh, nhà cung cấp triển khai các API hỗ trợ khả năng thiết bị báo cáo. Phần này giải thích các kiểu và phương thức dữ liệu dùng để báo cáo chức năng của thiết bị và liệt kê một số thay đổi đối với lớp trừu tượng phần cứng (HAL) cho âm thanh HIDL V7 để hỗ trợ nhiều thiết bị.

Loại dữ liệu

Trong âm thanh HIDL HAL V7, các chức năng của thiết bị được báo cáo bằng AudioProfile và cấu trúc AudioTransport. Cấu trúc AudioTransport mô tả khả năng của cổng âm thanh có AudioProfile cho các định dạng âm thanh đã biết, hoặc trình mô tả phần cứng thô cho các định dạng mà nền tảng chưa nhận biết được. Chiến lược phát hành đĩa đơn Cấu trúc AudioProfile chứa định dạng âm thanh, tốc độ lấy mẫu được hỗ trợ theo hồ sơ và danh sách mặt nạ kênh, như minh hoạ trong mã sau chặn từ types.hal:

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

Trong âm thanh HIDL HAL V7, kiểu dữ liệu AudioPort được xác định bằng thuộc tính Cấu trúc AudioTransportAudioProfile để mô tả các chức năng khác nhau.

Phương pháp HAL âm thanh

Trình quản lý chính sách âm thanh dùng các phương thức sau để truy vấn khả năng:

  • getParameters:Phương pháp chung để truy xuất thông số của riêng nhà cung cấp chẳng hạn như định dạng âm thanh được hỗ trợ và tốc độ lấy mẫu tương ứng của chúng.
  • getAudioPort:Trả về danh sách thuộc tính được hỗ trợ (như lấy mẫu) tốc độ, định dạng, mặt nạ kênh, bộ điều khiển khuếch đại) cho một cổng âm thanh nhất định.

Mã sau đây từ IDevice.hal cho thấy giao diện của phương thức getAudioPort:

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

Các thay đổi đối với API cũ

Để hỗ trợ nhiều cấu hình âm thanh, phiên bản 3.2 của API cũ sẽ bổ sung một API mới có tên là audio_port_v7. Xem mã nguồn để biết thêm chi tiết.

Do đã thêm audio_port_v7, phiên bản 3.2 của API cũ sẽ thêm một API mới có tên là get_audio_port_v7 để truy vấn khả năng của thiết bị bằng cách sử dụng Cấu trúc audio_port_v7.

Mã sau đây từ audio.h cho thấy định nghĩa của API get_audio_port_v7:

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

Dữ liệu từ API get_audio_port cũ phải được điền vào API mới Định dạng AudioPort khi phiên bản API cũ thấp hơn 3.2 và HAL HIDL phiên bản 7 trở lên. Trong trường hợp này, tất cả các tốc độ lấy mẫu và kênh Giả định rằng các mặt nạ từ get_audio_port được hỗ trợ cho tất cả các mặt nạ được trả về , cho phép ánh xạ đơn giản từ các giá trị get_audio_port đến cấu trúc AudioPort mới.

Ví dụ về cách triển khai API

Phần này mô tả một số bộ kiểm thử chứa các phương thức sử dụng API được đề cập ở các phần trước. Hãy tham khảo các phương thức này để biết một số ví dụ về cách các API này được triển khai và sử dụng.

Ví dụ về cách sử dụng setPreferredDevicesForStrategy, getPreferredDevicesForStrategy, removePreferredDeviceForStrategy và Các API hệ thống của OnPreferredDevicesForStrategyChangedListener nằm trong PreferredDeviceRoutingTest, nằm trong GTS.

Để xem ví dụ về cấu trúc mới đang được sử dụng trong AudioDeviceInfo, hãy xem AudioManagerTest#testGetDevices nằm trong CTS.

Ví dụ về cách triển khai cho get_audio_port_v7 nằm ở audio_hal.c đồng thời cho biết cách truy vấn các chức năng trên nhiều thiết bị.

Xác nhận kết quả

Phần này cung cấp thông tin về CTS và GTS (Bộ kiểm tra dịch vụ của Google dành cho thiết bị di động) của Trình quản lý âm thanh.

Bài kiểm thử CTS

Các bài kiểm thử CTS được đặt ở android.media.cts.AudioManagerTest.

Sau đây là danh sách các bài kiểm thử hiện có của Trình quản lý âm thanh:

  • AudioManagerTest#testGetDevices

    Xác minh khả năng chính xác của thiết bị âm thanh. Quy trình này cũng xác minh rằng các cấu hình âm thanh được trả về trong cấu trúc AudioDeviceInfo sẽ giữ nguyên nội dung từ định dạng mảng đã làm phẳng cũ nhưng ở định dạng mới Định dạng AudioProfile.

  • AudioManagerTest#testPreferredDevicesForStrategyAudioManagerTest#testPreferredDeviceForCapturePreset

    Xác minh rằng các thiết bị ưu tiên cho chiến lược và chụp giá trị đặt trước có liên quan đến nhau Đã hoàn tất thành công các lượt kiểm thử API.

Bài kiểm tra GTS

Chương trình kiểm thử GTS được đặt ở com.google.android.gts.audioservice.AudioServiceHostTest.

Để xác thực xem API cho các thiết bị ưu tiên cho chiến lược và nắm bắt giá trị đặt trước hay chưa hoạt động chính xác, hãy chạy kiểm thử AudioServiceHostTest#testPreferredDeviceRoutingAudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset.