Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Âm thanh HAL

Lớp trừu tượng phần cứng âm thanh (HAL) của Android kết nối các API khung cấp cao hơn, dành riêng cho âm thanh trong android.media với phần cứng và trình điều khiển âm thanh bên dưới. Audio HAL xác định giao diện tiêu chuẩn mà các dịch vụ âm thanh gọi vào. Nó phải được triển khai để phần cứng âm thanh hoạt động chính xác.

Trang này cung cấp tổng quan về HAL âm thanh và cung cấp chi tiết về API và các yêu cầu triển khai của nó.

Giao diện âm thanh HAL

Giao diện HAL âm thanh được xác định bằng cách sử dụng HIDL trong các tệp .hal và lược đồ XSD cho các 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 HAL. Các tệp này phải phù hợp với các lược đồ của chúng và sự phù hợp được xác minh bằng các bài kiểm tra VTS.

Là một phần của việc triển khai 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. Các 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 HAL âm thanh

HAL âm thanh chứa các API sau:

  • Core HAL
  • Hiệu ứng HAL
  • HAL chung

Mỗi API này được mô tả trong các phần sau.

Core HAL

Core HAL là API chính được AudioFlinger sử dụng để phát âm thanh và điều khiển định tuyến âm thanh. Một số giao diện chính như sau:

  • IDeviceFactory.hal là điểm 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 sử 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 liệt kê vị trí của các thành phần Core HAL hữu ích.

Thành phần HAL cốt lõi Địa điểm
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 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 pre-Treble HAL bằng cách sử dụng các thư viện được chia sẻ 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 mới của HAL âm thanh tương tác trực tiếp với trình điều khiển hạt nhân.

Hiệu ứng HAL

API Effects HAL được sử dụng bởi khung hiệu ứng để kiểm soát các hiệu ứng âm thanh. Bạn cũng có thể định cấu hình các hiệu ứng tiền xử lý như kiểm soát độ lợi tự động và khử nhiễu thông qua API Effects HAL.

Bảng sau liệt kê vị trí của các thành phần Hiệu ứng HAL hữu ích.

Hiệu ứng thành phần HAL Địa điểm
Phiên bản mới nhất của API /hardware/interfaces/audio/effect/6.0/
Hiệu ứng tệp cấu hình lược đồ XSD /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd

Để biết thêm thông tin, hãy xem triển khai mẫu của API Hiệu ứng HAL ( /hardware/interfaces/audio/effect/all-versions/default/ ) và phần Hiệu ứng âm thanh .

HAL chung

Common HAL là một thư viện các kiểu dữ liệu phổ biến được sử dụng bởi các API HAL Core và Effects. Nó không có giao diện và không có các bài kiểm tra VTS liên quan vì nó chỉ xác định cấu trúc dữ liệu. API HAL chung chứa những điều sau:

  • Các định nghĩa ( /hardware/interfaces/audio/common/6.0/types.hal ) được chia sẻ bởi các API Core và Effect
  • Các tiện ích ( /hardware/interfaces/audio/common/all-versions ) được sử dụng để giúp mã hóa chống lại các API HIDL cho việc triển khai, ứng dụng khách và thử nghiệm

Yêu cầu

Ngoài việc triển khai HAL âm thanh và tạo tệp cấu hình chính sách âm thanh, các yêu cầu HAL sau đây phải được tuân thủ:

  • Nếu tính năng chụp cho Trình kích hoạt âm thanh (chụp từ bộ đệm DSP từ nóng) được hỗ trợ bởi một cấu hình đầu vào, thì việc triển khai phải hỗ trợ số luồng hoạt động trên cấu hình này tương ứng với số phiên đồng thời được hỗ trợ bởi Trình kích hoạt âm thanh HAL.
  • Đồng thời của cuộc gọi thoại TX và chụp từ bộ xử lý ứng dụng như được trình bày chi tiết trên trang Chụp đồng thời .

Cập nhật cho Audio HAL V7

Để giải quyết các vấn đề tương thích ngược, AIDL ổn định là bắt buộc đối với tất cả các thay đổi HAL bắt đầu từ Android 13. Để hỗ trợ và nâng cao việc áp dụng AIDL trong Android 13 trở lên, Audio HAL V7 thực hiện những việc sau:

  • Hợp nhất các mô hình dữ liệu được sử dụng bởi khuôn khổ và HAL.
  • Giảm thiểu sự trùng lặp giữa các kiểu dữ liệu HIDL (enums) và lược đồ XML được sử dụng để cấu hình chính sách âm thanh.

Cụ thể, các thay đổi được thực hiện trong các lĩnh vực sau trong âm thanh HAL V7:

Những thay đổi này được thảo luận chi tiết hơn trong các phần tương ứng của chúng.

Bảng kê

Bắt đầu từ Audio HAL V7, các kiểu 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 âm thanh HAL V6, giá trị của các loại enum (như types.hal AudioFormat được xác định trong lược đồ XSD 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 liệt kê trong lược đồ XSD.

Xem Hình 2 để so sánh một số thay đổi đố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 kiểu enum đã được chuyển đổi thành String :

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : nhà cung cấp có thể mở rộng
  • AudioFormat : có thể mở rộng theo nhà cung cấp
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

Chuyển các giá trị enum chuỗi

Giá trị chuỗi được sử 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 đề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ị chuỗi enum

Ví dụ: để chuyển một 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 cho HAL kế thừa.

Các thay đổi về 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. Các thay đổi được thực hiện 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 tá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 trong V6 trở xuống. Như đã thấy trong ví dụ sau, một khoảng trắng được sử dụng để phân tá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 biểu tượng, 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 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

Một số cấu trúc dữ liệu được định nghĩa lại trong V7 để giảm thiểu các định nghĩa trùng lặp. Các bộ dữ liệu lặp đi lặp lại được nhóm lại với nhau thành các cấu trúc có thể tái sử dụng. 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 hiệp an toàn.

Ví dụ, trong V6 trở xuống, bộ ba <format, sampling rate, channel mask> thường được sử dụng trong các giao diện và kiểu HIDL. Để loại bỏ phần dư thừa này, trong V7, kiểu dữ liệu AudioConfigBase và các kiểu dữ liệu khác được định nghĩa 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ế công đoàn 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 các thẻ tùy chỉnh cho siêu dữ liệu bản âm thanh.

Đối với siêu dữ liệu bản ghi và phát lại, các nhà cung cấp có thể chuyển các thẻ của riêng họ, được sử dụng để thêm các thuộc tính vào luồng I / O âm thanh, từ ứng dụng sang HAL.

Thẻ nhà cung cấp cho siêu dữ liệu bản phát lại được thêm vào như được thấy 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 bản ghi.

Khoảng cách tên của tiện ích mở rộng nhà cung cấp

Bắt đầu từ HAL V7, tiện ích mở rộng nhà cung cấp yêu cầu thêm tiền tố {vendor} mà không bắt buộc trong V6. Để tiền tố {vendor} hợp lệ, tiền tố đó 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 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 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