Hiệu ứng âm thanh

Kể từ Android 11, các nhà sản xuất thiết bị có thể tự động đính kèm và bật các hiệu ứng âm thanh cụ thể khi một thiết bị âm thanh nhất định được chọn để ghi hoặc phát âm thanh. Một điểm cải tiến lớn là các hiệu ứng âm thanh được chèn vào một đường dẫn âm thanh hoàn toàn được triển khai bên dưới HAL âm thanh (kết nối trực tiếp giữa thiết bị đầu vào và thiết bị đầu ra) có thể được kiểm soát bằng khung hiệu ứng âm thanh.

Tính năng này chủ yếu nhắm đến các OEM ô tô nhưng cũng có thể được dùng trong các kiểu dáng khác của Android. Một ứng dụng ví dụ đang chèn hiệu ứng tăng cường giọng nói vào đầu ra của bộ dò đài FM khi được kết nối trực tiếp với loa thông qua DSP âm thanh.

Điều kiện tiên quyết

  • Đối với mọi hiệu ứng âm thanh khác, hiệu ứng phải được triển khai bằng một thư viện của nhà cung cấp và được liệt kê trong tệp cấu hình audio_effects.xml.
  • Hiệu ứng phải thuộc loại tiền xử lý hoặc hậu xử lý (cờ TYPE_PRE_PROC hoặc TYPE_POST_PROC được đặt trong EffectDescriptor.flags).
  • Nếu việc triển khai hiệu ứng được tăng tốc bằng phần cứng (cờ HW_ACC_TUNNEL được đặt trong EffectDescriptor.flags), thì hiệu ứng đó có thể được đính kèm vào một đường dẫn âm thanh được kết nối hoàn toàn bên dưới HAL (không có luồng âm thanh phát hoặc ghi nào được mở tại HAL âm thanh).

Tạo và bật hiệu ứng thiết bị

Bạn có thể tạo hiệu ứng âm thanh dành riêng cho thiết bị bằng một trong hai phương thức dưới đây.

Sử dụng tệp cấu hình hiệu ứng âm thanh

Phương thức này cho phép tạo tĩnh một hiệu ứng âm thanh được gắn và bật một cách có hệ thống cho mọi đường dẫn âm thanh chọn một thiết bị cụ thể làm đích hoặc nguồn.

Bạn có thể thực hiện việc này bằng cách thêm một phần cụ thể vào tệp audio_effects.xml như sau:

<deviceEffects>
<devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom">
      	<apply effect="agc"/>
      </devicePort>
  </deviceEffects>
  

Sử dụng một API hệ thống

Một hàm khởi tạo @SystemApi mới đã được thêm vào lớp android.media.audiofx.AudioEffect để tạo và bật hiệu ứng trên thiết bị:

AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

Sau khi được tạo bằng cách chỉ định mã nhận dạng hiệu ứng âm thanh duy nhất và bộ mô tả thiết bị âm thanh, hiệu ứng này có thể được bật hoặc tắt bằng các API AudioEffect hiện có.

Bạn cũng có thể dùng API để truy vấn xem một quy trình triển khai có hỗ trợ một tổ hợp thiết bị/hiệu ứng nhất định hay không.

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

API HAL mới

HAL hiệu ứng âm thanh

HAL hiệu ứng âm thanh V6.0 có một chữ ký mới cho phương thức createEffect(), cho phép tạo hiệu ứng được đính kèm vào một thiết bị:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • AudioSession mà bạn chỉ định phải là AudioSessionConsts.DEVICE.
  • AudioIoHandle sẽ bị bỏ qua nếu sessionAudioSessionConsts.DEVICE.
  • device được xác định bằng AudioPortHandle duy nhất do khung âm thanh chỉ định khi thiết bị được chọn tại HAL âm thanh bằng phương thức IDevice::createAudioPatch().

HAL âm thanh

Để hỗ trợ tính năng hiệu ứng âm thanh, HAL âm thanh phải triển khai chế độ kiểm soát định tuyến âm thanh bằng cách sử dụng API IDevice::createAudioPatch(). Điều này được biểu thị bằng phương thức IDevice::supportsAudioPatches() báo cáo true.

Hai phương thức API mới, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId), cho biết việc triển khai HAL rằng hiệu ứng trên thiết bị đã được bật hoặc tắt trên một thiết bị nhất định.

Thiết bị được xác định bằng mã nhận dạng AudioPortHandle. Mã này được dùng khi bản vá âm thanh được tạo bằng phương thức IDevice::createAudioPatch().

Một phương thức triển khai có thể sử dụng Audio HAL API nếu cần có sự phối hợp giữa HAL âm thanh và HAL hiệu ứng khi một hiệu ứng được bật hoặc tắt.