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ặcTYPE_POST_PROC
được đặt trongEffectDescriptor.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 trongEffectDescriptor.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ế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 ở HAL âm thanh bằng phương phápIDevice::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)
và
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.