Giới hạn loại thiết bị

Trong âm thanh Android, audio_devices_t được sử dụng để thể hiện loại thiết bị âm thanh. Nó được sử dụng rộng rãi trong mã nguồn âm thanh dưới dạng trường bit để lọc hoặc chọn một hoặc nhiều thiết bị được chỉ định. Trước Android 11, có giới hạn 30 loại thiết bị đầu vào/đầu ra âm thanh và không có khe trống để thêm các loại thiết bị âm thanh mới. Chúng tôi đã loại bỏ giới hạn về số lượng loại thiết bị âm thanh để cho phép thêm các loại thiết bị âm thanh mới.

Để loại bỏ giới hạn về số lượng loại thiết bị âm thanh, các loại thiết bị âm thanh hiện được liệt kê giá trị thay vì mặt nạ bit.

Tất cả các loại thiết bị âm thanh hiện có đều được giữ nguyên. AUDIO_DEVICE_BIT_IN vẫn được sử dụng để phân biệt thiết bị đầu vào hoặc đầu ra. Khi thêm các loại thiết bị âm thanh mới, chúng sẽ liệt kê các giá trị trong khoảng trống giữa các giá trị hiện có.

OEM không nên sử dụng audio_devices_t làm mặt nạ bit vì điều đó có thể gây ra kết quả không mong muốn khi thêm loại thiết bị âm thanh được liệt kê mới.

Ví dụ và nguồn

Trước Android 11, có hai cách sử dụng điển hình của các loại thiết bị âm thanh là mặt nạ bit.

  • Sử dụng giá trị audio_devices_t để thể hiện nhiều thiết bị âm thanh.
  • Kiểm tra xem giá trị audio_devices_t có chứa các loại thiết bị âm thanh từ một danh mục được chỉ định hay không.

Để thể hiện nhiều loại thiết bị âm thanh, một lớp có tên DeviceTypeSet trong /libaudiofoundation/include/media/AudioContainers.h được sử dụng, là một vùng chứa std::set của audio_devices_t . Lớp được khai báo trong thư viện libaudiofoundation có sẵn của nhà cung cấp. Để thể hiện nhiều loại thiết bị âm thanh bằng mã C, có thể sử dụng một mảng hoặc danh sách audio_devices_t .

Để kiểm tra xem một loại thiết bị có thuộc danh mục được chỉ định hay không, hãy sử dụng các hàm trợ giúp audio_is_.*_device trong /system/media/audio/include/system/audio.h . Đối với trường hợp nhiều loại thiết bị âm thanh, hãy sử dụng các hàm trợ giúp trong libaudiofoundation . Ví dụ: sử dụng areAllOfSameDeviceType (DeviceTypeSet, std::function ) areAllOfSameDeviceType (DeviceTypeSet, std::function ) trong AudioContainers.h để kiểm tra xem tất cả các loại thiết bị âm thanh đã cho có cùng loại hay không.

Thực hiện

