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 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ó đặ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 nhiều 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 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:
- 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 â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 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. 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 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:
- 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.
- 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ị 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 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 các 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. 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ặ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 â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 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 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. 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, kiểu dữ liệu AudioPort
được xác định bằng thuộc tính
Cấu trúc AudioTransport
và AudioProfile
để mô tả
các chức năng khác nhau.
Phương thức Audio HAL
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 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.
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 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);
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ả 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 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 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).
Bài kiểm thử CTS
Các bài kiểm thử CTS được đặt ở 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. 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ạngAudioProfile
.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 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.
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
.