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.xmlyapılandırma dosyasında listelenmelidir. - Efekt, ön işleme veya son işleme türünde olmalıdır
(
EffectDescriptor.flagsiçindeTYPE_PRE_PROCveyaTYPE_POST_PROCişareti ayarlanmış olmalıdır). - Efekt uygulaması donanım hızlandırmalıysa (
EffectDescriptor.flagsiçindeHW_ACC_TUNNELiş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.DEVICEolmalıdır. sessiondeğeriAudioSessionConsts.DEVICEiseAudioIoHandleyoksayılır.device, cihazIDevice::createAudioPatch()yöntemiyle ses HAL'ında seçildiğinde ses çerçevesi tarafından atanan benzersizAudioPortHandleile 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.