Hiệu ứng âm thanh

Bắt đầu từ Android 11, các nhà sản xuất thiết bị có khả năng tự động đính kèm và kích hoạ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 lại âm thanh. Một cải tiến lớn là các hiệu ứng âm thanh được chèn trên đườ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 kiểm soát bởi 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 sử dụng trong các hệ số dạng Android khác. 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 bộ dò sóng 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 bất kỳ hiệu ứng âm thanh nào khác, hiệu ứng phải được thư viện của 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 phải thuộc loại tiền xử lý hoặc xử lý hậu kỳ (cờ TYPE_PRE_PROC hoặc TYPE_POST_PROC được đặt trong EffectDescriptor.flags ).
  • Nếu quá trình triển khai hiệu ứng được tăng tốc CTNH (cờ HW_ACC_TUNNEL được đặt trong EffectDescriptor.flags ), hiệu ứng đó có thể được gắn vào đườ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 lại hoặc ghi lại nào được mở ở HAL âm thanh).

Tạo và kích hoạ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 pháp bên dưới.

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

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

Điều này được thực hiện 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 API hệ thống

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

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

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

API cũng có sẵn để truy vấn xem việc triển khai có hỗ trợ kế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

Hiệu ứng âm thanh HAL

Hiệu ứng âm thanh HAL V6.0 có chữ ký mới cho phương thức createEffect() cho phép tạo hiệu ứng gắn liền với thiết bị:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • AudioSession được chỉ định phải là AudioSessionConsts.DEVICE .
  • AudioIoHandle 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() .

Âm thanh HAL

Để hỗ trợ tính năng hiệu ứng thiết bị, HAL âm thanh phải triển khai điều khiển định tuyến âm thanh bằ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 quá trình triển khai HAL 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 ID AudioPortHandle , được sử dụng khi bản vá âm thanh được tạo bằng phương thức IDevice::createAudioPatch() .

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