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 sedang memasukkan efek peningkatan suara pada penala FM output 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 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, Anda dapat mengaktifkan atau menonaktifkannya dengan AudioEffect API yang sudah 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() memungkinkan pembuatan efek yang terpasang 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 menerapkan kontrol pemilihan rute audio menggunakan IDevice::createAudioPatch() API. Hal ini ditunjukkan oleh Metode IDevice::supportsAudioPatches() 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 dengan 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.