Tính năng định tuyến thiết bị âm thanh kết hợp hỗ trợ thêm tính năng truyền trực tuyến â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á các tính năng của thiết bị âm thanh một cách chính xác hơn 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 chỉ hỗ trợ một số 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.
Kể từ Android 12, các giới hạn này sẽ bị xoá để cho phép các trường hợp sử dụng mới như truyền âm thanh, truyền đ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ợ đị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ó hỗ trợ hạt nhân và nhà cung cấp để kết nối nhiều thiết bị USB cùng một 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 đế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ó 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 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 trực tuyến âm thanh đến nhiều thiết bị âm thanh cùng một 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ó nhiều khả năng được chọn để phát nội dung đa phương tiện. Khi kết nối một thiết bị có thể tháo rờ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à thăm dò 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ị đa phương tiện đang hoạt động có thể thay đổi tuỳ thuộc vào thiết bị thực tế đã kết nối hoặc chưa kết nối. Trình quản lý chính sách âm thanh sử dụng một loạt quy tắc sau đây để chọn các thiết bị đa phương tiện đang hoạt động:
- Nếu tất cả thiết bị ưu tiên cho nội dung nghe nhìn đều có sẵn, thì tất cả thiết bị đó sẽ được chọn làm thiết bị đang hoạt động.
- Nếu không, thiết bị di động đã kết nối gần đây nhất sẽ được chọn.
- Nếu không có thiết bị nào có thể tháo rời được kết nối, thì 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 để chọn cấu hình tốt nhất cho quá trình 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ợ 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 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 luồng đó cho đến 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 đây(như được xác định trong AudioManager.java
):
setPreferredDeviceForStrategy
Đặt thiết bị ưu tiên cho việc định tuyến âm thanh cho 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 thiết lập thiết bị ưu tiên, nhưng sẽ được sử dụng sau khi có sẵn.
removePreferredDeviceForStrategy
Xoá(các) thiết bị âm thanh ưu tiên đã đặt trước đó bằng
setPreferredDeviceForStrategy
hoặcsetPreferredDevicesForStrategy
.getPreferredDeviceForStrategy
Trả về thiết bị ưu tiên cho chiến lược âm thanh đã đặt trước đó bằng
setPreferredDeviceForStrategy
hoặcsetPreferredDevicesForStrategy
.setPreferredDevicesForStrategy
Đặt các 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 đã đặt trước đó bằng
setPreferredDeviceForStrategy
hoặcsetPreferredDevicesForStrategy
.OnPreferredDevicesForStrategyChangedListener
Xác định giao diện để thông báo về các thay đổi trong 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 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á trình nghe các thay đổi đã thêm trước đó đối với thiết bị âm thanh ưu tiên của chiến lược.
Báo cáo chức năng của thiết bị
Trong quá trình triển khai Audio HAL, nhà cung cấp triển khai các API hỗ trợ báo cáo chức năng của thiết bị. Phần này giải thích các loại dữ liệu và phương thức dùng để báo cáo 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 âm thanh HIDL HAL V7 để hỗ trợ nhiều thiết bị.
Loại dữ liệu
Trong âm thanh HIDL HAL V7, các tính năng của thiết bị được báo cáo bằng cách sử dụng cấu trúc AudioProfile
và AudioTransport
. Cấu trúc AudioTransport
mô tả khả năng của cổng âm thanh bằng AudioProfile
cho các định dạng âm thanh đã biết hoặc bằng 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 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, loại dữ liệu AudioPort
được xác định bằng cấu trúc AudioTransport
và AudioProfile
để mô tả các chức năng của thiết bị.
Phương thức Audio HAL
Trình quản lý chính sách âm thanh sử dụng các phương thức sau để truy vấn các tính 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 độ lợ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);
Các 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 chức 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);
Bạn phải điền dữ liệu từ API get_audio_port
cũ 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
được giả định là được hỗ trợ cho tất cả các định dạng được trả về, cho phép liên kết trực tiếp 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 các API được đề cập trong 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 triển khai và sử dụng các API này.
Ví dụ về cách sử dụng API hệ thống setPreferredDevicesForStrategy
, getPreferredDevicesForStrategy
, removePreferredDeviceForStrategy
và OnPreferredDevicesForStrategyChangedListener
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.
Ví dụ về cách triển khai get_audio_port_v7
nằm trong audio_hal.c
và 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ề việc xác thực Trình quản lý âm thanh bằng CTS và GTS (Bộ kiểm thử dịch vụ di động của Google).
Kiểm thử CTS
Các chương trình kiểm thử CTS nằm trong android.media.cts.AudioManagerTest
.
Dưới đây là danh sách các bài kiểm thử Trình quản lý âm thanh hiện có:
AudioManagerTest#testGetDevices
Xác minh chính xác các tính năng của thiết bị âm thanh. Phương thứ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
vẫn giữ nguyên nội dung của định dạng mảng phẳng cũ, nhưng ở định dạngAudioProfile
mới.AudioManagerTest#testPreferredDevicesForStrategy
vàAudioManagerTest#testPreferredDeviceForCapturePreset
Xác minh rằng các thiết bị ưu tiên cho chiến lược và chụp các thử nghiệm API liên quan đến chế độ cài đặt trước đã hoàn tất thành công.
Kiểm thử 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à tính năng chụp trước có hoạt động chính xác hay không, hãy chạy các chương trình kiểm thử AudioServiceHostTest#testPreferredDeviceRouting
và AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset
.