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
veyaTYPE_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
iseAudioIoHandle
yoksayılır. -
device
, ses HAL'sindeIDevice::createAudioPatch()
yöntemiyle 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'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.