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 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 hậu xử lý
(gắn 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 mở tại HAL âm thanh).
Tạo và bật hiệu ứng 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
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 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
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 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ị, 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 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.