Trong Android 13 trở xuống, giao diện Audio HAL được xác định bằng HIDL trong các tệp HAL HIDL (có đuôi .hal
) và giản đồ XSD cho các tệp cấu hình, như sau.
Hình 1. Giao diện Audio HAL.
Tệp cấu hình
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 tuân thủ giản đồ và việc tuân thủ được xác minh bằng các bài kiểm thử VTS.
Trong quá trình triển khai HAL âm thanh HIDL, bạn phải tạo một tệp cấu hình chính sách âm thanh mô tả cấu trúc âm thanh. Bạn phải khai báo các tính năng Audio HAL trong tệp audio_policy_configuration.xml
để khung có thể sử dụng các tính năng đó.
API Audio HIDL HAL
Phần này mô tả các API Core, Effects và Common HAL cho HIDL.
Core HAL
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 là một chiều và được AudioFlinger sử dụng để gửi hoặc nhận âm thanh đến và từ HAL thông 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 cốt lõi | 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 API Core HAL 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
|
Cách triển khai mặc định của API Core HAL (/hardware/interfaces/audio/core/all-versions/default/
) là một trình bao bọc xung quanh cách triển khai HAL trước Treble bằng cách sử dụng các thư viện dùng chung cũ.
Bạn cũng có thể coi phương thức triển khai mặc định là tài liệu tham khảo khi triển khai các phiên bản mới của Audio HAL tương tác trực tiếp với trình điều khiển hạt nhân.
HAL hiệu ứng
Bảng sau đây liệt kê vị trí của các thành phần HAL hiệu ứng hữu ích bằng cách sử dụng HIDL:
Thành phần HAL 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 cách triển khai mẫu của API HAL hiệu ứng tại /hardware/interfaces/audio/effect/all-versions/default/
và phần Hiệu ứng âm thanh.
HAL chung
API HAL phổ biến sử dụng HIDL chứa những nội dung sau:
- Định nghĩa (
/hardware/interfaces/audio/common/6.0/types.hal
) do API Core và Effect chia sẻ. - Các tiện ích (
/hardware/interfaces/audio/common/all-versions
) dùng để giúp lập trình dựa trên các API HIDL cho việc triển khai, ứng dụng và kiểm thử.
Nội dung cập nhật cho Audio HAL V7
Có những thay đổi đáng kể đối với phiên bản 7 của Audio HAL trong Android 12 như được nêu trong phần này. Audio HAL V7 thực hiện những việc sau:
- Hợp nhất các mô hình dữ liệu mà khung và HAL sử dụng.
- Giảm thiểu tình trạng trùng lặp giữa các loại dữ liệu HIDL (enum) và giản đồ XML dùng để định cấu hình chính sách âm thanh.
Cụ thể, các thay đổi được thực hiện trong các lĩnh vực sau trong Audio HAL V7:
Những thay đổi này được thảo luận chi tiết hơn trong các phần tương ứng.
Liệt kê
Kể từ Audio HAL V7, các loại được liệt kê dùng trong tệp 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 Audio HAL V6, các giá trị của loại enum (như AudioFormat
) trong types.hal
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 bản sao. Để tránh điều này trong phiên bản 7, các loại enum được thay đổi thành string
và tất cả các giá trị liệt kê có thể có được liệt kê trong giản đồ XSD.
Hình 2 so sánh một số thay đổi đối với loại enum AudioFormat
trong phiên bản 7:
Hình 2. So sánh một số thay đổi đối với enum AudioFormat.
Hãy tham khảo danh sách sau đây để biết các loại enum đã được chuyển đổi thành string
:
AudioChannelMask
AudioContentType
AudioDevice
: Mở rộng cho nhà cung cấpAudioFormat
: Nhà cung cấp có thể mở rộngAudioGainMode
AudioSource
AudioStreamType
AudioUsage
Truyền giá trị enum chuỗi
Giá trị chuỗi được dùng để chuyển thông tin dưới dạng giá trị liệt kê trên ranh giới giao diện HAL. Cả khung và trình bao bọc HAL đều 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 giá trị enum chuỗi.
Ví dụ: để truyền giá trị của loại định dạng âm thanh từ khung đến 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. - Về phía HAL, trình bao bọc mặc định sẽ chuyển đổi chuỗi thành một giá trị enum được truyền đến HAL cũ.
Thay đổi về giản đồ XML
Việc có danh sách đầy đủ các giá trị enum trong định nghĩa giản đồ XML (XSD) cho phép xác thực tệp XML cấu hình chính sách âm thanh tốt 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 dùng với HAL V7 để tuân thủ XSD.
Trong phiên bản 7, ký tự ␣
(dấu cách) chuẩn được dùng để phân định danh sách giá trị trong các thuộc tính (như tốc độ lấy mẫu, mặt nạ kênh và cờ), thay vì các ký hiệu ,
(dấu phẩy) và |
(dấu gạch đứng) dùng trong phiên bản 6 trở xuống. Như trong ví dụ sau, dấu cách được dùng để phân tách danh sách giá trị cho channelMasks
:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Để thay đổi ký hiệu, hãy sử dụng tập lệnh chuyển đổi tự động có tên là update_audio_policy_config.sh
. Hãy xem lệnh sau để chuyển đổi tệp cấu hình chính sách âm thanh V6 sang phiên bản V7 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 các định nghĩa trùng lặp. Các bộ dữ liệu lặp lại của các mục dữ liệu được nhóm lại với nhau thành các cấu trúc có thể sử dụng lại. Các cấu trúc dữ liệu này sử dụng các tính năng HIDL mới nhất như các liên kết an toàn.
Ví dụ: trong phiên bản 6 trở xuống, bộ ba <format, sampling rate, channel mask>
thường được dùng trong các giao diện và loại HIDL. Để loại bỏ sự dư thừa này, trong phiên bản 7, loại dữ liệu AudioConfigBase
và các loại dữ liệu khác được xác định như sau:
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
do
AudioConfig
,AudioOffloadInfo
,AudioPortConfig
sử dụngAudioProfile := <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ế các 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 thẻ tuỳ chỉnh cho siêu dữ liệu của bản âm thanh.
Đối với siêu dữ liệu của bản nhạc phát và ghi, nhà cung cấp có thể truyền thẻ riêng, dùng để thêm thuộc tính vào luồng âm thanh I/O, từ ứng dụng đến HAL.
Thẻ nhà cung cấp cho siêu dữ liệu của bản nhạc phát được thêm như trong ví dụ sau:
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.
Không gian tên của phần mở rộng 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. Để tiền tố {vendor}
hợp lệ, tiền tố này phải có từ ba ký tự trở lên, bao gồm cả chữ và số.
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 của nhà cung cấp V7 hợp lệ:
VX_GOOGLE_VR
VX_QCI_AMBIENT_MIC
Thông tin phiên bản
Bảng sau đây liệt kê số phiên bản HAL cho từng 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 |