Mulai Android 11, produsen perangkat memiliki kemampuan untuk secara otomatis melampirkan dan mengaktifkan efek audio tertentu ketika perangkat audio tertentu dipilih untuk pengambilan atau pemutaran audio. Salah satu peningkatan besar adalah efek audio yang disisipkan pada jalur audio yang seluruhnya diterapkan di bawah audio HAL (koneksi langsung antara perangkat input dan perangkat output) dapat dikontrol oleh kerangka efek audio.
Fitur ini terutama ditargetkan pada OEM otomotif namun juga dapat digunakan pada faktor bentuk Android lainnya. Contoh aplikasinya adalah memasukkan efek peningkatan suara pada output tuner FM saat terhubung langsung ke speaker melalui DSP audio.
Prasyarat
- Seperti halnya efek audio lainnya, efek tersebut harus diterapkan oleh pustaka vendor dan dicantumkan dalam file konfigurasi
audio_effects.xml
. - Efeknya harus bertipe preprocessing atau postprocessing (flag
TYPE_PRE_PROC
atauTYPE_POST_PROC
diatur dalamEffectDescriptor.flags
). - Jika implementasi efeknya dipercepat HW (tandai
HW_ACC_TUNNEL
diatur dalamEffectDescriptor.flags
), itu dapat dilampirkan ke jalur audio yang seluruhnya terhubung di bawah HAL (tidak ada pemutaran atau pengambilan aliran audio yang dibuka di audio HAL).
Membuat dan mengaktifkan efek perangkat
Efek audio khusus perangkat dapat dibuat menggunakan salah satu dari dua metode di bawah.
Gunakan file konfigurasi efek audio
Metode ini memungkinkan pembuatan efek audio statis yang dipasang dan diaktifkan secara sistematis ke jalur audio mana pun yang memilih perangkat tertentu sebagai sink atau sumber.
Hal ini dilakukan dengan menambahkan bagian tertentu dalam file audio_effects.xml
sebagai berikut:
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
Gunakan API sistem
Konstruktor @SystemApi baru telah ditambahkan ke kelas android.media.audiofx.AudioEffect
untuk membuat dan mengaktifkan efek perangkat:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Setelah efek dibuat dengan menentukan ID efek audio unik dan deskriptor perangkat audio, efek tersebut dapat diaktifkan atau dinonaktifkan dengan API AudioEffect yang ada.
API juga tersedia untuk menanyakan apakah implementasi mendukung kombinasi perangkat/efek tertentu.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
API HAL baru
Efek audio HAL
Efek audio HAL V6.0 memiliki tanda tangan baru untuk metode createEffect()
yang memungkinkan pembuatan efek yang terpasang pada perangkat:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
-
AudioSession
yang ditentukan harusAudioSessionConsts.DEVICE
. -
AudioIoHandle
diabaikan jikasession
adalahAudioSessionConsts.DEVICE
. -
device
diidentifikasi berdasarkanAudioPortHandle
unik yang ditetapkan oleh kerangka audio saat perangkat dipilih di HAL audio dengan metodeIDevice::createAudioPatch()
.
Audio HAL
Untuk mendukung fitur efek perangkat, audio HAL harus mengimplementasikan kontrol perutean audio menggunakan API IDevice::createAudioPatch()
. Hal ini ditunjukkan oleh metode IDevice::supportsAudioPatches()
yang melaporkan true
.
Dua metode API baru, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
dan IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
memberi tahu implementasi HAL bahwa efek perangkat telah diaktifkan atau dinonaktifkan pada perangkat tertentu.
Perangkat diidentifikasi berdasarkan ID AudioPortHandle
-nya, yang digunakan saat patch audio dibuat dengan metode IDevice::createAudioPatch()
.
Audio HAL API dapat digunakan oleh implementasi jika diperlukan koordinasi antara audio dan HAL efek saat efek diaktifkan atau dinonaktifkan.