Âm thanh HIDL HAL

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.

audio_hal

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

audioformat-change

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 :

audio-passing-values

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:

  1. Giá trị enum của AudioFormat được chuyển đổi thành giá trị chuỗi trong libaudiohal và được chuyển tới HAL.
  2. 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