Interfejs HAL sterowania dźwiękiem

Warstwa HAL sterowania dźwiękiem została wprowadzona w Androidzie 9, aby obsługiwać przypadki użycia dźwięku istotne dla motoryzacji. Od Androida 14 interfejs HAL sterowania dźwiękiem obsługuje:

  • Zanikanie i balans
  • Żądanie aktywności audio HAL
  • Wyciszanie i przyciszanie urządzenia
  • Zmiany wzmocnienia urządzenia audio
  • Zmiany konfiguracji portu audio

Ilustracja 1 przedstawia ogólny zarys architektury usługi audio w samochodzie, w której usługa audio w samochodzie komunikuje się z warstwą HAL sterowania dźwiękiem.

Konfigurowanie dźwięku w wielu strefach

Rysunek 1. Skonfiguruj dźwięk w wielu strefach.

Wyciszanie i balans dźwięku

W Androidzie 9 wprowadzono wersję 1 interfejsu HAL sterowania dźwiękiem HIDL, aby obsługiwać zanikanie i równoważenie dźwięku w przypadku zastosowań w motoryzacji. 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 przejść 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 z usługi audio w samochodzie wywoływane są odpowiednie interfejsy API HAL sterowania dźwiękiem:

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 HAL sterowania dźwiękiem, w tym w nowym interfejsie HAL AIDL.

Prośba o aktywność audio z HAL

AAOS, podobnie jak Android, opiera się na aktywnym udziale aplikacji w zarządzaniu odtwarzaniem dźwięku w samochodach za pomocą funkcji audio focus. Informacje o fokusie są używane do zarządzania strumieniami, których głośność i wygaszanie mają być kontrolowane. Aby jeszcze bardziej rozszerzyć funkcję skupienia dźwięku i lepiej zintegrować dźwięki specyficzne dla samochodu z Androidem, w Androidzie 11 wprowadziliśmy te atrybuty dźwięku:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

Oprócz tej zmiany dodano mechanizm, który umożliwia dźwiękom pochodzącym spoza Androida uczestniczenie w żądaniach dotyczących fokusu audio. Wprowadzono więc HIDL audio control HAL w wersji 2, aby umożliwić żądania ostrości pochodzące 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 zdefiniowane 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 służą do żądania i zwalniania fokusu audio z HAL. W odpowiedzi usługa audio w samochodzie rozpatruje żądanie fokusu audio i przekazuje wyniki asynchronicznie do metody IAudioControl#onAudioFocusChange.

Ten interfejs API może też służyć do monitorowania zmian w przypadku żądania fokusu audio pochodzącego z warstwy HAL sterowania dźwiękiem. Ogólnie rzecz biorąc, każde żądanie trwałego fokusu audio z HAL jest uznawane za aktywne, co różni się od żądania fokusu audio z Androida, w którym tylko odpowiednie aktywne odtwarzanie ścieżki audio jest uznawane za aktywne.

Migracja z HIDL na AIDL w przypadku HAL sterowania dźwiękiem

Wraz z pojawieniem się AIDL i wymaganą migracją w Androidzie 12 (więcej informacji znajdziesz w artykule AIDL dla HAL-i) interfejs HAL sterowania dźwiękiem został przeniesiony do AIDL. W przypadku istniejących interfejsów HIDL audio control w wersji 2 migracja wymagała niewielkich 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);
}

oraz odpowiedni 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

W Androidzie 12 wprowadziliśmy wyciszanie grup głośności, aby zapewnić bardziej kompleksową kontrolę wyciszania podczas interakcji użytkownika z dźwiękiem. Dzięki temu HAL sterowania dźwiękiem może odbierać zdarzenia wyciszania przechwytywane przez usługę audio w samochodzie.

Aby włączyć tę funkcję, producenci OEM muszą ustawić konfigurację audioUseCarVolumeGroupMuting na true w usłudze samochodowej 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>

W przypadku Androida 13 i starszych wersji konfigurację trzeba było zastąpić nakładką zasobów w czasie działania dla packages/services/Car/service/res/values/config.xml (więcej informacji znajdziesz w artykule Dostosowywanie kompilacji za pomocą nakładek zasobów). Od Androida 13 możesz używać nakładek zasobów w czasie działania, aby zmieniać wartość konfiguracji. Więcej informacji znajdziesz w artykule Zmiana wartości zasobów aplikacji w czasie działania.