Các OEM cần loại bỏ biểu diễn trường bit loại thiết bị âm thanh khỏi quá trình triển khai HAL âm thanh.

  1. Xóa tất cả bộ nhớ của thiết bị trên một trường bit.

    audio_devices_t không nên được sử dụng để đại diện cho nhiều loại thiết bị âm thanh. Thay vào đó, hãy sử dụng danh sách hoặc vectơ.

  2. Ngừng sử dụng các thao tác bit để so sánh các loại thiết bị.

    Trước Android 11, các loại thiết bị âm thanh có thể được sử dụng làm trường bit. Trong trường hợp đó, việc sử dụng các phép toán bit để so sánh các loại thiết bị là điều phổ biến. Khi các loại thiết bị âm thanh mới được liệt kê được thêm vào, các thao tác bit có thể gây ra kết quả không mong muốn. Thay vào đó, hãy sử dụng các hàm trợ giúp thay thế. Nếu chỉ có một loại thiết bị âm thanh thì hãy sử dụng so sánh trực tiếp để so sánh hai giá trị. Để kiểm tra xem loại thiết bị âm thanh có thuộc danh mục được chỉ định hay không, hãy sử dụng các hàm trợ giúp trong /system/media/audio/include/system/audio.h . Ví dụ: audio_is_output_device(audio_devices_t device) .

  3. Dừng sử dụng các giá trị được xác định trước cho các nhóm loại thiết bị âm thanh.

    Có một số giá trị được xác định trước cho các nhóm loại thiết bị âm thanh, AUDIO_DEVICE_OUT_ALL , trong system/media/audio/include/system/audio-base-utils.h . Tất cả các giá trị này đều được đặt trước nhưng có thể không được dùng nữa vì chúng sẽ không chính xác khi thêm loại thiết bị âm thanh được liệt kê mới. Có các nhóm loại thiết bị âm thanh mới được xác định trong audio-base-utils.h , là các mảng loại thiết bị âm thanh, chẳng hạn như AUDIO_DEVICE_OUT_ALL_ARRAY .

  4. Triển khai các phương thức create_audio_patch()release_audio_patch() để định tuyến thay vì set_parameters .

    Phương thức set_parameters sử dụng các loại thiết bị âm thanh làm trường bit, do đó có thể có kết quả không mong muốn nếu các loại thiết bị âm thanh được liệt kê mới được thêm vào.

    Hiện tại, cần có hai loại bản vá âm thanh:

    • Trộn vào các bản vá thiết bị để phát lại
    • Thiết bị trộn các bản vá, để ghi âm

    Trong các bản cập nhật tiếp theo, các bản vá bổ sung có thể được yêu cầu cho từng thiết bị.

    Khi tạo bản vá âm thanh, nếu bộ điều khiển bản vá không được chỉ định thì HAL âm thanh được yêu cầu để tạo bộ điều khiển bản vá duy nhất có thể xác định bản vá âm thanh. Nếu không, HAL âm thanh sẽ sử dụng bộ điều khiển bản vá âm thanh đã cho để cập nhật bản vá âm thanh.

    Nếu sử dụng HAL âm thanh cũ và trình bao bọc AOSP HIDL, HAL âm thanh cũ phải đặt phiên bản HAL chính thành 3.0.

    Để bật tính năng vá âm thanh, HAL âm thanh phải đặt phiên bản HAL chính thành 3.0 trở lên. Hãy tham khảo Device::supportsAudioPatches() trong cách triển khai HIDL mặc định để biết thêm thông tin, bạn cũng có thể tìm thấy thông tin này trên audio HAL dành cho Mực nang.

Tùy chỉnh

Không thể tắt tính năng này hoặc hoàn nguyên quá trình tái cấu trúc thiết bị âm thanh trong khung để có thể thêm các loại thiết bị âm thanh.

Tất cả các loại thiết bị âm thanh được thêm vào đều cho phép biểu thị một loại thiết bị bằng một bộ bit duy nhất, do đó việc triển khai HAL hiện tại vẫn hoạt động.

Nếu các loại thiết bị âm thanh mới được thêm vào và các OEM muốn sử dụng chúng, họ phải nâng cấp việc triển khai HAL âm thanh và chuyển sang HIDL phiên bản 6.0 trở lên. Bạn bắt buộc phải nâng cấp phiên bản HAL chính lên 3.0 và triển khai các phương thức create_audio_patchrelease_audio_patch vì việc sử dụng set_parameters để định tuyến luồng có thể gây ra kết quả không mong muốn khi thêm loại thiết bị âm thanh mới.

Thẩm định

Công việc bắt buộc đối với các OEM là cập nhật việc triển khai HAL của họ. VTS cho âm thanh HAL có thể được sử dụng để xác thực xem việc triển khai có hoạt động như dự định hay không. Tất cả các bài kiểm tra có thể được tìm thấy trong các tập tin VTS .