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 (Lớp trừu tượng phần cứng) được xác định bằng HIDL trong tệp HIDL HAL (với tiện ích .hal) và Giản đồ XSD cho các tệp cấu hình, được hiển thị như sau.

giảm âm lượng

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 Audio HIDL HAL. Các tệp này phải phù hợp với giản đồ của chúng và sự tuân thủ được xác minh bằng các bài kiểm tra VTS.

Trong quá trình triển khai HAL HIDL â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. Bạn phải khai báo các chức năng của lớp trừu tượng phần cứng (HAL) cho âm thanh bằng tệp audio_policy_configuration.xml để khung sử dụng.

API HAL âm thanh HIDL

Phần này mô tả các API cốt lõi, Hiệu ứng và HAL API phổ biến cho HIDL.

Lớp trừu tượng phần cứng (HAL) 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 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 qua 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 Core HAL API 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 Core HAL API (/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 thư viện chia sẻ cũ. Cách triển khai mặc định cũng có thể được coi là một tệp đối chiếu khi triển khai các phiên bản mới của HAL âm thanh tương tác với trình điều khiển nhân trực tiếp.

Lớp trừu tượng phần cứng (HAL) cho hiệu ứng

Bảng sau đây liệt kê vị trí của các thành phần HAL (Lớp trừu tượng phần cứng) hữu ích sử dụng HIDL:

Thành phần HAL của 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 phương thức triển khai mẫu của Hiệu ứng API HAL tại /hardware/interfaces/audio/effect/all-versions/default/ và phần Hiệu ứng âm thanh.

Lớp trừu tượng phần cứng (HAL) phổ biến

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) được chia sẻ bởi API Core và Effect.
  • Tiện ích (/hardware/interfaces/audio/common/all-versions) được dùng để trợ giúp lập trình dựa trên API HIDL để triển khai, ứng dụng và kiểm thử.

Các điểm cập nhật đối với Audio HAL V7

Có những thay đổi đáng kể đối với phiên bản 7 của HAL âm thanh trong Android 12 như trình bày trong phần này. HAL V7 âm thanh thực hiện những việc sau:

  • Hợp nhất các mô hình dữ liệu mà khung này và HAL (Lớp trừu tượng phần cứng) sử dụng.
  • Giảm thiểu việc trùng lặp giữa các kiểu dữ liệu (enum) HIDL và giản đồ XML được dùng cho 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ê

Bắt đầu trong Audio HAL V7, các loại được liệt kê được sử dụng trong 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 HAL V6 Âm thanh, giá trị của các loại enum (như AudioFormat) trong types.hal là 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 trùng lặp. Để tránh điều này trong phiên bản 7, các loại enum sẽ được thay đổi thành string và tất 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 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.

Tham khảo danh sách sau để 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 các giá trị enum của chuỗi

Giá trị chuỗi được dùng để chuyể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 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 hàm 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 enum được truyền đến HAL (Lớp trừu tượng phần cứng) cũ.

Thay đổi giản đồ XML

Việc có danh sách đầy đủ các giá trị enum trong định nghĩa lược đồ XML (XSD) cho phép để xác thực tệp XML cấu hình chính sách âm thanh hiệu quả 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 được sử 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 cách các danh sách giá trị trong (như tốc độ lấy mẫu, mặt nạ kênh và cờ), thay vì , ký hiệu (dấu phẩy) và | (thanh dọc) dùng trong phiên bản V6 trở xuống. Như được thấy trong trong ví dụ sau, một dấu cách được dùng để phân cách danh sách các giá trị của 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 gọi là update_audio_policy_config.sh. Hãy xem lệnh sau để chuyển đổi V6 tệp cấu hình chính sách âm thanh thành phiên bản V7 dành 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 tình trạng trùng lặp định nghĩa. Các bộ mục dữ liệu lặp lại được nhóm lại với nhau thành các bộ dữ liệu có thể sử dụng lại cấu trúc. Những cấu trúc dữ liệu này sử dụng những tính năng mới nhất của HIDL, chẳng hạn như liên kết an toàn.

Ví dụ: trong phiên bản 6 trở xuống, gấp ba lần <format, sampling rate, channel mask> thường được dùng trong các giao diện và kiểu HIDL. Để loại bỏ phần thừa này, trong 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 rời trong AudioPort/PortConfig

  • AudioPortExtendedInfo := device | mix | session

    thay thế 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 các thẻ tuỳ chỉnh cho âm thanh siêu dữ liệu của bản nhạc.

Đối với siêu dữ liệu của bản nhạc phát và ghi âm, 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 âm thanh I/O, từ ứng dụng vào HAL.

Thẻ nhà cung cấp cho siêu dữ liệu của bản phát lại được thêm như dưới đây ví dụ:

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. Để hợp lệ, tiền tố {vendor} phải là ba ký tự chữ-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 hợp lệ của nhà cung cấp V7:

  • VX_GOOGLE_VR
  • VX_QCI_AMBIENT_MIC

Thông tin về phiên bản

Bảng sau đây 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
Android 9 4
Android 8 2