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

Trong âm thanh Android, audio_devices_t được dùng để biểu thị loại thiết bị âm thanh. Phương thức này thường được dùng trong mã nguồn âm thanh dưới dạng một trường bit để lọc hoặc chọn một hay nhiều thiết bị được chỉ định. Trước Android 11, có giới hạn là 30 loại thiết bị đầu vào/đầu ra âm thanh và không có khe cắm dự phòng để thêm các loại thiết bị âm thanh mới. Chúng tôi đã xoá 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.

Để xoá 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 là các giá trị được liệt kê thay vì mặt nạ bit.

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

Các OEM không nên 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 các loại thiết bị âm thanh được liệt kê mới được thêm vào.

Ví dụ và nguồn

Trước Android 11, có 2 cách sử dụng phổ biến các loại thiết bị âm thanh dưới dạng mặt nạ bit.

  • Sử dụng giá trị audio_devices_t để biểu thị 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 thuộc một danh mục cụ thể hay không.

Để biểu thị nhiều loại thiết bị âm thanh, một lớp có tên là DeviceTypeSet trong /libaudiofoundation/include/media/AudioContainers.h được dùng, đây là một vùng chứa std::set của audio_devices_t. Lớp này được khai báo trong thư viện libaudiofoundation do nhà cung cấp cung cấp. Để biểu thị nhiều loại thiết bị âm thanh trong mã C, bạn có thể 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 một danh mục cụ thể hay không, hãy 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 có 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) 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.

Triển khai

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

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

    Không nên dùng audio_devices_t để biểu thị nhiều loại thiết bị âm thanh. Thay vào đó, hãy 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 dùng làm trường bit. Trong trường hợp đó, bạn nên dùng các thao tác trên bit để so sánh các loại thiết bị. 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. Nếu chỉ có một loại thiết bị âm thanh, hãy sử dụng phương thức 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 một danh mục cụ thể hay không, hãy 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. Ngừng sử dụng các giá trị 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 dành riêng nhưng có thể không được dùng nữa vì chúng sẽ không chính xác khi các loại thiết bị âm thanh được liệt kê mới được thêm vào. 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, vì vậy, có thể xảy ra kết quả không mong muốn nếu bạn thêm các loại thiết bị âm thanh được liệt kê mới.

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

    • Trộn các bản vá thiết bị để phát
    • 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ó thể bạn sẽ cần thêm các bản vá cho từng thiết bị.

    Khi tạo một bản vá âm thanh, nếu bạn không chỉ định mã nhận dạng bản vá, thì HAL âm thanh phải tạo một mã nhận dạng bản vá riêng biệt có thể xác định bản vá âm thanh. Nếu không, HAL âm thanh sẽ dùng mã nhận dạng 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 HIDL AOSP, thì HAL âm thanh cũ phải đặt phiên bản HAL chính thành 3.0.

    Để bật tính năng bản 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 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 HAL âm thanh cho Cuttlefish.

Tuỳ chỉnh

Bạn không thể tắt tính năng này hoặc khôi phục quá trình tái cấu trúc thiết bị âm thanh trong khung cho phép 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 bit duy nhất được đặt, vì vậy, các chế độ 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, thì họ phải nâng cấp quá trình 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 các loại thiết bị âm thanh mới được thêm vào.

Xác nhận kết quả

Công việc bắt buộc đối với OEM là cập nhật các quy trình triển khai HAL. Bạn có thể sử dụng VTS cho HAL âm thanh để xác thực xem quá trình triển khai có hoạt động như dự kiến hay không. Bạn có thể tìm thấy tất cả các kiểm thử trong các tệp VTS.