Đị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 khả năng hỗ trợ truyền phát trực tiếp âm thanh đến 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 các API hệ thống. Các ứng dụng có thể khám phá chính xác hơn các chức năng của thiết bị âm thanh 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 có giới hạn hỗ trợ 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. Các 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ị xoá để cho phép các trường hợp sử dụng mới như truyền phát âm thanh, truyền phát đa hướng đến một nhóm tai nghe âm thanh BLE hoặc chọn đồng thời một số thẻ âm thanh USB. Không hỗ trợ việc định tuyến đến nhiều thiết bị USB cùng lúc.

Kể từ Android 14, khung USB hỗ trợ định tuyến đến nhiều thiết bị USB, miễn là các thiết bị USB thuộc nhiều loại thiết bị âm thanh và có sự hỗ trợ của nhân và nhà cung cấp để kết nối đồng thời nhiều thiết bị USB.

Trang này trình bày cách triển khai tính năng hỗ trợ truyền phát trực tiếp â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.

Hỗ trợ truyền trực tuyến â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:

  • Các 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 trong HAL âm thanh, báo cáo các chức 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 phát 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 thiết lập, nhận và xoá 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ị.

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ả những thiết bị có khả năng được chọn để phát nội dung nghe nhìn. Khi một thiết bị có thể tháo rời được kết nối, các luồng đầu ra HAL âm thanh có thể được định tuyến đến thiết bị này có thể phải được mở và kiểm tra các thuộc tính được hỗ trợ.

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

Lựa chọn thiết bị phát nội dung nghe nhìn đang hoạt động có thể thay đổi tuỳ thuộc vào thiết bị thực tế được kết nối hoặc ngắt kết nối. Audio Policy Manager sử dụng chuỗi quy tắc sau để chọn thiết bị nghe nhìn đang hoạt động:

  1. Nếu có tất cả các thiết bị ưu tiên cho nội dung nghe nhìn, thì tất cả các thiết bị đó sẽ được chọn làm thiết bị đang hoạt động.
  2. Nếu không, thiết bị di động đã kết nối gần đây nhất 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ị đ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 đến các thiết bị đang hoạt động, nhờ đó cấu hình tốt nhất sẽ được chọn để 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.
  • 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 một luồng đầu ra khi kết nối thiết bị nếu luồng đầu ra đang ở trạng thái rảnh, hoặc trì hoãn việc này cho đến khi luồng đầu ra được chuyển sang chế độ chờ.

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

  • setPreferredDeviceForStrategy

    Đặt thiết bị ưu tiên cho việc định tuyến âm thanh theo một chiến lược nhất định. Xin lưu ý rằng thiết bị có thể không có sẵn tại thời điểm bạn đặt thiết bị ưu tiên, nhưng sẽ được 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 một chiến lược âm thanh đã được đặt trước đó bằng setPreferredDeviceForStrategy hoặc setPreferredDevicesForStrategy.

  • setPreferredDevicesForStrategy

    Đặt thiết bị ưu tiên cho một chiến lược nhất định.

  • getPreferredDevicesForStrategy

    Trả về các thiết bị ưu tiên cho một chiến lược âm thanh đã được đặt 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 đối với thiết bị âm thanh ưu tiên được đặt cho một chiến lược âm thanh nhất định.

  • addOnPreferredDevicesForStrategyChangedListener

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

  • removeOnPreferredDevicesForStrategyChangedListener

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

Báo cáo các chức năng của thiết bị

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

Loại dữ liệu

Trong HIDL HAL V7 âm thanh, các chức năng của thiết bị được báo cáo bằng cách sử dụng các cấu trúc AudioProfileAudioTransport. Cấu trúc AudioTransport mô tả khả năng của một cổng âm thanh có AudioProfile cho các định dạng âm thanh đã biết hoặc có các trình 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 độ lấy mẫu mà hồ sơ hỗ trợ và danh sách mặt nạ kênh, như minh hoạ trong khối mã sau đây 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 HAL HIDL âm thanh phiên bản 7, kiểu dữ liệu AudioPort được xác định bằng các cấu trúc AudioTransportAudioProfile để mô tả các chức năng của thiết bị.

Phương thức HAL âm thanh

Audio Policy Manager sử dụng các phương thức sau để truy vấn các chức năng của thiết bị:

  • getParameters:Một phương thức 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.
  • getAudioPort:Trả về danh sách các thuộc tính được hỗ trợ (chẳng hạn 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 đâ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);

Thay đổi đối với API cũ

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

Do việc bổ sung 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 các chức năng của thiết bị bằng cấu trúc audio_port_v7.

Đoạn 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 định dạng AudioPort mới khi phiên bản API cũ thấp hơn 3.2 và phiên bản HIDL HAL là 7 trở lên. Trong trường hợp này, tất cả tốc độ lấy mẫu và mặt nạ kênh được báo cáo từ get_audio_port đều được giả định là được hỗ trợ cho tất cả các định dạng được trả về, cho phép ánh xạ trực tiếp từ các giá trị get_audio_port sang 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ộ thử nghiệm chứa các phương thức sử dụng những API được đề cập trong các phần trước. Hãy tham khảo các phương thức này để xem một số ví dụ về cách triển khai và sử dụng các API này.

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, có 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.

Ví dụ về việc triển khai cho get_audio_port_v7 nằm trong audio_hal.c và ví dụ này cho biết cách truy vấn các chức năng cho nhiều thiết bị.

Xác nhận kết quả

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

Các bài kiểm thử CTS

Các kiểm thử CTS nằm trong android.media.cts.AudioManagerTest.

Sau đây là danh sách các bài kiểm thử Audio Manager hiện có:

  • AudioManagerTest#testGetDevices

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

  • AudioManagerTest#testPreferredDevicesForStrategyAudioManagerTest#testPreferredDeviceForCapturePreset

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

Thử nghiệm GTS

Các bài kiểm thử GTS nằm trong com.google.android.gts.audioservice.AudioServiceHostTest.

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