Efek audio

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 atau TYPE_POST_PROC diatur dalam EffectDescriptor.flags ).
  • Jika implementasi efeknya dipercepat HW (tandai HW_ACC_TUNNEL diatur dalam EffectDescriptor.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 harus AudioSessionConsts.DEVICE .
  • AudioIoHandle diabaikan jika session adalah AudioSessionConsts.DEVICE .
  • device diidentifikasi berdasarkan AudioPortHandle unik yang ditetapkan oleh kerangka audio saat perangkat dipilih di HAL audio dengan metode IDevice::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.