Lớp trừu tượng phần cứng (HAL) cho âm thanh HIDL

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.

audio_hal

Hình 1. Giao diện Audio HAL.

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 đồ và sự 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 chức năng Audio HAL trong tệp audio_policy_configuration.xml để khung có thể sử dụng các chức năng đó.

API HAL âm thanh HIDL

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.halIPrimaryDevice.hal chứa các phương thức như setMasterVolume hoặc openInputStream.
  • Các 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 (Lớp trừu tượng phần cứng) đến IStream.hal, IStreamOut.halIStreamIn.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 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

Phương thứ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 thư viện dùng chung cũ. Việc triển khai mặc định cũng có thể được coi là một tham chiếu khi triển khai các phiên bản HAL âm thanh mới tương tác trực tiếp với trình điều khiển 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 thông tin 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 sự 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ể, 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ê

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 V7:

thay đổi định dạng âm thanh

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 dành cho nhà cung cấp
  • AudioFormat: Có thể mở rộng dành cho nhà cung cấp
  • AudioGainMode
  • 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:

giá trị truyền âm thanh

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 nhà cung cấp:

  1. Giá trị enum của AudioFormat được chuyển đổi thành giá trị chuỗi trong libaudiohal và được truyền đến HAL.
  2. Ở phía HAL, trình bao bọc mặc định sẽ chuyển đổi chuỗi thành một giá trị enum, giá trị này đượ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 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 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 đị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 biểu tượng , (dấu phẩy) và | (thanh dọc) 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 biểu tượng, 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 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ủ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ụng

  • 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 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 I/O âm thanh, 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.

Đặ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. Để 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 hợp lệ của nhà cung cấp V7:

  • 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