Android 11'den itibaren cihaz üreticileri, ses yakalama veya oynatma için belirli bir ses sistemi seçildiğinde belirli ses efektlerini otomatik olarak ekleyip etkinleştirebilir. Önemli bir iyileştirme olarak, tamamen ses HAL'ının altında uygulanan bir ses yoluna (giriş cihazı ile çıkış cihazı arasında doğrudan bağlantı) eklenen ses efektleri, ses efektleri çerçevesi tarafından kontrol edilebilir.
Bu özellik öncelikli olarak otomotiv OEM'lerini hedeflese de diğer Android form faktörlerinde de kullanılabilir. Örnek bir uygulama, ses DSP'si aracılığıyla doğrudan hoparlöre bağlandığında FM radyo çıkışına ses geliştirme efekti ekliyor.
Ö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
(
TYPE_PRE_PROCveyaTYPE_POST_PROCişaretiEffectDescriptor.flagsiçinde ayarlanı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 yayını 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 sistemi 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
HAL ses efekti
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, IDevice::supportsAudioPatches() yöntem raporlaması true ile 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.