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 cụ thể được đã chọn để ghi hoặc phát âm thanh. Một cải tiến lớn là hiệu ứng âm thanh được chèn trên đườ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 một đầu vào và thiết bị đầu ra) đều 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 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 thiết bị Android khác kiểu dáng thiết bị. Một ứng dụng mẫu đang chèn hiệu ứng làm rõ giọng nói trên bộ dò 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

  • Tương tự như 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 phải thuộc loại xử lý trước hoặc hậu xử lý (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 HW (gắn cờ HW_ACC_TUNNEL được đặt trong EffectDescriptor.flags), thiết bị có thể được gắn 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 phát hoặc ghi lại luồng âm thanh mở ở HAL âm thanh).

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

Bạn có thể tạo thực thể cho hiệu ứng âm thanh theo 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 bất kỳ đường dẫn âm thanh nào khi chọn một thiết bị được 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 audio_effects.xml tệp như sau:

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

Sử dụng API hệ thống

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 thiết bị:

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

Sau khi hiệu ứng được tạo bằng cách chỉ định mã hiệu ứng âm thanh duy nhất và mã mô tả thiết bị âm thanh, bạn có thể bật hoặc tắt tính năng này với 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 (Lớp trừu tượng phần cứng) cho hiệu ứng âm thanh

Hiệu ứng âm thanh HAL V6.0 có một 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 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 ở HAL âm thanh bằng phương pháp IDevice::createAudioPatch().

Lớp trừu tượng phần cứng (HAL) cho âm thanh

Để hỗ trợ tính năng hiệu ứng thiết bị, lớp trừu tượng phần cứng (HAL) âm thanh phải triển khai chế độ định tuyến âm thanh bằng API IDevice::createAudioPatch(). Điều này được biểu thị bằng IDevice::supportsAudioPatches() phương thức 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 quy trình triển khai HAL biết rằng hiệu ứng thiết bị đã được bật hoặc tắt một thiết bị cụ thể.

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

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