Trong Android 13 trở xuống, giao diện Audio HAL được xác định bằng HIDL trong các tệp HIDL HAL (có đuôi .hal
) và các giản đồ XSD cho các tệp cấu hình, như minh hoạ dưới đây.
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 HAL HIDL âm thanh. Các tệp này phải tuân thủ giản đồ của chúng và sự tuân thủ được xác minh bằng các kiểm thử VTS.
Trong quá trình triển khai HAL HIDL âm thanh, 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 liên kết âm thanh. Bạn phải khai báo các chức năng của HAL âm thanh trong tệp audio_policy_configuration.xml
để khung sử dụng các chức năng đó.
Audio HIDL HAL API
Phần này mô tả các API HAL Core, Effects và Common cho HIDL.
HAL cốt 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 là một chiều và được AudioFlinger dùng để gửi hoặc nhận âm thanh đến và đi 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 HIDL HAL cốt lõi 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 Core HAL API mới nhất | /hardware/interfaces/audio/6.0/types.hal
|
Sơ đồ 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 Core HAL API (/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 chế độ triển khai mặc định là một 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 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 một cách triển khai mẫu của Effects HAL API tại /hardware/interfaces/audio/effect/all-versions/default/
và phần Hiệu ứng âm thanh.
HAL chung
Common HAL API sử dụng HIDL chứa những nội dung sau:
- Định nghĩa (
/hardware/interfaces/audio/common/6.0/types.hal
) do Core API và Effect API dùng chung. - Tiện ích (
/hardware/interfaces/audio/common/all-versions
) được dùng để hỗ trợ việc mã hoá dựa trên API HIDL cho các hoạt động triển khai, ứng dụng và kiểm thử.
Nội dung cập nhật đối với HAL âm thanh phiên bản 7
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 do khung và HAL sử dụng.
- Giảm thiểu sự trùng lặp giữa các kiểu dữ liệu HIDL (enum) và giản đồ XML dùng cho cấu hình chính sách âm thanh.
Cụ thể, những 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 sẽ được thảo luận chi tiết hơn trong các phần tương ứng.
Bả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 các loại enum (chẳng hạn 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 trường hợp này trong phiên bản 7, các loại enum sẽ được thay đổi thành string
và tất cả cá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 liệt kê 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
: Có thể mở rộng nhà cung cấpAudioFormat
: Có thể mở rộng nhà cung cấpAudioGainMode
AudioSource
AudioStreamType
AudioUsage
Truyền các giá trị enum chuỗi
Các giá trị chuỗi được dùng để chuyển thông tin dưới dạng các 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 các 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 lược đồ XML
Việc có danh sách đầy đủ các giá trị enum trong định nghĩa giản đồ XML (XSD) cho phép VTS xác thực tệp XML cấu hình chính sách âm thanh tốt hơn. Chúng tôi đã thay đổi tệp cấu hình chính sách âm thanh được dùng với HAL V7 để tuân thủ XSD.
Trong V7, ký tự ␣
(dấu cách) tiêu chuẩn được dùng để phân tách danh sách giá trị trong các thuộc tính (chẳng hạn 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à |
(thanh dọc) được dùng trong V6 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" … />
Để thực hiện các thay đổi về ký hiệu, hãy sử dụng một 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 thành 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 nhóm lại với nhau thành các cấu trúc có thể 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, chẳng hạn như các hợp nhất an toàn.
Ví dụ: trong V6 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 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 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ế các liên minh trong
AudioPort/PortConfig
Thẻ của nhà cung cấp
Ngoài các loại và định dạng thiết bị, 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 ghi và bản phát, các 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 I/O âm thanh) từ các ứng dụng đến HAL.
Các thẻ nhà cung cấp cho siêu dữ liệu của bản phát được thêm vào 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 tiện ích dành cho 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ừ 3 ký tự bao gồm chữ và số trở lên.
Hãy dùng định dạng sau trong phiên bản 7:
VX_{vendor}_{letters/numbers}
Sau đây là một số ví dụ về tiện ích của nhà cung cấp hợp lệ trong phiên bản 7:
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 |