Sterowanie dźwiękiem HAL

Sterowanie dźwiękiem HAL został wprowadzony w systemie Android 9 w celu obsługi zastosowań audio w motoryzacji. Począwszy od systemu Android 14, sterowanie dźwiękiem HAL obsługuje:

  • Zanik i równowaga
  • Żądanie skupienia dźwięku HAL
  • Wyciszanie i wyciszanie urządzenia
  • Zmiany wzmocnienia urządzenia audio
  • Zmiany konfiguracji portu audio

Rysunek 1 przedstawia ogólny przegląd architektury usługi car audio, w której usługa car audio komunikuje się z warstwą sterującą systemem audio HAL.

Skonfiguruj dźwięk wielostrefowy

Rysunek 1. Skonfiguruj dźwięk wielostrefowy.

Zanik i równowaga dźwięku

Sterowanie dźwiękiem HIDL Wersja 1 HAL została wprowadzona w systemie Android 9 w celu obsługi zanikania i równoważenia dźwięku w zastosowaniach motoryzacyjnych. Oprócz ogólnych efektów dźwiękowych dostępnych już w systemie Android, ten mechanizm umożliwia aplikacjom systemowym ustawianie balansu dźwięku i zanikania za pośrednictwem 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 car audio wywoływane są odpowiednie interfejsy API HAL do 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 do sterowania dźwiękiem, łącznie z nowym interfejsem AIDL HAL.

Żądanie skupienia dźwięku z HAL

AAOS, podobnie jak Android, opiera się na aktywnym udziale aplikacji zajmujących się dźwiękiem w celu zarządzania odtwarzaniem dźwięku w samochodach. Informacje o fokusie służą do zarządzania, które strumienie mają kontrolować głośność i wyciszanie. W związku z tym, aby jeszcze bardziej skupić się na dźwięku i zapewnić lepszą integrację dźwięków charakterystycznych dla samochodu z systemem Android, w systemie Android 11 wprowadzono następujące atrybuty audio:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

Oprócz tej zmiany dodano mechanizm umożliwiający dźwiękom pochodzącym spoza Androida uczestniczenie w żądaniach skupienia dźwięku. W związku z tym wprowadzono kontrolę dźwięku HIDL HAL w wersji 2, aby umożliwić żądania skupienia 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 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 odpowiednio do żądania i porzucania fokusu audio z warstwy HAL. W odpowiedzi usługa car audio rozpatruje żądanie fokusu audio i przekazuje wyniki asynchronicznie do metody IAudioControl#onAudioFocusChange .

Tego interfejsu API można również używać do monitorowania zmian w żądaniu fokusu audio, które pochodzi z warstwy sterującej dźwiękiem HAL. Ogólnie rzecz biorąc, każde stałe żądanie fokusu audio z warstwy HAL jest uważane za aktywne , co różni się od żądania fokusu audio z Androida, w którym tylko odpowiednia aktywna ścieżka audio jest uważana za aktywną.

Przeprowadź migrację HIDL do AIDL kontroli dźwięku HAL

Wraz z pojawieniem się AIDL i wymaganą migracją w systemie Android 12 (aby dowiedzieć się więcej, zobacz AIDL dla HAL ), kontrola dźwięku HAL została przeniesiona do AIDL. W przypadku istniejących interfejsów API kontroli dźwięku HIDL w wersji 2 migracja wymagała drobnych aktualizacji istniejących metod:

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 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);
}

Wyciszenie grupy głośności

W Androidzie 12 wprowadzono wyciszanie grup głośności, aby umożliwić bardziej wszechstronną kontrolę wyciszenia podczas interakcji audio użytkownika. Dzięki temu moduł HAL sterowania dźwiękiem może odbierać zdarzenia wyciszenia przechwycone przez usługę car audio.

Aby włączyć tę funkcję, producenci OEM muszą ustawić konfigurację audioUseCarVolumeGroupMuting na true w config.xml usługi samochodowej:

<!-- 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 wersją Androida 13 konfiguracja musiała zostać nadpisana nakładką zasobów środowiska wykonawczego dla packages/services/Car/service/res/values/config.xml (aby dowiedzieć się więcej, zobacz Dostosowywanie kompilacji za pomocą nakładek zasobów ). W systemie Android 13 możesz używać nakładek zasobów środowiska wykonawczego, aby zmienić wartość konfiguracyjną. Aby dowiedzieć się więcej, zobacz Zmienianie wartości zasobów aplikacji w czasie jej wykonywania .

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