Aplikacje systemowe mogą sprawdzić, czy funkcja jest włączona, za pomocą interfejsu API CarAudioManager#isAudioFeatureEnabled. Przekazany parametr musi być stałą CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING. Metoda zwraca wartość true, jeśli funkcja jest włączona na urządzeniu, a w przeciwnym razie false.

Oprócz włączenia funkcji audioUseCarVolumeGroupMuting interfejs HAL sterowania dźwiękiem AIDL musi implementować 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);
}

Gdzie 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, które zależą od:

  • Kluczowe zdarzenia z użyciem dźwięku KEYCODE_VOLUME_MUTE.

  • Bezpośrednie wywołania usługi audio w samochodzie za pomocą interfejsu API wyciszania menedżera audio w samochodzie, CarAudioManager#setVolumeGroupMute.

Gdy ta funkcja jest włączona, oba mechanizmy wywołują wyciszenie połączenia w warstwie HAL sterowania dźwiękiem.

Wyciszanie dźwięku w samochodzie

W Androidzie 12 wprowadziliśmy wyciszanie dźwięku w samochodzie, aby zoptymalizować sterowanie jednoczesnym odtwarzaniem strumieni audio. Dzięki temu producenci OEM mogą wdrażać własne zachowania związane z wyciszaniem na podstawie fizycznej konfiguracji dźwięku w samochodzie i bieżącego stanu odtwarzania określonego przez usługę audio w samochodzie.

Mechanizm wyciszania tła opiera się na zmianach w stosie ostrości dźwięku. Za każdym razem, gdy nastąpi zmiana fokusu (w wyniku żądania fokusu lub jego porzucenia), HAL sterowania dźwiękiem jest o tym informowany. Podobnie jak w przypadku obsługi wyciszania grupy głośności w samochodzie, wyciszanie 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 sygnałem otrzymanym z usługi audio 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);
}

Odpowiednie informacje o systemie audio znajdują się w informacjach 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;
}

Oprócz informacji o konfiguracji dźwięku w samochodzie zawartych w adresach urządzeń, do których (nie)ma być stosowane wyciszanie, informacje o wyciszaniu zawierają też informacje o tym, które zastosowania atrybutów audio są aktywne. Te dane mają informować system audio, które atrybuty audio są aktywne.

Jest to wymagane, ponieważ w konfiguracji audio w samochodzie do jednego urządzenia można przypisać wiele atrybutów audio, a bez dodatkowych informacji nie jest jasne, które zastosowania są aktywne.

który obejmuje dźwięki generowane poniżej warstwy HAL przez systemy samochodu.

AIDL audio control HAL 2.0

Aby zaktualizować interfejsy API i ułatwić korzystanie z nowych funkcji, w Androidzie 13 zaktualizowaliśmy interfejs HAL sterowania dźwiękiem AIDL do wersji 2.0:

  • Aktywność audio w przypadku urządzenia 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 z wersji 1.0 interfejsu AIDL do sterowania dźwiękiem pozostały i można z nich korzystać. Wyjątek dotyczy metody zmiany fokusu dźwięku, zgodnie z opisem w sekcji Metoda zmiany fokusu dźwięku.

Aktywność sterowania dźwiękiem z metadanymi ścieżki odtwarzania

Aby udostępnić więcej informacji systemowi audio poniżej HAL, aktualizacje teraz udostępniają PlaybackTrackMetadata. W szczególności rozszerzyliśmy 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);
}

Podobna zmiana zostaje wprowadzona w przypadku 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

Powyższe operacje dotyczące fokusu działają tak samo jak te opisane w sekcji Żądanie fokusu audio z HAL. Tylko metadane ścieżki odtwarzania zawierają więcej informacji wraz z użyciem atrybutów audio. Ogólnie rzecz biorąc, o ile nie są potrzebne dodatkowe informacje dostarczane przez metadane ścieżki odtwarzania, zaktualizowany interfejs HAL sterowania Androidem może nadal korzystać z poprzednich metod.

Jeśli deweloperzy HAL zdecydują się nie obsługiwać IAudioControl#onAudioFocusChangeWithMetaData, metoda powinna zwracać wyniki z błędem UNKNOWN_TRANSACTION zgodnie z opisem w sekcji Korzystanie z metod interfejsu z określoną wersją.

Usługa audio najpierw wywołuje onAudioFocusChangeWithMetaData, a potem ponawia próbę za pomocą metody onAudioFocusChange, jeśli wystąpi błąd UNKNOWN_TRANSACTION.

Wyciszanie dźwięku w samochodzie na podstawie metadanych ścieżki odtwarzania

