Đị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 bổ sung thêm hỗ trợ truyền phát âm thanh đến nhiều thiết bị âm thanh cùng một lúc. Khi sử dụng tính năng này, các ứng dụng đặ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. Ứng dụng có thể khám phá khả năng của thiết bị âm thanh chính xác hơn bằng cách sử dụng 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 có 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. Quy tắc đị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 nhất định.

Bắt đầu từ Android 12, những hạn chế này sẽ bị loại bỏ để 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 nhiều thẻ âm thanh USB. Định tuyến đến nhiều thiết bị USB cùng lúc không được hỗ trợ.

Bắt đầu từ Android 14, khung USB hỗ trợ định tuyến đến nhiều thiết bị USB với điều kiện là các thiết bị USB thuộc các loại thiết bị âm thanh khác nhau, đồng thời có hỗ trợ nhân và nhà cung cấp để kết nối nhiều thiết bị USB cùng lúc.

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

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

Có hai 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, được 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 thảo luận chi tiết hơn về từng API này.

Xử lý nhiều thiết bị ưa thích 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 phát â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à xóa nhiều thiết bị ưu tiên cho một chiến lược nhất định. Cho đến Android 12, tính năng này chỉ được hỗ trợ cho một thiết bị duy nhất.

Trình quản lý chính sách âm thanh giới thiệu khái niệm về 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 để phát lại phương tiện nhất. Khi một thiết bị có thể tháo rời được kết nối, các luồng đầu ra âm thanh HAL có thể được định tuyến đến thiết bị này có thể phải được mở và thăm dò các thuộc tính được hỗ trợ.

Thiết bị âm thanh phải được chỉ định khi mở luồng đầu ra. Thiết bị đa phương tiện đang hoạt động là thiết bị được sử dụng khi luồng đầu ra được mở trong ngữ cảnh này.

Việc lựa chọn thiết bị đa phương tiện đang hoạt động có thể thay đổi tùy thuộc vào thiết bị thực tế được kết nối hoặc ngắt kết nối. Trình quản lý chính sách âm thanh sử dụng chuỗi quy tắc sau để chọn thiết bị đa phương tiện đang hoạt động:

  1. Nếu tất cả các thiết bị ưu tiên dành cho phương tiện đều có sẵn thì chúng đều được chọn làm thiết bị hoạt động.
  2. Ngược lại, thiết bị di động được kết nối cuối cùng sẽ được chọn.
  3. Nếu không có thiết bị di động nào được kết nối, các quy tắc chính sách âm thanh mặc định để chọn thiết bị đầu ra sẽ được áp dụng để chọn thiết bị 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 đến các thiết bị đang hoạt động để chọn cấu hình tốt nhất cho phát lại:

  • 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ấu hình động.
  • Luồng đầu ra hiện không được định tuyến đến các 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 không hoạt động hoặc trì hoãn luồng đầu ra khi 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 API hệ thống sau (như được xác định trong AudioManager.java ):

  • setPreferredDeviceForStrategy

    Đặt thiết bị ưu tiên để định tuyến âm thanh cho một chiến lược nhất định. Lưu ý rằng thiết bị có thể không khả dụng tại thời điểm thiết bị ưu tiên được đặt nhưng sẽ được sử dụng sau khi có sẵn.

  • removePreferredDeviceForStrategy

    Xóa (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ị ưa thích cho một chiến lược nhất định.

  • getPreferredDevicesForStrategy

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

  • OnPreferredDevicesForStrategyChangedListener

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

  • addOnPreferredDevicesForStrategyChangedListener

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

  • removeOnPreferredDevicesForStrategyChangedListener

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

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

Là một phần của quá trình triển khai Audio HAL, các nhà cung cấp triển khai các API hỗ trợ các khả năng của thiết bị báo cáo. Phần này giải thích các loại dữ liệu và phương pháp được sử dụng để báo cáo khả năng của thiết bị và liệt kê một số thay đổi được thực hiện trong âm thanh HIDL HAL V7 để hỗ trợ nhiều thiết bị.

Loại dữ liệu

Trong âm thanh HIDL HAL V7, khả năng của thiết bị được báo cáo bằng cấu trúc AudioProfileAudioTransport . Cấu trúc AudioTransport mô tả khả năng của một cổng âm thanh với AudioProfile cho các định dạng âm thanh đã biết hoặc với các bộ mô tả phần cứng thô cho các định dạng mà nền tảng không biết. Cấu trúc AudioProfile chứa định dạng âm thanh, tốc độ mẫu được cấu hình hỗ trợ và danh sách mặt nạ kênh, như được hiển thị trong khối mã sau 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 cấu trúc AudioTransportAudioProfile để mô tả khả năng của thiết bị.

Phương pháp HAL âm thanh

Trình quản lý chính sách âm thanh sử dụng các phương pháp sau để truy vấn khả năng của thiết bị:

  • getParameters: Một phương pháp chung để truy xuất các giá trị tham số dành riêng cho nhà cung cấp, chẳng hạn như các đị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 các thuộc tính được hỗ trợ (như tốc độ lấy mẫu, đị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.

Đoạn mã sau từ IDevice.hal hiển thị giao diện cho 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);

Những 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ũ bổ sung cấu trúc mới gọi là audio_port_v7 . Xem mã nguồn để biết thêm chi tiết.

Do có thêm audio_port_v7 nên phiên bản 3.2 của API cũ sẽ thêm một API mới có tên get_audio_port_v7 để truy vấn khả năng của thiết bị bằng cấu trúc audio_port_v7 .

Đoạn mã sau từ audio.h hiển thị đị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 chuyển sang định dạng AudioPort mới khi phiên bản API cũ dưới 3,2 và phiên bản HIDL HAL từ 7 trở lên. Trong trường hợp này, tất cả tốc độ mẫu và mặt nạ kênh được báo cáo từ get_audio_port được coi là được hỗ trợ cho tất cả các định dạng được trả về, cho phép ánh xạ đơn giản từ các giá trị get_audio_port sang cấu trúc AudioPort mới.

Ví dụ triển khai API

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

Một ví dụ về cách sử dụng các API hệ thống setPreferredDevicesForStrategy , getPreferredDevicesForStrategy , removePreferredDeviceForStrategyOnPreferredDevicesForStrategyChangedListener nằm trong phương thức PreferredDeviceRoutingTest nằm trong GTS.

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

Một ví dụ về cách triển khai get_audio_port_v7 nằm trong audio_hal.c và nó cho thấy cách truy vấn các khả năng cho nhiều thiết bị.

Thẩm định

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

xét nghiệm CTS

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

Sau đây là danh sách các bài kiểm tra Trình quản lý âm thanh có sẵn:

  • AudioManagerTest#testGetDevices

    Xác minh khả năng chính xác của thiết bị âm thanh. Nó cũng xác minh rằng các cấu hình âm thanh được trả về trong cấu trúc AudioDeviceInfo bảo toàn nội dung từ định dạng mảng phẳng cũ hơn nhưng ở định dạng AudioProfile mới.

  • AudioManagerTest#testPreferredDevicesForStrategyAudioManagerTest#testPreferredDeviceForCapturePreset

    Xác minh rằng các thiết bị ưu tiên dành cho chiến lược và các thử nghiệm API liên quan đến chụp cài sẵn đã hoàn tất thành công.

kiểm tra GTS

Kiểm tra GTS nằm trong com.google.android.gts.audioservice.AudioServiceHostTest .

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