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 önemli iyileştirmelerden biri, ses HAL'inin (giriş cihazı ile çıkış cihazı arasındaki doğrudan bağlantı) altında tamamen uygulanan bir ses yoluna eklenen ses efektlerinin ses efektleri çerçevesi tarafından 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ğlandığında 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. - Efekt, ön işleme veya son işleme türünde olmalıdır (
EffectDescriptor.flags
içindeTYPE_PRE_PROC
veyaTYPE_POST_PROC
işareti ayarlanmalıdır). - Etki uygulaması donanım hızlandırmalıysa (
EffectDescriptor.flags
içindeHW_ACC_TUNNEL
işareti ayarlanmışsa) tamamen HAL'in altında bağlı bir ses yoluna eklenebilir (ses HAL'inde oynatma veya yakalama ses akışı açılmaz).
Cihaz efekti oluşturma ve etkinleştirme
Cihaza özgü ses efektleri, aşağıdaki iki yöntemden biri kullanılarak örneklendirilebilir.
Ses efekti 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'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
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ğeriAudioSessionConsts.DEVICE
iseAudioIoHandle
yoksayılır.device
, cihazIDevice::createAudioPatch()
yöntemiyle ses HAL'inde seçildiğinde ses çerçevesi tarafından atanan benzersizAudioPortHandle
ile tanımlanır.
Ses HAL'i
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şturulurken 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.