HIDL Audio HAL

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.

audio_hal

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.halIPrimaryDevice.hal chứa các phương thức như setMasterVolume hoặc openInputStream.
  • 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.halIStreamIn.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:

audioformat-change

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

audio-passing-values

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:

  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. 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