W wersji 2.0 interfejsu HAL sterowania dźwiękiem AIDL dodano metadane ścieżki odtwarzania do informacji o przyciszaniu 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ć playbackMetaDataHoldingFocus, aby określać wykorzystanie atrybutu audio i inne informacje o dźwięku. Mimo to parametr usagesHoldingFocus nadal zawiera wymagane informacje, dopóki ta opcja nie zostanie formalnie usunięta.

Wywołanie zwrotne wzmocnienia dźwięku

Aby zmiany dźwięku poniżej HAL były bardziej widoczne dla AAOS w Androidzie 13, dodaliśmy mechanizm, który umożliwia przekazywanie zmian wzmocnienia dźwięku z systemu audio samochodu do usługi audio w samochodzie. Mechanizm ten udostępnia zmiany indeksu głośności wzmocnienia dźwięku wraz z odpowiednim powodem zmiany wzmocnienia:

  • Ograniczenia dotyczące blokowania lub wyciszania
  • Ograniczenia dotyczące limitów
  • Ograniczenia dotyczące tłumienia

Zmiany te ujawniają te ograniczenia z poziomu poniżej HAL do usługi audio w samochodzie, a ostatecznie do aplikacji interfejsu systemu, aby poinformować użytkownika. W Androidzie 14 rozszerzyliśmy tę drugą część, czyli możliwość wyświetlania interfejsu systemu, aby aplikacje interfejsu systemu mogły łatwiej uzyskiwać te informacje za pomocą mechanizmu wywołania zwrotnego informacji o grupie głośności.

Interfejs HAL sterowania dźwiękiem rejestruje wywołanie zwrotne wzmocnienia 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 zdefiniowany w ten 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);
}

Zgodnie z dokumentacją interfejsu API wywołanie zwrotne wzmocnienia jest rejestrowane przez usługę audio w samochodzie w HAL sterowania dźwiękiem. Gdy interfejs API jest wywoływany z poziomu HAL sterowania dźwiękiem, usługa audio w samochodzie odpowiada odpowiednim działaniem (np. blokowaniem, ograniczaniem lub tłumieniem indeksu wzmocnienia).

Warstwa HAL określa, kiedy wywoływany jest interfejs API, głównie w celu zgłaszania zmian stanu indeksu wzmocnienia. Zgodnie z wymaganiami przepisów system audio w samochodzie powinien podjąć wymagane działanie i użyć wywołania zwrotnego, aby przekazać informacje do usługi audio w samochodzie, co umożliwi użytkownikowi korzystanie z niej. Na przykład aby wyświetlić interfejs użytkownika.

AIDL audio control HAL 3.0

Wersja HAL sterowania dźwiękiem AIDL w Androidzie 14 została zaktualizowana do wersji 3.0, aby zaktualizować interfejsy API i zapewnić bardziej niezawodną funkcję indeksu wzmocnienia dźwięku. Interfejs HAL sterowania dźwiękiem umożliwia usłudze audio ustawianie i usuwanie 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ę audio w samochodzie po uruchomieniu usługi lub po przywróceniu jej działania po błędzie. Przykładem może być powiadomienie o zakończeniu działania interfejsu HAL sterowania dźwiękiem odebrane przez usługę audio w samochodzie. Implementacja HAL sterowania dźwiękiem powinna zastąpić każdy istniejący wywołanie zwrotne zmiany modułu, gdy wywoływany jest interfejs API.

W przypadku interfejsu clearModuleChangeCallback API implementacja powinna usunąć istniejące wywołanie zwrotne lub nie robić nic, jeśli takie wywołanie nie istnieje. W przypadku implementacji sterowania dźwiękiem warto zarejestrować obserwatora zakończenia działania na potrzeby wywołania zwrotnego, a następnie wyczyścić wywołanie zwrotne, jeśli zostanie wywołane zdarzenie onBinderDeath.

Wartość 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 w samochodzie zarejestruje wywołanie zwrotne zmiany modułu, będzie gotowa do odbierania zmian portu audio za pomocą interfejsu onAudioPortChanged. Interfejs API może służyć do inicjowania wzmocnienia głośności w systemie audio od razu po zarejestrowaniu wywołania zwrotnego. W przypadku innych zmian dynamicznego wzmocnienia interfejs API można wywołać w dowolnym momencie. Odpowiednie zmiany zostaną zastosowane, a usługa audio w samochodzie zostanie odpowiednio zaktualizowana.