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. En büyük gelişmelerden biri de ses efektlerinin, tamamen ses HAL'nin altında uygulanan bir ses yolunda (bir giriş arasındaki doğrudan bağlantı cihaz ve çıkış cihazı) ses efektleri çerçevesi ile kontrol edilebilir.

Bu özellik, öncelikli olarak otomotiv OEM'leri hedeflemektedir ancak diğer Android cihazlarda da kullanılabilir. olabilir. Ö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 tedarikçinin kitaplığı tarafından uygulanmalı ve listelenmelidir. audio_effects.xml yapılandırma dosyasında mevcuttur.
  • Efekt, ön işleme veya son işleme türünde olmalıdır (TYPE_PRE_PROC veya TYPE_POST_PROC'ı işaretleyin EffectDescriptor.flags içinde ayarlandı).
  • Efekt uygulaması HW hızlandırılmışsa (HW_ACC_TUNNEL işareti EffectDescriptor.flags içinde ayarlandı), tamamen HAL'nin altında bağlı bir ses yoluna eklenebilir (çalma yok veya ses HAL'sinde açılmış olan ses akışını yakalamayı deneyin).

Cihaz efekti oluşturup etkinleştirme

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

Ses efektleri yapılandırma dosyası kullanma

Bu yöntem, belirli bir cihazı alıcı veya kaynak olarak seçerek herhangi bir ses yoluna sistematik olarak eklenip 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 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'leriyle etkinleştirilebilir veya devre dışı bırakılabilir.

Uygulamanın belirli bir cihaz/efekt kombinasyonunu destekleyip desteklemediğini sorgulamak için de bir 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, bir cihaza bağlı bir efekt oluşturmaya olanak tanıyan createEffect() yöntemi için yeni bir imzaya sahiptir:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • Belirtilen AudioSession, AudioSessionConsts.DEVICE olmalıdır.
  • session değeri şuysa AudioIoHandle yoksayılır: AudioSessionConsts.DEVICE.
  • device, cihaz ses HAL'inde IDevice::createAudioPatch() yöntemiyle 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 true raporluyor.

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

Cihaz, ses çaldığında kullanılan AudioPortHandle kimliğiyle tanımlanır. yama, IDevice::createAudioPatch() yöntemiyle oluşturulur.

Bir efekt etkinleştirildiğinde veya devre dışı bırakıldığında ses ve efekt HAL'leri.