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.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 ayarlanmış olmalıdır). - Efekt uygulaması donanım hızlandırmalıysa (
EffectDescriptor.flags
içindeHW_ACC_TUNNEL
iş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.DEVICE
olmalıdır. session
değeriAudioSessionConsts.DEVICE
iseAudioIoHandle
yoksayılır.device
, cihazIDevice::createAudioPatch()
yöntemiyle ses HAL'ında seçildiğinde ses çerçevesi tarafından atanan benzersizAudioPortHandle
ile 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.