Trong Android 13 trở xuống, giao diện Audio HAL (Lớp trừu tượng phần cứng)
được xác định bằng HIDL trong tệp HIDL HAL (với
tiện ích .hal
) và
Giản đồ XSD cho
các tệp cấu hình, được hiển thị như sau.
Hình 1. Giao diện HAL âm thanh.
Tệp cấu hình
Các tệp cấu hình XML về chính sách âm thanh và hiệu ứng âm thanh được coi là một phần của giao diện Audio HIDL HAL. Các tệp này phải phù hợp với giản đồ của chúng và sự tuân thủ được xác minh bằng các bài kiểm tra VTS.
Trong quá trình triển khai HAL HIDL âm thanh, bạn phải tạo
tệp cấu hình chính sách âm thanh
mô tả cấu trúc liên kết âm thanh. Bạn phải khai báo các chức năng của lớp trừu tượng phần cứng (HAL) cho âm thanh bằng
tệp audio_policy_configuration.xml
để khung sử dụng.
API HAL âm thanh HIDL
Phần này mô tả các API cốt lõi, Hiệu ứng và HAL API phổ biến cho HIDL.
Lớp trừu tượng phần cứng (HAL) lõi
Sau đây là một số giao diện chính của Core HAL (sử dụng HIDL):
IDeviceFactory.hal
là điểm truy cập vào API.IDevice.hal
vàIPrimaryDevice.hal
chứa các phương thức nhưsetMasterVolume
hoặcopenInputStream
.- Luồng có tính một chiều và được AudioFlinger sử dụng để gửi hoặc nhận
âm thanh đến và đi từ HAL qua
IStream.hal
,IStreamOut.hal
vàIStreamIn.hal
.
Bảng sau đây liệt kê vị trí của các thành phần Core HAL HIDL hữu ích:
Thành phần HAL chính | Vị trí |
---|---|
Phiên bản API mới nhất | /hardware/interfaces/audio/6.0
|
Các loại dành riêng cho Core HAL API mới nhất | /hardware/interfaces/audio/6.0/types.hal
|
Giản đồ XSD của tệp cấu hình chính sách âm thanh | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
Phương thức triển khai mặc định của Core HAL API (/hardware/interfaces/audio/core/all-versions/default/
)
là một trình bao bọc xung quanh việc triển khai HAL trước Treble bằng cách sử dụng
thư viện chia sẻ cũ.
Cách triển khai mặc định cũng có thể được coi là một tệp đối chiếu khi
triển khai các phiên bản mới của HAL âm thanh tương tác với trình điều khiển nhân
trực tiếp.
Lớp trừu tượng phần cứng (HAL) cho hiệu ứng
Bảng sau đây liệt kê vị trí của các thành phần HAL (Lớp trừu tượng phần cứng) hữu ích sử dụng HIDL:
Thành phần HAL của hiệu ứng | Vị trí |
---|---|
Phiên bản API mới nhất | /hardware/interfaces/audio/effect/6.0/
|
Giản đồ XSD của tệp cấu hình hiệu ứng | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
Để biết thêm thông tin, hãy xem phương thức triển khai mẫu của
Hiệu ứng API HAL tại /hardware/interfaces/audio/effect/all-versions/default/
và phần Hiệu ứng âm thanh.
Lớp trừu tượng phần cứng (HAL) phổ biến
API HAL phổ biến sử dụng HIDL chứa những thông tin sau:
- Định nghĩa (
/hardware/interfaces/audio/common/6.0/types.hal
) được chia sẻ bởi API Core và Effect. - Tiện ích (
/hardware/interfaces/audio/common/all-versions
) được dùng để trợ giúp lập trình dựa trên API HIDL để triển khai, ứng dụng và kiểm thử.
Các điểm cập nhật đối với Audio HAL V7
Có những thay đổi đáng kể đối với phiên bản 7 của HAL âm thanh trong Android 12 như trình bày trong phần này. HAL V7 âm thanh thực hiện những việc sau:
- Hợp nhất các mô hình dữ liệu mà khung này và HAL (Lớp trừu tượng phần cứng) sử dụng.
- Giảm thiểu việc trùng lặp giữa các kiểu dữ liệu (enum) HIDL và giản đồ XML được dùng cho cấu hình chính sách âm thanh.
Cụ thể, những thay đổi được thực hiện ở các phần sau trong Audio HAL V7:
Những thay đổi này sẽ được thảo luận chi tiết hơn trong các phần tương ứng.
Liệt kê
Bắt đầu trong Audio HAL V7, các loại được liệt kê được sử dụng trong Cấu hình chính sách âm thanh chỉ được xác định trong giản đồ XSD chứ không phải trong HIDL.
Trong HAL V6 Âm thanh, giá trị của các loại enum (như AudioFormat
) trong types.hal
là
cũng được xác định trong giản đồ XSD của tệp cấu hình chính sách âm thanh, tạo ra một
trùng lặp. Để tránh điều này trong phiên bản 7, các loại enum sẽ được thay đổi thành string
và
tất cả giá trị liệt kê có thể có sẽ được liệt kê trong giản đồ XSD.
Hình 2 so sánh một số thay đổi đối với kiểu enum AudioFormat
trong V7:
Hình 2. So sánh một số thay đổi đối với enum AudioFormat.
Tham khảo danh sách sau để biết các loại enum đã được chuyển đổi thành
string
:
AudioChannelMask
AudioContentType
AudioDevice
: Có thể mở rộng dành cho nhà cung cấpAudioFormat
: Có thể mở rộng dành cho nhà cung cấpAudioGainMode
AudioSource
AudioStreamType
AudioUsage
Truyền các giá trị enum của chuỗi
Giá trị chuỗi được dùng để chuyển thông tin dưới dạng giá trị liệt kê qua ranh giới giao diện HAL. Cả khung và Trình bao bọc HAL sử dụng các giá trị enum số nguyên để triển khai logic nghiệp vụ và sử dụng phương pháp chuyển đổi được mô tả trong Hình 3:
Hình 3. Truyền các giá trị enum của chuỗi.
Ví dụ: để truyền giá trị của loại định dạng âm thanh từ khung đến hàm nhà cung cấp:
- Giá trị enum của
AudioFormat
được chuyển đổi thành giá trị chuỗi tronglibaudiohal
và được truyền đến HAL. - Ở phía HAL, trình bao bọc mặc định sẽ chuyển đổi chuỗi thành một enum được truyền đến HAL (Lớp trừu tượng phần cứng) cũ.
Thay đổi giản đồ XML
Việc có danh sách đầy đủ các giá trị enum trong định nghĩa lược đồ XML (XSD) cho phép để xác thực tệp XML cấu hình chính sách âm thanh hiệu quả hơn bằng VTS. Chúng tôi đã thực hiện các thay đổi trong tệp cấu hình chính sách âm thanh được sử dụng với HAL V7 để tuân thủ XSD.
Trong phiên bản 7, ký tự ␣
(dấu cách) tiêu chuẩn được dùng để phân cách các danh sách giá trị trong
(như tốc độ lấy mẫu, mặt nạ kênh và cờ), thay vì ,
ký hiệu (dấu phẩy) và |
(thanh dọc) dùng trong phiên bản V6 trở xuống. Như được thấy trong
trong ví dụ sau, một dấu cách được dùng để phân cách danh sách các giá trị của
channelMasks
:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Để thay đổi biểu tượng, hãy sử dụng tập lệnh chuyển đổi tự động được gọi là
update_audio_policy_config.sh
. Hãy xem lệnh sau để chuyển đổi V6
tệp cấu hình chính sách âm thanh thành phiên bản V7 dành cho thiết bị Pixel 5 (Redfin):
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
Loại dữ liệu
Chúng tôi đã xác định lại một số cấu trúc dữ liệu trong phiên bản 7 để giảm thiểu tình trạng trùng lặp định nghĩa. Các bộ mục dữ liệu lặp lại được nhóm lại với nhau thành các bộ dữ liệu có thể sử dụng lại cấu trúc. Những cấu trúc dữ liệu này sử dụng những tính năng mới nhất của HIDL, chẳng hạn như liên kết an toàn.
Ví dụ: trong phiên bản 6 trở xuống, gấp ba lần <format, sampling rate, channel mask>
thường được dùng trong các giao diện và kiểu HIDL. Để loại bỏ phần thừa này, trong
Trong V7, kiểu dữ liệu AudioConfigBase
và các kiểu dữ liệu khác được xác định như sau:
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
được sử dụng bởi
AudioConfig
,AudioOffloadInfo
,AudioPortConfig
AudioProfile := <format, {sampling rates}, {channel masks}>
thay thế các bộ sưu tập rời trong
AudioPort/PortConfig
AudioPortExtendedInfo := device | mix | session
thay thế liên kết trong
AudioPort/PortConfig
Thẻ nhà cung cấp
Ngoài các loại thiết bị và định dạng, nhà cung cấp có thể thêm các thẻ tuỳ chỉnh cho âm thanh siêu dữ liệu của bản nhạc.
Đối với siêu dữ liệu của bản nhạc phát và ghi âm, nhà cung cấp có thể truyền các thẻ của riêng họ, được dùng để thêm các thuộc tính vào luồng âm thanh I/O, từ ứng dụng vào HAL.
Thẻ nhà cung cấp cho siêu dữ liệu của bản phát lại được thêm như dưới đây ví dụ:
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
Cấu trúc RecordTrackMetadata
được triển khai theo cách tương tự bằng cách
thêm các thẻ dành riêng cho siêu dữ liệu của bản ghi âm.
Đặt tên tiện ích của nhà cung cấp
Kể từ HAL V7, các tiện ích của nhà cung cấp yêu cầu thêm tiền tố {vendor}
không bắt buộc trong V6. Để hợp lệ, tiền tố {vendor}
phải là
ba ký tự chữ-số trở lên.
Sử dụng định dạng sau trong V7:
VX_{vendor}_{letters/numbers}
Sau đây là một số ví dụ về tiện ích hợp lệ của nhà cung cấp V7:
VX_GOOGLE_VR
VX_QCI_AMBIENT_MIC
Thông tin về phiên bản
Bảng sau đây liệt kê số phiên bản HAL cho mỗi bản phát hành Android:
Phiên bản Android | Phiên bản HIDL HAL |
---|---|
Android 13 | 7.1 |
Android 12 | 7.0 |
Android 11 | 6.0 |
Android 10 | 5 |
Android 9 | 4 |
Android 8 | 2 |