Trong Android 13 trở xuống, giao diện Audio HAL được xác định bằng cách sử dụng HIDL trong tệp HIDL HAL (có phần mở rộng .hal
) và lược đồ XSD cho tệp cấu hình, được hiển thị như sau.
Hình 1. Giao diện âm thanh HAL.
Tệp cấu hình
Chính sách âm thanh và hiệu ứng âm thanh Các tệp cấu hình XML đượ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 theo lược đồ của chúng và sự phù hợp được xác minh bằng các thử nghiệm VTS.
Là một phần của việc triển khai HIDL HAL â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. Khả năng HAL âm thanh phải được khai báo trong tệp audio_policy_configuration.xml
để khung sử dụng chúng.
API HIDL HAL âm thanh
Phần này mô tả các API HAL cốt lõi, Hiệu ứng và phổ biến cho HIDL.
HAL lõi
Một số giao diện chính của Core HAL, sử dụng HIDL, như sau:
-
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
. - Các 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 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 mới nhất của API | /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 |
Lược đồ 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 |
Việc 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 việc triển khai HAL trước Treble bằng cách sử dụng các thư viện chia sẻ cũ . Việc triển khai mặc định cũng có thể được coi là tham chiếu khi triển khai các phiên bản Audio HAL mới tương tác trực tiếp với trình điều khiển kernel.
Hiệu ứng HAL
Bảng sau liệt kê vị trí của các thành phần Effects HAL hữu ích khi sử dụng HIDL:
Hiệu ứng thành phần HAL | Vị trí |
---|---|
Phiên bản mới nhất của API | /hardware/interfaces/audio/effect/6.0/ |
Lược đồ 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 API Effects HAL tại /hardware/interfaces/audio/effect/all-versions/default/
và phần Hiệu ứng âm thanh .
HAL thông thường
API HAL phổ biến sử dụng HIDL chứa các nội dung sau:
- Các định nghĩa (
/hardware/interfaces/audio/common/6.0/types.hal
) được chia sẻ bởi API lõi và API hiệu ứng. - Các tiện ích (
/hardware/interfaces/audio/common/all-versions
) được sử dụng để giúp mã hóa dựa trên API HIDL để triển khai, ứng dụng khách và thử nghiệm.
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 điều sau:
- Thống nhất các mô hình dữ liệu được sử dụng bởi khung và HAL.
- Giảm thiểu sự trùng lặp giữa các kiểu dữ liệu HIDL (enum) và lược đồ XML được sử dụng để cấu hình chính sách âm thanh.
Cụ thể, những thay đổi được thực hiện ở 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ê
Bắt đầu từ Audio HAL V7, các loại liệt kê được sử dụng trong tệp Cấu hình chính sách âm thanh chỉ được xác định trong lược đồ XSD chứ không phải trong HIDL.
Trong Audio HAL V6, các giá trị của các loại enum (như AudioFormat
) trong types.hal
cũng được xác định trong lược đồ XSD của tệp cấu hình chính sách âm thanh, tạo ra sự trùng lặp. Để tránh điều này trong V7, các kiểu enum được thay đổi thành string
và thay vào đó, tất cả các giá trị liệt kê có thể có đều được liệt kê trong lược đồ XSD.
Hình 2 so sánh một số thay đổ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
: Nhà cung cấp có thể mở rộng -
AudioFormat
: Nhà cung cấp có thể mở rộng -
AudioGainMode
-
AudioSource
-
AudioStreamType
-
AudioUsage
Truyền giá trị enum chuỗi
Các giá trị chuỗi được sử dụng để truyề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 đề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ụ: để chuyển giá trị của loại định dạng âm thanh từ khung cho nhà cung cấp:
- Giá trị enum của
AudioFormat
được chuyển đổi thành giá trị chuỗi tronglibaudiohal
và được chuyển tới HAL. - Về phía HAL, trình bao bọc mặc định chuyển đổi chuỗi thành giá trị enum, giá trị này được chuyển tới HAL kế thừa.
Thay đổi lược đồ XML
Việc có danh sách đầy đủ các giá trị enum trong định nghĩa lược đồ 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 đã 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 V7, ký tự ␣
(dấu cách) tiêu chuẩn được sử dụng để phân cách 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ì ,
(dấu phẩy) và |
(thanh dọc) ký hiệu được sử dụng ở phiên bản V6 trở xuống. Như đã thấy trong ví dụ sau, một khoảng trắng được sử dụng để phân cách danh sách các giá trị cho channelMasks
:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Để thực hiện thay đổi ký hiệu, hãy sử dụng tập lệnh chuyển đổi tự động có tên update_audio_policy_config.sh
. 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 V7 để 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ể 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ư liên kết an toàn.
Ví dụ: trong phiên bản V6 trở xuống, bộ ba <format, sampling rate, channel mask>
thường được sử dụng trong các loại và giao diện 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 sử dụng bởi
AudioConfig
,AudioOffloadInfo
,AudioPortConfig
AudioProfile := <format, {sampling rates}, {channel masks}>
thay thế các bộ sưu tập lỏng lẻo trong
AudioPort/PortConfig
AudioPortExtendedInfo := device | mix | session
thay thế các hiệp hội trong
AudioPort/PortConfig
Thẻ 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ẻ tùy chỉnh cho siêu dữ liệu bản âm thanh.
Để phát lại và ghi siêu dữ liệu bản nhạc, nhà cung cấp có thể chuyển thẻ riêng của họ, thẻ này được sử dụng để thêm thuộc tính vào luồng I/O âm thanh, từ ứng dụng đến HAL.
Thẻ nhà cung cấp cho siêu dữ liệu bản nhạc phát lại đượ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ẻ cụ thể cho siêu dữ liệu bản ghi.
Không gian tên tiện ích mở rộng của nhà cung cấp
Bắt đầu từ HAL V7, tiện ích mở rộng của nhà cung cấp yêu cầu tiền tố {vendor}
bổ sung không bắt buộc trong V6. Để tiền tố {vendor}
hợp lệ, nó phải có ba ký tự chữ và 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 mở rộng 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 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.0 |
Android 9 | 4.0 |
Android 8 | 2.0 |