Od Androida 11 producenci urządzeń mają możliwość automatycznego dołączania i włączania określonych efektów dźwiękowych, gdy dane urządzenie audio jest wybrane do przechwytywania lub odtwarzania dźwięku. Jednym z głównych ulepszeń jest to, że efektami dźwiękowymi wstawionymi na ścieżce audio w całości zaimplementowanej poniżej warstwy HAL audio (bezpośrednie połączenie między urządzeniem wejściowym a wyjściowym) można sterować za pomocą platformy efektów dźwiękowych.
Ta funkcja jest przeznaczona głównie dla producentów OEM z branży motoryzacyjnej, ale można jej używać także w przypadku innych urządzeń z Androidem. Przykładowa aplikacja wstawia efekt wzmocnienia głosu na wyjściu tunera FM, gdy jest bezpośrednio połączona z głośnikiem przez procesor DSP audio.
Wymagania wstępne
- Podobnie jak w przypadku innych efektów audio, efekt musi być zaimplementowany przez bibliotekę dostawcy i wymieniony w
audio_effects.xmlpliku konfiguracyjnym. - Efekt musi być typu preprocessing lub postprocessing (flaga
TYPE_PRE_PROClubTYPE_POST_PROCustawiona wEffectDescriptor.flags). - Jeśli implementacja efektu jest akcelerowana sprzętowo (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 otwartego strumienia audio odtwarzania lub przechwytywania w HAL audio).
Tworzenie i włączanie efektu na urządzeniu
Efekty dźwiękowe specyficzne dla urządzenia można utworzyć za pomocą jednej z tych 2 metod.
Używanie pliku konfiguracji efektów audio
Ta metoda umożliwia statyczne tworzenie efektu audio, który jest systematycznie dołączany i włączany na dowolnej ścieżce audio, która wybiera określone urządzenie jako odbiornik lub źródło.
W tym celu dodaj w pliku audio_effects.xml
odpowiednią 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 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 podanie unikalnego identyfikatora efektu audio i deskryptora urządzenia audio można go włączyć lub wyłączyć 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 API HAL
Warstwa HAL efektów audio
Interfejs HAL efektu audio w wersji 6.0 ma nowy podpis metody createEffect(), która umożliwia tworzenie efektu dołączonego do urządzenia:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- Podana wartość
AudioSessionmusi być równaAudioSessionConsts.DEVICE. - Wartość
AudioIoHandlejest ignorowana, jeśli wartośćsessiontoAudioSessionConsts.DEVICE. devicejest identyfikowany przez unikalnyAudioPortHandleprzypisany przez platformę audio, gdy urządzenie jest wybierane w warstwie HAL audio za pomocą metodyIDevice::createAudioPatch().
HAL dźwięku
Aby obsługiwać funkcję efektu urządzenia, warstwa HAL audio musi implementować sterowanie routowaniem dźwięku za pomocą interfejsu IDevice::createAudioPatch() API. Wskazuje na to metoda IDevice::supportsAudioPatches(), która raportuje true.
Dwie nowe metody interfejsu API,
IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) i
IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
informują implementację HAL, że efekt urządzenia został włączony lub wyłączony na danym urządzeniu.
Urządzenie jest identyfikowane za pomocą identyfikatora AudioPortHandle, który jest używany podczas tworzenia poprawki audio za pomocą metody IDevice::createAudioPatch().
Implementacja może korzystać z interfejsów API HAL audio, jeśli podczas włączania lub wyłączania efektu wymagana jest koordynacja między interfejsami HAL audio i efektów.