Efek audio

Mulai Android 11, produsen perangkat memiliki kemampuan untuk secara otomatis melampirkan dan mengaktifkan efek audio tertentu saat perangkat audio tertentu dipilih untuk perekaman atau pemutaran audio. Salah satu peningkatan utama adalah efek audio yang disisipkan di jalur audio yang sepenuhnya diterapkan di bawah HAL audio (koneksi langsung antara perangkat input dan perangkat output) dapat dikontrol oleh framework efek audio.

Fitur ini terutama ditargetkan untuk OEM otomotif, tetapi juga dapat digunakan dalam faktor bentuk Android lainnya. Contoh aplikasi ini memasukkan efek peningkatan suara pada output penala FM saat terhubung langsung ke speaker melalui DSP audio.

Prasyarat

  • Seperti efek audio lainnya, efek harus diimplementasikan oleh library vendor dan dicantumkan dalam file konfigurasi audio_effects.xml.
  • Efek harus berupa prapemrosesan atau pascapemrosesan (tanda TYPE_PRE_PROC atau TYPE_POST_PROC ditetapkan di EffectDescriptor.flags).
  • Jika implementasi efek diakselerasi HW (tanda HW_ACC_TUNNEL ditetapkan di EffectDescriptor.flags), implementasi tersebut dapat dilampirkan ke jalur audio yang sepenuhnya terhubung di bawah HAL (tidak ada pemutaran atau streaming audio perekaman yang dibuka di HAL audio).

Membuat dan mengaktifkan efek perangkat

Efek audio khusus perangkat dapat dibuat instance-nya menggunakan salah satu dari dua metode di bawah.

Menggunakan file konfigurasi efek audio

Metode ini memungkinkan pembuatan efek audio statis yang secara sistematis dilampirkan dan diaktifkan ke jalur audio apa pun yang memilih perangkat yang ditentukan 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>
  

Menggunakan API sistem

Konstruktor @SystemApi baru telah ditambahkan ke class android.media.audiofx.AudioEffect untuk membuat dan mengaktifkan efek perangkat:

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

Setelah dibuat dengan menentukan ID efek audio unik dan deskriptor perangkat audio, efek dapat diaktifkan atau dinonaktifkan dengan AudioEffect API yang ada.

API juga tersedia untuk mengkueri apakah implementasi mendukung kombinasi perangkat/efek tertentu.

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

HAL API baru

HAL efek audio

Efek audio HAL V6.0 memiliki tanda tangan baru untuk metode createEffect() yang memungkinkan pembuatan efek yang dilampirkan ke perangkat:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • AudioSession yang ditentukan harus AudioSessionConsts.DEVICE.
  • AudioIoHandle diabaikan jika session adalah AudioSessionConsts.DEVICE.
  • device diidentifikasi oleh AudioPortHandle uniknya yang ditetapkan oleh framework audio saat perangkat dipilih di HAL audio dengan metode IDevice::createAudioPatch().

HAL Audio

Untuk mendukung fitur efek perangkat, HAL audio harus mengimplementasikan kontrol perutean audio menggunakan IDevice::createAudioPatch() API. 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 di 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 koordinasi diperlukan antara HAL audio dan efek saat efek diaktifkan atau dinonaktifkan.