Od Androida 11 producenci urządzeń mogą automatycznie dołączać i włączać określone efekty dźwiękowe, gdy do przechwytywania lub odtwarzania dźwięku zostanie wybrane dane urządzenie audio. Jednym z głównych ulepszeń jest to, że efekty dźwiękowe wstawione na ścieżce audio w całości zaimplementowanej poniżej HAL audio (bezpośrednie połączenie między urządzeniem wejściowym a wyjściowym) mogą być sterowane przez framework efektów dźwiękowych.
Ta funkcja jest przeznaczona głównie dla producentów samochodów, ale można jej też używać w innych urządzeniach z Androidem. Przykładowa aplikacja wstawia efekt wzmocnienia głosu na wyjściu tunera FM, gdy jest on bezpośrednio połączony z głośnikiem przez DSP audio.
Wymagania wstępne
- Podobnie jak w przypadku innych efektów dźwiękowych, efekt musi być zaimplementowany przez bibliotekę dostawcy i wymieniony w pliku konfiguracyjnym
audio_effects.xml. - Efekt musi być typu przetwarzanie wstępne lub przetwarzanie końcowe (flaga
TYPE_PRE_PROClubTYPE_POST_PROCustawiona wEffectDescriptor.flags). - Jeśli implementacja efektu jest przyspieszana przez sprzęt (flaga
HW_ACC_TUNNELustawiona wEffectDescriptor.flags), można ją dołączyć do ścieżki audio w całości połączonej poniżej HAL (bez strumienia audio odtwarzania lub przechwytywania otwartego w HAL audio).
Tworzenie i włączanie efektu urządzenia
Efekty dźwiękowe specyficzne dla urządzenia można tworzyć za pomocą jednej z 2 metod opisanych poniżej.
Używanie pliku konfiguracyjnego efektów dźwiękowych
Ta metoda umożliwia statyczne tworzenie efektu dźwiękowego, który jest systematycznie dołączany i włączany na każdej ścieżce audio, która wybiera określone urządzenie jako ujście lub źródło.
W tym celu dodaj do pliku audio_effects.xml tę sekcję:
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
Używanie interfejsu API systemu
Do klasy
android.media.audiofx.AudioEffect dodaliśmy 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 dźwiękowego i deskryptora urządzenia audio można go włączać i wyłączać za pomocą istniejących interfejsów AudioEffect API.
Dostępny jest też interfejs API, który umożliwia sprawdzenie, czy implementacja obsługuje daną kombinację urządzenia i efektu.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Nowe interfejsy HAL API
HAL efektów dźwiękowych
HAL efektów dźwiękowych w wersji 6.0 ma nowy podpis metody createEffect(), który umożliwia tworzenie efektu dołączonego do urządzenia:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- Określona wartość
AudioSessionmusi być równaAudioSessionConsts.DEVICE. - Jeśli
sessionma wartośćAudioSessionConsts.DEVICE, parametrAudioIoHandlejest ignorowany. devicejest identyfikowane przez unikalny identyfikatorAudioPortHandleprzypisany przez framework audio, gdy urządzenie jest wybierane w HAL audio za pomocą metodyIDevice::createAudioPatch().
HAL audio
Aby obsługiwać funkcję efektu urządzenia, HAL audio musi implementować sterowanie routingiem audio za pomocą interfejsu IDevice::createAudioPatch() API. Wskazuje na to metoda IDevice::supportsAudioPatches() zwracająca wartość true.
2 nowe metody API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) i IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId), informują implementację HAL, że na danym urządzeniu włączono lub wyłączono efekt urządzenia.
Urządzenie jest identyfikowane przez identyfikator AudioPortHandle, który jest używany podczas tworzenia ścieżki audio za pomocą metody IDevice::createAudioPatch().
Interfejsy Audio HAL API mogą być używane przez implementację, jeśli podczas włączania lub wyłączania efektu wymagana jest koordynacja między HAL audio a HAL efektów.