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 chọn một thiết bị âm thanh nhất định để 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 đườ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 phải thuộc loại xử lý trước hoặc xử lý sau (cờ
TYPE_PRE_PROC
hoặcTYPE_POST_PROC
được đặt trongEffectDescriptor.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 trongEffectDescriptor.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 thanh 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 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 hiệu ứng âm thanh tĩnh được đính kèm và bậ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 bồn lưu trữ 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ể sử dụng API để truy vấn xem một phương thức 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ó 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ếusession
làAudioSessionConsts.DEVICE
.device
được xác định bằngAudioPortHandle
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ứcIDevice::createAudioPatch()
.
Audio HAL
Để hỗ trợ tính năng hiệu ứng thiết bị, HAL âm thanh phải triển khai chức năng đ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)
và IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
cho biết việc triển khai HAL rằng một 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.