Hiệu ứng âm thanh

Kể từ Android 11, 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 để thu 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 được triển khai hoàn toàn 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 khung hiệu ứng âm thanh kiểm soát.

Tính năng này chủ yếu nhắm đến các nhà sản xuất thiết bị gốc (OEM) trong ngành ô tô, nhưng cũng có thể được sử dụng trong các kiểu dáng Android khác. Một ứng dụng mẫu đang chèn hiệu ứng cải thiện giọng nói vào đầu ra của bộ thu FM khi 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 thư viện nhà cung cấp triển khai và được liệt kê trong tệp cấu hình audio_effects.xml.
  • Hiệu ứng này phải thuộc kiểu xử lý trước hoặc xử lý hậu kỳ (gắn 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 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 phát hoặc ghi âm mở tại HAL âm thanh).

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

Bạn có thể tạo bản sao cho các 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 hiệu ứng âm thanh được đính kèm một cách có hệ thống và bật cho mọi đường dẫn âm thanh chọn một thiết bị đã chỉ định làm bồn lưu trữ dữ liệu 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ể trong 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 API hệ thống

Thêm một hàm khởi tạo @SystemApi mới vào lớp android.media.audiofx.AudioEffect để tạo và bật hiệu ứng thiết bị:

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

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

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

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ó chữ ký mới cho phương thức createEffect(), cho phép tạo hiệu ứng đính kèm vào một thiết bị:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • AudioSession được 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().

Audio HAL

Để hỗ trợ tính năng hiệu ứng thiết bị, HAL âm thanh phải triển khai tính năng 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.

2 phương thức API mới, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId), cho quy trình triển khai HAL (Lớp trừu tượng phần cứng) biết rằng hiệu ứng 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ã AudioPortHandle. Mã này được dùng khi tạo một bản vá âm thanh bằng phương thức IDevice::createAudioPatch().

API Audio HAL có thể được sử dụng trong quá trình triển khai nếu cần điều phối giữa âm thanh và hiệu ứng HAL khi một hiệu ứng được bật hoặc tắt.