Od Androida 11 producenci urządzeń mogą automatycznie dołączać i włączać określone efekty dźwiękowe, gdy wybrane urządzenie audio jest używane do przechwytywania lub odtwarzania dźwięku. Jedną z głównych zmian jest to, że efektami dźwiękowymi wstawianymi na ścieżce audio implementowanej całkowicie poniżej interfejsu HAL (bezpośrednie połączenie między urządzeniem wejściowym a wyjściowym) można sterować za pomocą ramki efektów dźwiękowych.
Ta funkcja jest przeznaczona głównie dla producentów OEM w branży motoryzacyjnej, ale może być też używana w przypadku innych formułek Androida. Przykładowa aplikacja wstawia efekt wzmocnienia głosu na wyjściu tunera FM, gdy jest bezpośrednio połączona z głośnikiem przez DSP audio.
Wymagania wstępne
- Podobnie jak w przypadku innych efektów dźwiękowych, efekt ten musi być zaimplementowany przez bibliotekę dostawcy i wymieniony w pliku konfiguracji
audio_effects.xml
. - Efekt musi być typu wstępna obróbka lub obróbka końcowa (flaga
TYPE_PRE_PROC
lubTYPE_POST_PROC
ustawiona wEffectDescriptor.flags
). - Jeśli implementacja efektu jest przyspieszona sprzętowo (flaga
HW_ACC_TUNNEL
jest ustawiona wEffectDescriptor.flags
), można ją dołączyć do ścieżki audio całkowicie połączonej poniżej HAL (bez odtwarzania lub przechwytywania strumienia audio otwartego w HAL audio).
Tworzenie i włączanie efektu urządzenia
Efekty dźwiękowe dla poszczególnych urządzeń można utworzyć za pomocą jednej z tych 2 metod.
Używanie pliku konfiguracji efektów dźwiękowych
Ta metoda umożliwia tworzenie statycznych efektów dźwiękowych, które są systematycznie dołączane i włączane do dowolnej ścieżki audio, wybierając określone urządzenie jako odbiornik lub źródło.
Aby to zrobić, dodaj w pliku audio_effects.xml
odpowiednią sekcję w ten sposób:
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
Korzystanie z interfejsu API systemu
Do klasy
android.media.audiofx.AudioEffect
dodano nowy konstruktor @SystemApi, który umożliwia tworzenie i włączanie efektu urządzenia:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Po utworzeniu efektu przez określenie unikalnego identyfikatora efektu audio i deskryptora urządzenia audio można go włączyć lub wyłączyć za pomocą istniejących interfejsów API AudioEffect.
Interfejs API umożliwia też sprawdzenie, czy implementacja obsługuje daną kombinację urządzenia i efektu.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Nowe interfejsy API HAL
Interfejs HAL efektów dźwiękowych
Interfejs HAL efektów dźwiękowych w wersji 6.0 ma nowy podpis dla metody createEffect()
, która umożliwia tworzenie efektów dołączonych do urządzenia:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- Wskazany parametr
AudioSession
musi byćAudioSessionConsts.DEVICE
. - Wartość
AudioIoHandle
jest ignorowana, jeśli wartośćsession
toAudioSessionConsts.DEVICE
. - Identyfikator
device
jest identyfikowany przez unikalny elementAudioPortHandle
przypisany przez platformę audio, gdy urządzenie jest wybierane w panelu HAL audio za pomocą metodyIDevice::createAudioPatch()
.
Interfejs HAL dźwięku
Aby obsługiwać funkcję efektów urządzenia, interfejs HAL audio musi mieć zaimplementowaną kontrolę kierowania dźwięku za pomocą interfejsu API IDevice::createAudioPatch()
. Jest to wskazane w raportach dotyczących metody IDevice::supportsAudioPatches()
true
.
Dwie nowe metody interfejsu API IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
i IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
informują implementację HAL o włączeniu lub wyłączeniu efektu urządzenia na danym urządzeniu.
Urządzenie jest identyfikowane za pomocą identyfikatora AudioPortHandle
, który jest używany podczas tworzenia łatki audio za pomocą metody IDevice::createAudioPatch()
.
Interfejsów API audio HAL można używać w implementacji, jeśli przy włączonym lub wyłączonym efektach potrzebna jest koordynacja między interfejsami HAL audio i efektów.