Trong âm thanh Android, audio_devices_t
được dùng để biểu thị loại thiết bị âm thanh. Mã này được sử dụng rộng rãi trong mã nguồn âm thanh dưới dạng trường bit để lọc hoặc chọn một hoặc nhiều thiết bị được chỉ định. Trước Android 11, có giới hạn 30 loại thiết bị đầu vào/đầu ra âm thanh và không có khe trống để thêm các loại thiết bị âm thanh mới. Chúng tôi đã xoá giới hạn về số lượng loại thiết bị âm thanh để cho phép thêm các loại thiết bị âm thanh mới.
Để xoá giới hạn về số lượng loại thiết bị âm thanh, các loại thiết bị âm thanh hiện là giá trị được liệt kê thay vì mặt nạ bit.
Tất cả các loại thiết bị âm thanh hiện có đều được giữ nguyên. AUDIO_DEVICE_BIT_IN
vẫn được dùng để phân biệt thiết bị đầu vào hoặc đầu ra. Khi thêm các loại thiết bị âm thanh mới, các loại thiết bị này sẽ là giá trị được liệt kê trong khoảng trống giữa các giá trị hiện có.
Nhà sản xuất thiết bị gốc (OEM) không nên sử dụng audio_devices_t
làm mặt nạ bit, vì điều đó có thể gây ra kết quả không mong muốn khi thêm các loại thiết bị âm thanh được liệt kê mới.
Ví dụ và nguồn
Trước Android 11, có hai cách sử dụng phổ biến của các loại thiết bị âm thanh dưới dạng mặt nạ bit.
- Sử dụng giá trị
audio_devices_t
để biểu thị nhiều thiết bị âm thanh. - Kiểm tra xem giá trị
audio_devices_t
có chứa các loại thiết bị âm thanh từ một danh mục đã chỉ định hay không.
Để biểu thị nhiều loại thiết bị âm thanh, một lớp có tên DeviceTypeSet
trong
/libaudiofoundation/include/media/AudioContainers.h
được sử dụng. Đây là vùng chứa std::set
của audio_devices_t
. Lớp này được khai báo trong thư viện
libaudiofoundation
có sẵn cho nhà cung cấp. Để biểu thị nhiều loại thiết bị âm thanh trong mã C, bạn có thể sử dụng một mảng hoặc danh sách audio_devices_t
.
Để kiểm tra xem một loại thiết bị có thuộc một danh mục cụ thể hay không, hãy sử dụng các hàm trợ giúp audio_is_.*_device
trong
/system/media/audio/include/system/audio.h
.
Đối với trường hợp nhiều loại thiết bị âm thanh, hãy sử dụng các hàm trợ giúp trong libaudiofoundation
. Ví dụ: sử dụng areAllOfSameDeviceType (DeviceTypeSet, std::function
trong
AudioContainers.h
để kiểm tra xem tất cả các loại thiết bị âm thanh đã cho có cùng loại hay không.
Triển khai
Nhà sản xuất thiết bị gốc (OEM) cần xoá phần trình bày trường bit loại thiết bị âm thanh khỏi quá trình triển khai HAL âm thanh.
- Xoá tất cả bộ nhớ của thiết bị trên trường bit.
Không nên sử dụng
audio_devices_t
để biểu thị nhiều loại thiết bị âm thanh. Thay vào đó, hãy sử dụng danh sách hoặc vectơ. - Ngừng sử dụng các phép toán bit để so sánh các loại thiết bị.
Trước Android 11, các loại thiết bị âm thanh có thể được dùng làm bitfield. Trong trường hợp đó, bạn thường sử dụng các phép toán bit để so sánh loại thiết bị. Khi các loại thiết bị âm thanh mới được liệt kê được thêm vào, các phép toán bit có thể gây ra kết quả không mong muốn. Thay vào đó, hãy sử dụng các hàm trợ giúp. Nếu chỉ có một loại thiết bị âm thanh, hãy sử dụng phương thức so sánh trực tiếp để so sánh hai giá trị. Để kiểm tra xem một loại thiết bị âm thanh có thuộc một danh mục cụ thể hay không, hãy sử dụng các hàm trợ giúp trong
/system/media/audio/include/system/audio.h
. Ví dụ:audio_is_output_device(audio_devices_t device)
- Ngừng sử dụng các giá trị được xác định trước cho các nhóm loại thiết bị âm thanh.
Có một số giá trị được xác định trước cho các nhóm loại thiết bị âm thanh,
AUDIO_DEVICE_OUT_ALL
, trongsystem/media/audio/include/system/audio-base-utils.h
. Tất cả các giá trị này đều được đặt trước nhưng có thể không được dùng nữa vì sẽ không chính xác khi các loại thiết bị âm thanh được liệt kê mới được thêm vào. Có các nhóm loại thiết bị âm thanh mới được xác định trongaudio-base-utils.h
. Đây là các mảng của các loại thiết bị âm thanh, chẳng hạn nhưAUDIO_DEVICE_OUT_ALL_ARRAY
. - Triển khai các phương thức
create_audio_patch()
vàrelease_audio_patch()
để định tuyến thay vìset_parameters
.Phương thức
set_parameters
sử dụng các loại thiết bị âm thanh dưới dạng một bit, vì vậy, có thể có kết quả không mong muốn nếu bạn thêm các loại thiết bị âm thanh được liệt kê mới.Hiện tại, bạn cần có hai loại bản vá âm thanh:
- Trộn vào các bản vá thiết bị để phát
- Thiết bị để kết hợp các bản vá, để ghi âm
Trong các bản cập nhật tiếp theo, có thể cần thêm các bản vá cho thiết bị với thiết bị.
Khi tạo bản vá âm thanh, nếu không chỉ định tay cầm bản vá, thì bạn phải có HAL âm thanh để tạo một tay cầm bản vá duy nhất có thể xác định bản vá âm thanh. Nếu không, HAL âm thanh sẽ sử dụng tay điều khiển bản vá âm thanh đã cho để cập nhật bản vá âm thanh.
Nếu sử dụng HAL âm thanh cũ và trình bao bọc HIDL AOSP, thì HAL âm thanh cũ sẽ đặt phiên bản HAL chính thành 3.0.
Để bật tính năng bản vá âm thanh, HAL âm thanh phải đặt phiên bản HAL chính thành 3.0 trở lên. Hãy tham khảo
Device::supportsAudioPatches()
trong phần triển khai HIDL mặc định để biết thêm thông tin. Bạn cũng có thể tìm thấy thông tin này trên HAL âm thanh cho Cuttlefish.
Tuỳ chỉnh
Bạn không thể tắt tính năng này hoặc huỷ quá trình tái cấu trúc thiết bị âm thanh trong khung cho phép thêm các loại thiết bị âm thanh.
Tất cả các loại thiết bị âm thanh được thêm vào đều cho phép biểu thị một loại thiết bị bằng một nhóm bit duy nhất, vì vậy, các phương thức triển khai HAL hiện tại vẫn hoạt động.
Nếu các loại thiết bị âm thanh mới được thêm vào và nhà sản xuất thiết bị gốc (OEM) muốn sử dụng các loại thiết bị đó, thì họ phải nâng cấp quá trình triển khai HAL âm thanh và chuyển sang HIDL phiên bản 6.0 trở lên. Bạn bắt buộc phải nâng cấp phiên bản HAL chính lên 3.0 và triển khai các phương thức create_audio_patch
và release_audio_patch
, vì việc sử dụng set_parameters
để định tuyến luồng có thể gây ra kết quả ngoài mong muốn khi thêm các loại thiết bị âm thanh mới.
Xác nhận kết quả
Việc cần làm đối với nhà sản xuất thiết bị gốc (OEM) là cập nhật cách triển khai HAL. Bạn có thể sử dụng VTS cho HAL âm thanh để xác thực xem quá trình triển khai có hoạt động như dự kiến hay không. Bạn có thể tìm thấy tất cả các bài kiểm thử trong tệp VTS.