W Androidzie 9 wprowadzono interfejs HAL sterowania dźwiękiem, aby obsługiwać przypadki użycia dźwięku w samochodach. Od Androida 14 interfejs HAL sterowania dźwiękiem obsługuje:
- Zmiana i wyważenie
- Prośba o aktywność audio HAL
- Wyciszanie i wyciszanie dźwięku na urządzeniu
- Zmiany wzmocnienia urządzenia audio
- Zmiany w konfiguracji portu audio
Rysunek 1 przedstawia ogólny zarys architektury usługi audio w samochodzie, w której usługa ta komunikuje się z interfejsem audio HAL.
Rysunek 1. Skonfiguruj dźwięk wielostrefowy.
Podawanie i balansowanie dźwięku
W Androidzie 9 wprowadzono interfejs HAL sterowania dźwiękiem HIDL w wersji 1, aby obsługiwać wyciszanie i wyrównywanie dźwięku w przypadku zastosowań motoryzacyjnych. Oprócz ogólnych efektów dźwiękowych dostępnych już w Androidzie ten mechanizm umożliwia aplikacjom systemowym ustawianie balansu dźwięku i zmywanie za pomocą interfejsów API CarAudioManager
:
class CarAudioManager {
/**
* Adjust the relative volume in the front vs back of the vehicle cabin.
*
* @param value in the range -1.0 to 1.0 for fully toward the back through
* fully toward the front. 0.0 means evenly balanced.
*/
@SystemApi
@RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
public void setFadeTowardFront(float value);
/**
* Adjust the relative volume on the left vs right side of the vehicle cabin.
*
* @param value in the range -1.0 to 1.0 for fully toward the left through
* fully toward the right. 0.0 means evenly balanced.
*/
@SystemApi
@RequiresPermission(Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME)
public void setBalanceTowardRight(float value);
}
Po wywołaniu tych interfejsów API wywoływane są odpowiednie interfejsy API HAL sterowania dźwiękiem z usługi audio samochodu:
interface IAudioControl {
/**
* Control the right/left balance setting of the car speakers.
*/
oneway setBalanceTowardRight(float value);
/**
* Control the fore/aft fade setting of the car speakers.
*/
oneway setFadeTowardFront(float value);
}
Interfejs API jest dostępny we wszystkich wersjach interfejsu HAL sterowania dźwiękiem, w tym w nowym interfejsie AIDL HAL.
Prośba o aktywność audio z HAL
AAOS, podobnie jak Android, wymaga aktywnego udziału aplikacji w obsłudze dźwięku w celu zarządzania odtwarzaniem dźwięku w samochodach. Informacje o fokusie są używane do zarządzania tym, które strumienie mają kontrolować głośność i przytłumienie. Aby jeszcze bardziej poprawić jakość dźwięku i zapewnić lepszą integrację dźwięków związanych z samochodem z Androidem, w Androidzie 11 wprowadzono te atrybuty dźwięku:
EMERGENCY
SAFETY
VEHICLE_STATUS
ANNOUNCEMENT
Oprócz tej zmiany dodano mechanizm umożliwiający dźwiękom pochodzącym spoza Androida udział w procesie wysyłania żądań dotyczącego priorytetu dźwięku. W tym celu wprowadzono interfejs HAL do obsługi dźwięku HIDL w wersji 2, który umożliwia obsługę żądań fokusowania pochodzących spoza Androida:
interface IAudioControl {
/**
* Registers focus listener to be used by HAL for requesting and
* abandoning audio focus.
* @param listener the listener interface
* @return closeHandle A handle to unregister observer.
*/
registerFocusListener(IFocusListener listener)
generates (ICloseHandle closeHandle);
/**
* Notifies HAL of changes in audio focus status for focuses requested
* or abandoned by the HAL.
*
* @param usage The audio usage associated with the focus change
* @param zoneId The identifier for the audio zone that the HAL is
* playing the stream in
* @param focusChange the AudioFocusChange that has occurred
*/
oneway onAudioFocusChange(bitfield<AudioUsage> usage, int32_t zoneId,
bitfield<AudioFocusChange> focusChange);
}
Gdzie IFocusListener
jest zdefiniowany jako:
interface IFocusListener {
/**
* Called whenever HAL is requesting focus as it is starting to play
* audio of a given usage in a specified zone.
*
* @param usage The audio usage associated with the focus request
* {@code AttributeUsage}
* @param zoneId The identifier for the audio zone where the HAL is
* requesting focus
* @param focusGain The AudioFocusChange associated with this request.
*/
oneway requestAudioFocus(bitfield<AudioUsage> usage,
int32_t zoneId, bitfield<AudioFocusChange> focusGain);
/**
* Called whenever HAL is abandoning focus as it is finished playing audio
* of a given usage in a specific zone.
*
* @param usage The audio usage for which the HAL is abandoning focus
* {@code AttributeUsage}
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
*/
oneway abandonAudioFocus(bitfield<AudioUsage> usage, int32_t zoneId);
}
Powyższe interfejsy API mogą być używane do żądania i rezygnacji z koncentracji na dźwięku w HAL. W odpowiedzi usługa audio samochodu analizuje prośbę o skupienie na dźwięku i przesyła wyniki asynchronicznie do metody IAudioControl#onAudioFocusChange
.
Interfejsu API można też używać do monitorowania zmian w prośbie o skupienie się na dźwięku pochodzącej z interfejsu HAL sterowania dźwiękiem. Ogólnie rzecz biorąc, każde żądanie skupienia dźwięku z HAL jest uważane za aktywne. Jest to inne niż żądanie skupienia dźwięku z Androida, w którym tylko odtwarzanie odpowiedniego ścieżki audio jest uważane za aktywne.
Migracja z HIDL na interfejs HAL sterowania dźwiękiem AIDL
Wraz z wprowadzeniem interfejsu AIDL i wymuszoną migracją w Androidzie 12 (więcej informacji znajdziesz w artykule AIDL dla interfejsów HAL) interfejs HAL sterowania dźwiękiem został przeniesiony do interfejsu AIDL. W przypadku dotychczasowych interfejsów API kontroli dźwięku HIDL w wersji 2 migracja wymagała wprowadzenia drobnych zmian w dotychczasowych metodach:
interface IAudioControl {
/**
* Notifies HAL of changes in audio focus status for focuses requested
* or abandoned by the HAL.
*
* @param usage The audio usage associated with the focus change
* {@code AttributeUsage}. See {@code audioUsage} in
* audio_policy_configuration.xsd for the list of allowed values.
* @param zoneId The identifier for the audio zone that the HAL is
* playing the stream in
* @param focusChange the AudioFocusChange that has occurred.
*/
oneway void onAudioFocusChange(in String usage, in int zoneId,
in AudioFocusChange focusChange);
/**
* Registers focus listener to be used by HAL for requesting and
* abandoning audio focus.
* @param listener the listener interface.
*/
oneway void registerFocusListener(in IFocusListener listener);
/**
* Control the right/left balance setting of the car speakers.
*/
oneway void setBalanceTowardRight(in float value);
/**
* Control the fore/aft fade setting of the car speakers.
*/
oneway void setFadeTowardFront(in float value);
}
I odpowiednie IFocusListener
:
interface IFocusListener {
/**
* Called whenever HAL is abandoning focus as it is finished playing audio
* of a given usage in a specific zone.
*
* @param usage The audio usage for which the HAL is abandoning focus
* {@code AttributeUsage}. See {@code audioUsage} in
* audio_policy_configuration.xsd for the list of allowed values.
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
*/
oneway void abandonAudioFocus(in String usage, in int zoneId);
/**
* Called whenever HAL is requesting focus as it is starting to play audio
* of a given usage in a specified zone.
*
* @param usage The audio usage associated with the focus request
* {@code AttributeUsage}. See {@code audioUsage} in
* audio_policy_configuration.xsd for the list of allowed values.
* @param zoneId The identifier for the audio zone where the HAL is
* requesting focus
* @param focusGain The AudioFocusChange associated with this request.
*/
oneway void requestAudioFocus(in String usage, in int zoneId,
in AudioFocusChange focusGain);
}
Wyciszanie grupy głośności
Android 12 wprowadził wyciszenie grupy głośności, aby umożliwić użytkownikom bardziej kompleksową kontrolę nad wyciszaniem podczas interakcji z dźwiękiem. Umożliwia to komponentowi HAL sterowania dźwiękiem otrzymywanie zdarzeń wyciszania przechwytywanych przez usługę dźwiękową samochodu.
Aby włączyć tę funkcję, producenci OEM muszą ustawić konfigurację audioUseCarVolumeGroupMuting
na true
w usłudze config.xml
:
<!-- Configuration to enable muting of individual volume groups.
If this is set to false, muting of individual volume groups is disabled,
instead muting will toggle master mute. If this is set to true, car volume
group muting is enabled and each individual volume group can be muted separately. -->
<bool name="audioUseCarVolumeGroupMuting">true</bool>
Przed Androidem 13 konfigurację trzeba było zastąpić nakładką zasobów na czas wykonywania dla packages/services/Car/service/res/values/config.xml
(więcej informacji znajdziesz w artykule Dostosowywanie wersji za pomocą nakładek zasobów). Od Androida 13 możesz używać nakładek zasobów w czasie wykonywania, aby zmieniać wartości konfiguracji. Więcej informacji znajdziesz w artykule Zmienianie wartości zasobów aplikacji w czasie działania.
Aplikacje systemowe mogą sprawdzić, czy funkcja jest włączona, korzystając z interfejsu CarAudioManager#isAudioFeatureEnabled
API. Przekazywany parametr musi być stałą CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING
. Metoda zwracatrue
, jeśli funkcja jest włączona na urządzeniu, w przeciwnym razie false
.
Oprócz włączenia funkcji audioUseCarVolumeGroupMuting
interfejs API kontroli dźwięku AIDL musi zaimplementować mechanizm wyciszania grupy głośności:
interface IAudioControl {
/**
* Notifies HAL of changes in output devices that the HAL should apply
* muting to.
*
* This will be called in response to changes in audio mute state for each
* volume group and will include a {@link MutingInfo} object per audio
* zone that experienced a mute state event.
*
* @param mutingInfos an array of {@link MutingInfo} objects for the audio
* zones where audio mute state has changed.
*/
oneway void onDevicesToMuteChange(in MutingInfo[] mutingInfos);
}
Gdy informacje o wyciszeniu zawierają istotne informacje o wyciszeniu systemu audio:
parcelable MutingInfo {
/**
* ID of the associated audio zone
*/
int zoneId;
/**
* List of addresses for audio output devices that should be muted.
*/
String[] deviceAddressesToMute;
/**
* List of addresses for audio output devices that were previously be
* muted and should now be unmuted.
*/
String[] deviceAddressesToUnmute;
}
AAOS ma 2 różne mechanizmy wyciszania, oparte na:
Kluczowe zdarzenia korzystające z audio KEYCODE_VOLUME_MUTE.
bezpośrednie wywołania usługi audio w samochodzie za pomocą interfejsu API do wyciszania dźwięku w menedżerze audio w samochodzie,
CarAudioManager#setVolumeGroupMute
.
Gdy są włączone, oba mechanizmy wywołują wyciszenie połączenia w interfejsie HAL sterowania dźwiękiem.
Wyciszanie tła w samochodzie
Android 12 wprowadził funkcję wyciszania dźwięku w samochodzie, aby zoptymalizować kontrolę jednoczesnego odtwarzania strumieni dźwięku. Umożliwia to producentom OEM wdrażanie własnych zachowań wyciszania na podstawie fizycznej konfiguracji dźwięku w samochodzie i obecnego stanu odtwarzania, określonych przez usługę dźwiękową samochodu.
Mechanizm wyciszania działa na podstawie zmian w grupie elementów dźwiękowych. Za każdym razem, gdy nastąpi zmiana stanu skupienia (czy to żądanie skupienia, czy rezygnacja ze skupienia), interfejs HAL sterowania dźwiękiem zostanie o tym poinformowany. Podobnie jak w przypadku obsługi wyciszania grupy głośności w samochodzie, zduszenie dźwięku w samochodzie można włączyć za pomocą flagi konfiguracji audioUseHalDuckingSignals
:
<!-- Configuration to enable IAudioControl#onDevicesToDuckChange API to
inform HAL when to duck. If this is set to true, the API will receive signals
indicating which output devices to duck as well as what usages are currently
holding focus. If set to false, the API will not be called. -->
<bool name="audioUseHalDuckingSignals">true</bool>
Aby włączyć tę funkcję, interfejs HAL sterowania dźwiękiem AIDL musi zaimplementować odpowiednią logikę z użyciem sygnału otrzymanego z usługi dźwięku w samochodzie:
interface IAudioControl {
/**
* Notifies HAL of changes in output devices that the HAL should apply
* ducking to.
*
* This will be called in response to changes in audio focus, and will
* include a {@link DuckingInfo} object per audio zone that experienced
* a change in audo focus.
*
* @param duckingInfos an array of {@link DuckingInfo} objects for the
* audio zones where audio focus has changed.
*/
oneway void onDevicesToDuckChange(in DuckingInfo[] duckingInfos);
}
Ważne informacje o systemie audio znajdują się w informacjach dotyczących tłumienia dźwięku:
parcelable DuckingInfo {
/**
* ID of the associated audio zone
*/
int zoneId;
/**
* List of addresses for audio output devices that should be ducked.
*/
String[] deviceAddressesToDuck;
/**
* List of addresses for audio output devices that were previously be
* ducked and should now be unducked.
*/
String[] deviceAddressesToUnduck;
/**
* List of usages currently holding focus for this audio zone.
*/
String[] usagesHoldingFocus;
}
Oprócz informacji o konfiguracji dźwięku w samochodzie zawartych w adresach urządzeń informacje o wyciszczeniu i wyciszczeniu dźwięku zawierają również informacje o tym, które użycie atrybutu dźwięku jest obecnie w centrum uwagi. Te dane mają na celu informowanie systemu audio o tym, które atrybuty audio są aktywne.
Jest to konieczne, ponieważ w ramach konfiguracji dźwięku w samochodzie można przypisać do jednego urządzenia wiele atrybutów dźwięku, a bez dodatkowych informacji nie wiadomo, które zastosowania są aktywne.
AIDL audio control HAL 2.0
Aby zaktualizować interfejsy API i wprowadzić nowe funkcje, w Androidzie 13 zaktualizowano interfejs HAL sterowania dźwiękiem AIDL do wersji 2.0:
- Aktywność audio z urządzeniem
PlaybackTrackMetadata
- wywołanie zwrotne dotyczące wzmocnienia dźwięku
Metadane odtwarzania są zdefiniowane w android.hardware.audio.common
w następujący sposób:
parcelable PlaybackTrackMetadata {
AudioUsage usage = INVALID;
AudioContentType contentType = UNKNOWN;
float gain;
AudioChannelLayout channelMask;
AudioDevice sourceDevice;
String[] tags;
}
Wszystkie inne funkcje AIDL Audio Control w wersji 1.0 pozostały i nadal można z nich korzystać. Wyjątek dotyczy metody zmiany trybu dźwięku w kontekście, jak opisano w artykule Metoda zmiany trybu dźwięku.
Aktywność sterowania dźwiękiem z metadanymi ścieżki odtwarzania
Aby udostępnić więcej informacji systemowi audio niż tylko HAL, aktualizacje udostępniają terazPlaybackTrackMetadata
. W szczególności rozszerzono interfejs HAL sterowania dźwiękiem o nową metodę:
interface IAudioControl {
/**
* Notifies HAL of changes in audio focus status for focuses requested
* or abandoned by the HAL.
*
* The HAL is not required to wait for a callback of AUDIOFOCUS_GAIN
* before playing audio, nor is it required to stop playing audio in the
* event of a AUDIOFOCUS_LOSS callback is received.
*
* @param playbackMetaData The output stream metadata associated with
* the focus request
* @param zoneId The identifier for the audio zone that the HAL is
* playing the stream in
* @param focusChange the AudioFocusChange that has occurred.
*/
oneway void onAudioFocusChangeWithMetaData(
in PlaybackTrackMetadata playbackMetaData, in int zoneId,
in AudioFocusChange focusChange);
}
W analogiczny sposób wprowadzamy zmiany w plikach IFocusListener
:
/**
* Called to indicate that the audio output stream associated with
* {@link android.hardware.audio.common.PlaybackTrackMetadata} is
* abandoning focus as playback has stopped.
*
* @param playbackMetaData The output stream metadata associated with
* the focus request
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
*/
oneway void abandonAudioFocusWithMetaData(
in PlaybackTrackMetadata playbackMetaData, in int zoneId);
/**
* Called to indicate that the audio output stream associated with
* {@link android.hardware.audio.common.PlaybackTrackMetadata} has taken
* the focus as playback is starting for the corresponding stream.
*
* @param playbackMetaData The output stream metadata associated with
* the focus request
* @param zoneId The identifier for the audio zone that the HAL
* abandoning focus
* @param focusGain The focus type requested.
*/
oneway void requestAudioFocusWithMetaData(
in PlaybackTrackMetadata playbackMetaData, in int zoneId,
in AudioFocusChange focusGain);
}
Metoda zmiany aktywności audio
Opisane powyżej operacje skupienia działają tak samo jak te opisane w żądaniu skupienia się na dźwięku z HAL. Tylko metadane ścieżki odtwarzania zawierają więcej informacji wraz z użyciem atrybutów audio. Ogólnie, jeśli nie są potrzebne dodatkowe informacje udostępniane przez metadane utworu do odtwarzania, zaktualizowany interfejs HAL sterowania Androida może nadal używać poprzednich metod.
Jeśli deweloperzy HAL zdecydują się nie obsługiwać IAudioControl#onAudioFocusChangeWithMetaData
, metoda powinna zwracać wyniki z błędem UNKNOWN_TRANSACTION
, jak opisano w sekcji Korzystanie z metod interfejsu z wersją.
Usługa audio najpierw wywołuje funkcję onAudioFocusChangeWithMetaData
, a następnie, jeśli wystąpi błąd UNKNOWN_TRANSACTION
, próbuje ponownie użyć metody onAudioFocusChange
.
wyciszanie dźwięku z użyciem metadanych ścieżki odtwarzania
W wersji 2.0 interfejsu HAL sterowania dźwiękiem AIDL dodano metadane ścieżki odtwarzania do informacji o wyciszaniu dźwięku:
parcelable DuckingInfo {
/**
* ID of the associated audio zone
*/
int zoneId;
/**
* List of addresses for audio output devices that should be ducked.
*/
String[] deviceAddressesToDuck;
/**
* List of addresses for audio output devices that were previously be
* ducked and should now be unducked.
*/
String[] deviceAddressesToUnduck;
/**
* List of usages currently holding focus for this audio zone.
*/
String[] usagesHoldingFocus;
/**
* List of output stream metadata associated with the current focus
* holder for this audio zone
*/
@nullable PlaybackTrackMetadata[] playbackMetaDataHoldingFocus;
}
Środowisko wykonawcze usagesHoldingFocus
zostało wycofane. Deweloperzy powinni teraz używać funkcji playbackMetaDataHoldingFocus
, aby określić użycie atrybutu audio i inne informacje o dźwięku. Do czasu formalnego usunięcia tej opcji parametr usagesHoldingFocus
nadal zawiera wymagane informacje.
wywołanie z poziomu dźwięku.
Aby zmiany dotyczące dźwięku poniżej HAL były bardziej widoczne dla AAOS w Androidzie 13, dodaliśmy mechanizm, który umożliwia przesyłanie zmian dotyczących wzmocnienia dźwięku z systemu audio samochodu do usługi audio samochodu. Mechanizm ten udostępnia zmiany indeksu głośności wzmocnienia dźwięku wraz z odpowiednim powodem zmiany wzmocnienia:
- Blokowanie i wyciszanie
- Ograniczenia
- Ograniczenia tłumienia
Te zmiany umożliwiają udostępnianie tych ograniczeń z poziomu poniżej HAL do usługi audio samochodu, a na końcu do aplikacji interfejsu systemu, aby poinformować użytkownika. Druga część, czyli możliwość wyświetlenia informacji w interfejsie systemu, została rozszerzona w Androidzie 14, aby umożliwić aplikacjom interfejsu systemu łatwiejszy dostęp do tych informacji za pomocą mechanizmu wywołania informacji o grupie objętości.
Interfejs HAL sterowania dźwiękiem rejestruje wywołanie zwrotne gain w ten sposób:
interface IAudioControl {
/**
* Registers callback to be used by HAL for reporting unexpected gain(s)
* changed and the reason(s) why.
*
* @param callback The {@link IAudioGainCallback}.
*/
oneway void registerGainCallback(in IAudioGainCallback callback);
}
IAudioGainCallback
jest zdefiniowana w następujący sposób:
interface IAudioGainCallback {
/**
* Used to indicate that one or more audio device port gains have changed,
* i.e. initiated by HAL, not by CarAudioService.
* This is the counter part of the
* {@link onDevicesToDuckChange}, {@link onDevicesToMuteChange} and,
* {@link setAudioDeviceGainsChanged} APIs.
*
* @param reasons List of reasons that triggered the given gains changed.
* @param gains List of gains affected by the change.
*/
void onAudioDeviceGainsChanged(in Reasons[] reasons,
in AudioGainConfigInfo[] gains);
}
Jak zaznaczono w dokumentacji interfejsu API, wywołanie zwrotne gain jest rejestrowane przez usługę audio samochodu w interfejsie Audio Control HAL. Gdy interfejs API jest wywoływany z poziomu interfejsu HAL sterowania dźwiękiem, usługa dźwięku w samochodzie odpowiada odpowiednim działaniem (np. blokowaniem, ograniczaniem lub tłumieniem indeksu wzmocnienia).
HAL określa, kiedy wywołać interfejs API, głównie w celu zgłaszania zmian stanu indeksu zysków. Zgodnie z wymogami regulacyjnymi system audio samochodu powinien podjąć wymagane działanie i użyć wywołania zwrotnego, aby przekazać informacje do usługi audio samochodu, aby umożliwić użytkownikowi korzystanie z usługi. Na przykład, aby wyświetlić użytkownikowi interfejs.
AIDL audio control HAL 3.0
Wersja interfejsu HAL sterowania dźwiękiem AIDL w Androidzie 14 została zaktualizowana do wersji 3.0, aby zapewnić interfejsom API bardziej stabilną funkcjonalność indeksu wzmocnienia dźwięku. Interfejs HAL API do kontroli dźwięku umożliwia usłudze audio ustawienie i odznaczenie IModuleChangeCallback
:
interface IAudioControl {
/**
* Sets callback with HAL for notifying changes to hardware module
* (that is: {@link android.hardware.audio.core.IModule}) configurations.
*
* @param callback The {@link IModuleChangeCallback} interface to use
* use when new updates are available for
*/
void setModuleChangeCallback(in IModuleChangeCallback callback);
/**
* Clears module change callback
*/
void clearModuleChangeCallback();
}
setModuleChangeCallback
jest rejestrowany przez usługę dźwięku w samochodzie podczas uruchamiania usługi lub przywracania po błędzie. Może to być na przykład powiadomienie o zakończeniu działania usługi sterowania dźwiękiem (HAL) otrzymane przez usługę audio w samochodzie. Implementacja interfejsu HAL sterowania dźwiękiem powinna zastąpić wszystkie istniejące funkcje wywołania zwrotnego zmiany modułu, gdy wywoływany jest interfejs API.
W przypadku interfejsu API clearModuleChangeCallback
implementacja powinna wyczyścić istniejące wywołanie zwrotne lub nie robić nic, jeśli nie istnieje. Dobrą praktyką w przypadku implementacji kontroli dźwięku jest zarejestrowanie obserwatora śmierci dla wywołania zwrotnego, a następnie wyczyszczenie wywołania zwrotnego, jeśli zostanie wywołana metoda onBinderDeath.
IModuleChangeCallback
jest zdefiniowana w ten sposób:
oneway interface IModuleChangeCallback {
/**
* Used to indicate that one or more {@link AudioPort} configs have
* changed. Implementations MUST return at least one AudioPort.
*
* @param audioPorts list of {@link AudioPort} that are updated
*/
void onAudioPortsChanged(in AudioPort[] audioPorts);
}
Gdy usługa audio samochodu zarejestruje wywołanie zwrotne zmiany modułu, będzie już otrzymywać zmiany portu audio za pomocą interfejsu onAudioPortChanged
API. Interfejsu API można używać do inicjowania wzmocnienia głośności dla systemu audio, gdy tylko zostanie zarejestrowany wywołanie zwrotne. W przypadku innych zmian dynamicznych interfejs API może być wywoływany w dowolnym momencie. Wprowadzane są odpowiednie zmiany, a usługa audio w samochodzie jest aktualizowana.