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 ekleyip etkinleştirebilir. Önemli bir iyileştirme, tamamen ses HAL'ının altında uygulanan bir ses yoluna (giriş cihazı ile çıkış cihazı arasında doğrudan bağlantı) eklenen ses efektlerinin ses efektleri çerçevesi tarafından kontrol edilebilmesidir.

Bu özellik öncelikli olarak otomotiv OEM'lerini hedeflese de diğer Android form faktörlerinde de kullanılabilir. Örneğin, bir uygulama, ses DSP'si aracılığıyla doğrudan hoparlöre bağlandığında FM radyo çıkışına ses geliştirme efekti ekleyebilir.

Ön koşullar

  • Diğer tüm ses efektlerinde olduğu gibi, bu efekt de bir tedarikçi kitaplığı tarafından uygulanmalı ve audio_effects.xml yapılandırma dosyasında listelenmelidir.
  • Efekt, ö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 ayarlanmış olmalıdır).
  • Efekt uygulaması donanım hızlandırmalıysa (EffectDescriptor.flags içinde HW_ACC_TUNNEL işareti ayarlanmışsa), HAL'ın tamamen altında bağlı bir ses yoluna eklenebilir (ses HAL'ında açılan oynatma veya yakalama ses akışı yok).

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, belirtilen bir cihazı hedef veya kaynak olarak seçen herhangi bir ses yoluna sistematik olarak eklenen ve etkinleştirilen bir ses efektinin statik olarak oluşturulmasına olanak tanır.

Bu işlem, 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>
  

Sistem API'si kullanma

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

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

Benzersiz ses efekti kimliği ve ses cihazı tanımlayıcısı belirtilerek efekt 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 de bir API mevcuttur.

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

Yeni HAL API'leri

Ses efekti HAL

Ses efekti HAL V6.0, createEffect() yöntemi için yeni bir imzaya sahiptir. Bu imza, cihaza bağlı bir efekt oluşturulmasına olanak tanır:

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'ında seçildiğinde ses çerçevesi tarafından atanan benzersiz AudioPortHandle ile tanımlanır.

Ses HAL

Cihaz efekti özelliğini desteklemek için ses HAL'inin IDevice::createAudioPatch() API'sini kullanarak ses yönlendirme kontrolünü uygulaması gerekir. Bu durum, IDevice::supportsAudioPatches() yönteminin true raporlamasıyla 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 cihaz efektinin etkinleştirildiğini veya devre dışı bırakıldığını bildirir.

Cihaz, AudioPortHandle kimliğiyle tanımlanır. Bu kimlik, IDevice::createAudioPatch() yöntemiyle ses yaması oluşturulurken kullanılır.

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