Ses efektleri

Android 11'den itibaren cihaz üreticileri, ses yakalama veya oynatma için belirli bir ses cihazı seçildiğinde belirli ses efektlerini otomatik olarak ekleme ve etkinleştirme olanağına sahiptir. Önemli bir gelişme, tamamen ses HAL'inin (bir giriş cihazı ile bir çıkış cihazı arasındaki doğrudan bağlantı) altında uygulanan bir ses yoluna eklenen ses efektlerinin, ses efektleri çerçevesi tarafından kontrol edilebilmesidir.

Bu özellik öncelikli olarak otomotiv OEM'lerine yöneliktir ancak diğer Android form faktörlerinde de kullanılabilir. Örnek bir uygulama, ses DSP'si yoluyla doğrudan hoparlöre bağlandığında FM tuner çıkışına bir ses geliştirme efekti eklemektir.

Önkoşullar

  • Diğer ses efektlerinde olduğu gibi, efektin de bir satıcı kitaplığı tarafından uygulanması ve audio_effects.xml yapılandırma dosyasında listelenmesi gerekir.
  • Efekt, ön işleme veya son işleme türünde olmalıdır ( TYPE_PRE_PROC veya TYPE_POST_PROC işareti, EffectDescriptor.flags dosyasında ayarlanmıştır).
  • Efekt uygulaması HW hızlandırılmışsa ( HW_ACC_TUNNEL bayrağı EffectDescriptor.flags içinde ayarlanmışsa), tamamen HAL'nin altına bağlı bir ses yoluna eklenebilir (ses HAL'inde oynatma veya yakalama ses akışı açılmaz).

Cihaz efekti oluşturma ve etkinleştirme

Cihaza özel ses efektleri aşağıdaki iki yöntemden biri kullanılarak oluşturulabilir.

Ses efektleri yapılandırma dosyası kullanma

Bu yöntem, belirli bir cihazı havuz veya kaynak olarak seçen herhangi bir ses yoluna sistematik olarak eklenen ve etkinleştirilen bir ses efektinin statik oluşturulmasına olanak tanır.

Bu, audio_effects.xml dosyasına aşağıdaki gibi belirli bir bölüm eklenerek yapılır:

<deviceEffects>
<devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom">
      	<apply effect="agc"/>
      </devicePort>
  </deviceEffects>
  

Bir sistem API'si kullanın

Bir cihaz efekti oluşturmak ve etkinleştirmek için android.media.audiofx.AudioEffect sınıfına yeni bir @SystemApi yapıcısı eklendi:

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

Efekt, benzersiz ses efekti kimliği ve ses cihazı tanımlayıcısı belirtilerek oluşturulduktan sonra mevcut AudioEffect API'leri ile etkinleştirilebilir veya devre dışı bırakılabilir.

Bir uygulamanın belirli bir cihaz/efekt kombinasyonunu destekleyip desteklemediğini sorgulamak için bir API de mevcuttur.

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

Yeni HAL API'leri

Ses efekti HAL

HAL V6.0 ses efekti createEffect() yöntemi için bir aygıta eklenen bir efektin oluşturulmasına olanak tanıyan yeni bir imzaya sahiptir:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • Belirtilen AudioSession AudioSessionConsts.DEVICE olmalıdır.
  • session AudioSessionConsts.DEVICE ise AudioIoHandle yoksayılır.
  • device , ses HAL'sinde IDevice::createAudioPatch() yöntemiyle seçildiğinde, ses çerçevesi tarafından atanan benzersiz AudioPortHandle ile tanımlanır.

Ses HAL'i

Cihaz efekti özelliğini desteklemek için ses HAL'nin, IDevice::createAudioPatch() API'sini kullanarak ses yönlendirme kontrolünü uygulaması gerekir. Bu, true raporlayan IDevice::supportsAudioPatches() yöntemiyle gösterilir.

İki yeni API yöntemi, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) ve IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) HAL uygulamasına belirli bir cihazda bir cihaz efektinin etkinleştirildiğini veya devre dışı bırakıldığını bildirir.

Cihaz, IDevice::createAudioPatch() yöntemiyle bir ses yaması oluşturulduğunda kullanılan AudioPortHandle kimliğiyle tanımlanır.

Bir efekt etkinleştirildiğinde veya devre dışı bırakıldığında ses ve efekt HAL'leri arasında koordinasyon gerekiyorsa, Ses HAL API'leri bir uygulama tarafından kullanılabilir.