Oprócz włączenia funkcji audioUseCarVolumeGroupMuting , warstwa HAL kontroli dźwięku 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);
}

Jeżeli informacja o wyciszeniu zawiera 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 dwa różne mechanizmy wyciszania, oparte na:

  • Kluczowe zdarzenia wykorzystujące dźwięk KEYCODE_VOLUME_MUTE {:.external}.

  • Bezpośrednie połączenia z usługą car audio za pomocą interfejsu API wyciszania menedżera car audio, CarAudioManager#setVolumeGroupMute .

Po włączeniu oba mechanizmy powodują wyciszenie połączenia do HAL sterowania dźwiękiem.

Wyciszanie dźwięku w samochodzie

W systemie Android 12 wprowadzono wyciszanie dźwięku w samochodzie, aby zoptymalizować kontrolę nad jednoczesnym odtwarzaniem strumieni audio. Umożliwia to producentom OEM wdrożenie własnego zachowania wyciszania w oparciu o fizyczną konfigurację audio samochodu i bieżący stan odtwarzania, określony przez usługę car audio.

Mechanizm wyciszania opiera się na zmianach stosu fokusu audio. Za każdym razem, gdy nastąpi zmiana fokusu (niezależnie od tego, czy jest to żądanie skupienia, czy porzucenie fokusu), zostaje o tym poinformowana kontrola dźwięku HAL. 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 konfiguracyjnej 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ę, sterownik audio AIDL HAL musi wdrożyć odpowiednią logikę z sygnałem otrzymanym z usługi car audio:

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 zawarte są w informacjach o wyciszeniu 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 samochodowego zestawu audio zawartych w adresach urządzeń do (wycofania) wyciszania, informacje o wyciszaniu zawierają również informacje o tym, które zastosowania atrybutów audio są najważniejsze. Celem tych danych jest poinformowanie systemu audio, które atrybuty audio są aktywne.

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

Sterowanie dźwiękiem AIDL HAL 2.0

Aby zaktualizować interfejsy API i udostępnić nową funkcjonalność, kontrola dźwięku AIDL HAL została zaktualizowana do wersji 2.0 w systemie Android 13:

  • Skupienie dźwięku za pomocą PlaybackTrackMetadata
  • Dźwięk zyskuje wywołanie zwrotne

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 pozostałe funkcje kontroli dźwięku AIDL w wersji 1.0 pozostały i można z nich korzystać. Wyjątek dotyczy metody zmiany ostrości dźwięku, zgodnie z opisem w części Metoda zmiany ostrości dźwięku .

Sterowanie dźwiękiem za pomocą metadanych ścieżki odtwarzania

Aby udostępnić więcej informacji systemowi audio poniżej HAL, aktualizacje udostępniają teraz PlaybackTrackMetadata . W szczególności sterowanie dźwiękiem HAL zostało rozszerzone 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, odpowiednia zmiana została wprowadzona w 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);
}

O metodzie zmiany ostrości dźwięku

Powyższe operacje fokusu działają w taki sam sposób, jak te opisane w Żądanie fokusu audio z HAL . Tylko metadane ścieżki odtwarzania zawierają więcej informacji wraz z wykorzystaniem atrybutów audio. Ogólnie rzecz biorąc, jeśli nie są potrzebne dodatkowe informacje zawarte w metadanych ścieżki odtwarzania, zaktualizowana kontrola HAL systemu Android może nadal korzystać z poprzednich metod.

Jeśli programiści HAL zdecydują się nie obsługiwać IAudioControl#onAudioFocusChangeWithMetaData , metoda powinna zwrócić wyniki z błędem UNKNOWN_TRANSACTION zgodnie z opisem przy użyciu metod interfejsu wersjonowanego .

Usługa audio najpierw wywołuje onAudioFocusChangeWithMetaData , a następnie ponawia próbę przy użyciu metody onAudioFocusChange , jeśli wystąpi błąd UNKNOWN_TRANSACTION .

Wyciszanie car audio z metadanymi ścieżki odtwarzania

Wersja 2.0 modułu sterującego dźwiękiem AIDL HAL dodała 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;
}

