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.xml
pliku konfiguracyjnym. - Efekt musi być typu preprocessing lub postprocessing (flaga
TYPE_PRE_PROC
lubTYPE_POST_PROC
ustawiona wEffectDescriptor.flags
). - Jeśli implementacja efektu jest akcelerowana sprzętowo (flaga
HW_ACC_TUNNEL
ustawiona 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ść
AudioSession
musi być równaAudioSessionConsts.DEVICE
. - Wartość
AudioIoHandle
jest ignorowana, jeśli wartośćsession
toAudioSessionConsts.DEVICE
. device
jest identyfikowany przez unikalnyAudioPortHandle
przypisany 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.