Ses efektleri

Android 11'den itibaren cihaz üreticileri, ses kaydı veya oynatma için belirli bir ses cihazı seçildiğinde belirli ses efektlerini otomatik olarak ekleyip etkinleştirebilir. Önemli iyileştirmelerden biri, tamamen ses HAL'nin (giriş cihazı ile çıkış cihazı arasındaki doğrudan bağlantı) altındaki ses yoluna eklenen ses efektlerinin ses efektleri çerçevesi ile kontrol edilebilmesidir.

Bu özellik öncelikle otomotiv OEM'leri hedef alsa da diğer Android form faktörlerinde de kullanılabilir. Örneğin, ses DSP'si üzerinden doğrudan hoparlöre bağlıyken FM tuner çıkışına ses geliştirme efekti ekleyen bir uygulama.

Ön koşullar

  • Diğer ses efektlerinde olduğu gibi, efekt bir tedarikçi kitaplığı tarafından uygulanmalı ve audio_effects.xml yapılandırma dosyasında listelenmelidir.
  • Etki, ön işleme veya son işleme türünde olmalıdır (EffectDescriptor.flags içinde TYPE_PRE_PROC veya TYPE_POST_PROC işareti ayarlanmalıdır).
  • Efekt uygulaması HW hızlandırılmışsa (EffectDescriptor.flags içinde HW_ACC_TUNNEL işareti ayarlandı) tamamen HAL'nin altına bağlı bir ses yoluna eklenebilir (ses HAL'de oynatma veya yakalama işlemi yapılmaz).

Cihaz efekti oluşturma ve etkinleştirme

Cihaza özgü ses efektleri, aşağıdaki iki yöntemden biri kullanılarak örneklendirilebilir.

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 statik bir ses efekti oluşturulmasına olanak tanır.

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

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

Sistem API'si kullanma

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

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

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

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

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

Yeni HAL API'leri

Ses efekti HAL'si

Ses efekti HAL V6.0, createEffect() yöntemi için yeni bir imzaya sahip. Bu imza, cihaza ekli bir efekt oluşturulmasına olanak tanıyor:

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

Ses HAL'si

Cihaz efekti özelliğini desteklemek için ses HAL'inin IDevice::createAudioPatch() API'yi kullanarak ses yönlendirme kontrolünü uygulaması gerekir. Bu, IDevice::supportsAudioPatches() yöntemi raporlama true ile gösterilir.

IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) ve IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) adlı iki yeni API yöntemi, 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 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 uygulama tarafından ses HAL API'leri kullanılabilir.