usagesHoldingFocus jest przestarzały. Deweloperzy powinni teraz używać playbackMetaDataHoldingFocus do określenia użycia atrybutu audio i innych informacji o dźwięku. To powiedziawszy, parametr usagesHoldingFocus nadal zawiera wymagane informacje, dopóki ta opcja nie zostanie formalnie usunięta.

Oddzwonienie dotyczące wzmocnienia dźwięku

Aby zmiany dźwięku poniżej HAL były bardziej widoczne dla AAOS w systemie Android 13, dodaliśmy mechanizm, za pomocą którego można komunikować zmiany wzmocnienia dźwięku z systemu audio samochodu do usługi audio w samochodzie. Mechanizm ujawnia zmiany wskaźnika głośności wzmocnienia dźwięku z odpowiednim powodem zmiany wzmocnienia:

  • Zablokowane lub wyciszone ograniczenia
  • Ograniczenia ograniczenia
  • Ograniczenia tłumienia

Zmiany te udostępniają te ograniczenia spod HAL do usługi car audio i wreszcie do aplikacji systemowego interfejsu użytkownika, aby poinformować użytkownika. Ta druga część, czyli dostęp do możliwego interfejsu użytkownika systemu, została dodatkowo rozszerzona w systemie Android 14, aby umożliwić aplikacjom systemowego interfejsu użytkownika łatwiejsze uzyskiwanie tych informacji za pośrednictwem mechanizmu wywołania zwrotnego informacji o grupie woluminów.

Interfejs API HAL do sterowania dźwiękiem rejestruje wywołanie zwrotne wzmocnienia w następujący 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 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 podkreślono w dokumentacji API, wywołanie zwrotne wzmocnienia jest rejestrowane przez usługę car audio w HAL sterującym dźwiękiem. Gdy wywoływany jest interfejs API z poziomu warstwy sterującej dźwiękiem, usługa car audio odpowiada odpowiednią akcją (taką jak blokowanie, ograniczanie lub tłumienie wskaźnika wzmocnienia).

HAL określa, kiedy wywoływany jest interfejs API, głównie w celu raportowania zmian w statusie indeksu wzmocnienia. Zgodnie z wymogami przepisów system audio samochodu powinien podjąć wymagane działania i skorzystać z wywołania zwrotnego w celu przesłania informacji do usługi car audio, aby umożliwić użytkownikowi korzystanie z nich. Na przykład, aby pokazać użytkownikowi interfejs użytkownika.

Sterowanie dźwiękiem AIDL HAL 3.0

Wersja HAL do sterowania dźwiękiem AIDL w systemie Android 14 została zaktualizowana do wersji 3.0 w celu zaktualizowania interfejsów API i zapewnienia bardziej niezawodnej funkcjonalności indeksu wzmocnienia dźwięku. Interfejs API HAL do sterowania dźwiękiem umożliwia usłudze audio ustawianie i rozbrajanie 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();
}

Funkcja setModuleChangeCallback jest rejestrowana przez usługę car audio po uruchomieniu usługi lub podczas odzyskiwania po błędzie. Na przykład powiadomienie o śmierci modułu audio HAL otrzymane przez usługę car audio. Implementacja HAL do sterowania dźwiękiem powinna zastąpić wszelkie istniejące wywołania zwrotne zmiany modułu po wywołaniu interfejsu API.

W przypadku interfejsu API clearModuleChangeCallback implementacja powinna wyczyścić istniejące wywołanie zwrotne lub nie wykonywać żadnych działań, jeśli takie nie istnieje. Dobrą praktyką w implementacji sterowania dźwiękiem jest zarejestrowanie obserwatora śmierci dla wywołania zwrotnego, a następnie wyczyszczenie wywołania zwrotnego, jeśli zostanie wyzwolona śmierć powiązania.

IModuleChangeCallback jest zdefiniowany w następujący 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 wywołanie zwrotne zmiany modułu zostanie zarejestrowane przez usługę car audio, będzie ona gotowa do odbioru zmian portów audio za pośrednictwem interfejsu API onAudioPortChanged . Za pomocą interfejsu API można zainicjować wzmocnienie głośności systemu audio zaraz po zarejestrowaniu wywołania zwrotnego. W przypadku innych dynamicznych zmian wzmocnienia interfejs API można wywołać w dowolnym momencie. Zastosowane zostaną odpowiednie zmiany i usługa car audio zostanie odpowiednio zaktualizowana.