Audiosteuerung HAL

Die Audiosteuerung HAL wurde in Android 9 eingeführt, um für die Automobilindustrie relevante Audioanwendungsfälle zu unterstützen. Ab Android 14 unterstützt Audio Control HAL:

  • Verblassen und Ausbalancieren
  • HAL-Audiofokusanfrage
  • Stummschaltung und Ducking des Geräts
  • Änderungen der Audiogeräteverstärkung
  • Änderungen an der Audio-Port-Konfiguration

Abbildung 1 zeigt einen allgemeinen Überblick über die Car-Audio-Dienstarchitektur, in der der Car-Audio-Dienst mit der Audiosteuerungs-HAL kommuniziert.

Konfigurieren Sie Mehrzonen-Audio

Abbildung 1. Mehrzonen-Audio konfigurieren.

Audio-Fade und Balance

HIDL-Audiosteuerung HAL Version 1 wurde in Android 9 eingeführt, um Audio-Fade und -Balance in Anwendungsfällen im Automobilbereich zu unterstützen. Abgesehen von den generischen Audioeffekten, die bereits in Android bereitgestellt werden, ermöglicht dieser Mechanismus System-Apps, die Audiobalance einzustellen und über CarAudioManager APIs einzublenden:

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

Sobald diese APIs aufgerufen werden, werden die entsprechenden Audiosteuerungs-HAL-APIs vom Car-Audio-Dienst aufgerufen:

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

Die API ist auf allen Versionen der Audiosteuerung HAL verfügbar, einschließlich der neuen AIDL HAL-Schnittstelle.

Audio-Fokus-Anfrage von HAL

AAOS setzt, ähnlich wie Android, auf die aktive Beteiligung von Apps am Audio-Fokus, um die Audiowiedergabe in Autos zu verwalten. Die Fokusinformationen werden verwendet, um zu verwalten, welche Streams hinsichtlich Lautstärke und Ducking gesteuert werden sollen. Um den Audio-Fokus weiter auszubauen und eine bessere Integration fahrzeugspezifischer Sounds in das Android-Erlebnis zu ermöglichen, wurden in Android 11 die folgenden Audioattribute eingeführt:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

Zusätzlich zu dieser Änderung wurde ein Mechanismus hinzugefügt, damit Sounds, die von außerhalb von Android stammen, an Audio-Fokus-Anfragen teilnehmen können. Daher wurde die HIDL-Audiosteuerung HAL Version 2 eingeführt, um Fokusanfragen zu ermöglichen, die von außerhalb von Android stammen:

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

Wobei der IFocusListener wie folgt definiert ist:

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

Die oben genannten APIs können verwendet werden, um den Audiofokus vom HAL anzufordern bzw. aufzugeben. Als Reaktion darauf berücksichtigt der Car-Audio-Dienst die Audiofokusanforderung und leitet die Ergebnisse asynchron an die IAudioControl#onAudioFocusChange Methode weiter.

Diese API kann auch verwendet werden, um Änderungen für die Audiofokusanforderung zu überwachen, die von der Audiosteuerungs-HAL stammt. Im Allgemeinen gilt jede stehende Audio-Fokus-Anfrage vom HAL als aktiv , was sich von einer Audio-Fokus-Anfrage von Android unterscheidet, bei der nur eine entsprechende aktive Audiospurwiedergabe als aktiv angesehen wird.

Migrieren Sie HIDL zur AIDL-Audiosteuerung HAL

Mit dem Aufkommen von AIDL und der erforderlichen Migration in Android 12 (weitere Informationen finden Sie unter AIDL für HALs ) wurde die Audiosteuerungs-HAL auf AIDL migriert. Für vorhandene APIs der HIDL-Audiosteuerung Version 2 erforderte die Migration geringfügige Aktualisierungen der vorhandenen Methoden:

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

Und der entsprechende 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);
}

Stummschaltung der Lautstärkegruppe

Mit Android 12 wurde die Stummschaltung von Lautstärkegruppen eingeführt, um eine umfassendere Stummschaltungssteuerung während der Audiointeraktionen des Benutzers zu ermöglichen. Dadurch kann die Audiosteuerungs-HAL Stummschaltungsereignisse empfangen, die vom Car-Audio-Dienst abgefangen werden.

Um die Funktion zu aktivieren, müssen OEMs die audioUseCarVolumeGroupMuting Konfiguration in der config.xml des Fahrzeugservices auf „ true setzen:

<!-- 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>

Vor Android 13 musste die Konfiguration mit einem Laufzeitressourcen-Overlay für packages/services/Car/service/res/values/config.xml überschrieben werden (weitere Informationen finden Sie unter Anpassen des Builds mit Ressourcen-Overlays ). Ab Android 13 können Sie Laufzeitressourcen-Overlays verwenden, um einen Konfigurationswert zu ändern. Weitere Informationen finden Sie unter Ändern des Werts der Ressourcen einer App zur Laufzeit .

System-Apps können mithilfe der CarAudioManager#isAudioFeatureEnabled -API ermitteln, ob die Funktion aktiviert ist. Der übergebene Parameter muss die CarAudioManager.AUDIO_FEATURE_VOLUME_GROUP_MUTING -Konstante sein. Die Methode gibt true zurück, wenn die Funktion auf dem Gerät aktiviert ist, andernfalls false .

Zusätzlich zur Aktivierung der audioUseCarVolumeGroupMuting -Funktion muss die AIDL-Audiosteuerungs-HAL den Lautstärkegruppen-Stummschaltungsmechanismus implementieren:

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

Wobei Muting Info die relevanten Mute-Informationen für das Audiosystem enthält:

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 verfügt über zwei verschiedene Mechanismen zum Stummschalten, basierend auf:

  • Schlüsselereignisse mit dem Audio KEYCODE_VOLUME_MUTE {:.external}.

  • Direkte Aufrufe an den Car-Audio-Dienst über die Stummschaltungs-API des Car-Audio-Managers, CarAudioManager#setVolumeGroupMute .

Wenn sie aktiviert sind, lösen beide Mechanismen eine Anrufstummschaltung für die Audiosteuerung HAL aus.

Auto-Audio-Ducking

Mit Android 12 wurde Car Audio Ducking eingeführt, um die Steuerung der gleichzeitigen Wiedergabe von Audiostreams zu optimieren. Dadurch können OEMs ihr eigenes Ducking-Verhalten basierend auf der physischen Audiokonfiguration eines Fahrzeugs und dem aktuellen Wiedergabestatus implementieren, der vom Car-Audio-Dienst bestimmt wird.

Der Ducking-Mechanismus basiert auf den Änderungen des Audio-Fokusstapels. Immer wenn eine Fokusänderung auftritt (sei es eine Fokusanforderung oder ein Fokusabbruch), wird die Audiosteuerung HAL darüber informiert. Ähnlich wie die Stummschaltungsunterstützung für Auto-Lautstärkegruppen kann das Auto-Audio-Ducking mit dem Konfigurationsflag audioUseHalDuckingSignals aktiviert werden:

<!-- 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>

Um die Funktion zu aktivieren, muss die AIDL-Audiosteuerungs-HAL die entsprechende Logik mit dem vom Car-Audio-Dienst empfangenen Signal implementieren:

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

Die relevanten Audiosysteminformationen sind in den Audio-Ducking-Informationen enthalten:

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

Abgesehen von den Car-Audio-Konfigurationsinformationen, die in den Geräteadressen zum (Ent-)Ducking enthalten sind, enthalten Ducking-Informationen auch Informationen darüber, welche Audioattributverwendungen im Fokus stehen. Der Zweck dieser Daten besteht darin, das Audiosystem darüber zu informieren, welche Audioattributverwendungen aktiv sind.

Dies ist erforderlich, da in der Car-Audio-Konfiguration einem einzelnen Gerät mehrere Audioattribute zugewiesen werden können und ohne die zusätzlichen Informationen nicht klar ist, welche Nutzungen aktiv sind.

AIDL-Audiosteuerung HAL 2.0

Um APIs zu aktualisieren und neue Funktionen zu ermöglichen, wurde die AIDL-Audiosteuerungs-HAL in Android 13 auf Version 2.0 aktualisiert:

  • Audiofokus mit PlaybackTrackMetadata
  • Audio gewinnt Rückruf

Wiedergabemetadaten sind in android.hardware.audio.common wie folgt definiert:

parcelable PlaybackTrackMetadata {
       AudioUsage usage = INVALID;
       AudioContentType contentType = UNKNOWN;
       float gain;
       AudioChannelLayout channelMask;
       AudioDevice sourceDevice;
       String[] tags;
}

Alle anderen Funktionen der AIDL Audio Control Version 1.0 bleiben erhalten und können genutzt werden. Eine Ausnahme betrifft die Methode zur Änderung des Audiofokus, wie unter Zur Methode zur Änderung des Audiofokus beschrieben.

Fokus der Audiosteuerung mit Metadaten der Wiedergabespur

Um dem Audiosystem unterhalb des HAL mehr Informationen zur Verfügung zu stellen, stellen Updates jetzt PlaybackTrackMetadata bereit. Konkret wurde die Audiosteuerung HAL um eine neue Methode erweitert:

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

Eine ähnliche, entsprechende Änderung wird an IFocusListener vorgenommen:

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

Über die Methode zur Änderung des Audiofokus

Die oben genannten Fokusoperationen funktionieren auf die gleiche Weise wie die unter Audiofokusanforderung von HAL beschriebenen. Nur die Metadaten der Wiedergabespur enthalten weitere Informationen sowie die Verwendung der Audioattribute. Im Allgemeinen kann die aktualisierte Android-Steuerungs-HAL weiterhin die vorherigen Methoden verwenden, es sei denn, die zusätzlichen Informationen, die durch die Metadaten der Wiedergabespur bereitgestellt werden, werden benötigt.

Wenn HAL-Entwickler beschließen IAudioControl#onAudioFocusChangeWithMetaData nicht zu unterstützen, sollte die Methode Ergebnisse mit dem Fehler UNKNOWN_TRANSACTION zurückgeben, wie unter Verwendung versionierter Schnittstellenmethoden beschrieben.

Der Audiodienst ruft zuerst onAudioFocusChangeWithMetaData auf und versucht es dann erneut mit der onAudioFocusChange Methode, wenn ein UNKNOWN_TRANSACTION -Fehler auftritt.

Car-Audio-Ducking mit Metadaten der Wiedergabespur

Version 2.0 der AIDL-Audiosteuerung HAL fügte den Audio-Ducking-Informationen die Metadaten der Wiedergabespur hinzu:

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 ist veraltet. Entwickler sollten jetzt playbackMetaDataHoldingFocus verwenden, um die Verwendung von Audioattributen und andere Audioinformationen zu ermitteln. Allerdings enthält der Parameter usagesHoldingFocus weiterhin die erforderlichen Informationen, bis diese Option offiziell entfernt wird.

Rückruf zur Audioverstärkung

Um Audioänderungen unterhalb des HAL für das AAOS in Android 13 besser sichtbar zu machen, haben wir einen Mechanismus hinzugefügt, mit dem Sie Änderungen der Audioverstärkung vom Audiosystem des Autos an den Auto-Audiodienst kommunizieren können. Der Mechanismus macht Änderungen des Audio-Gain-Lautstärkeindex mit einem entsprechenden Grund für die Änderung der Verstärkung sichtbar:

  • Blockierte oder stummgeschaltete Einschränkungen
  • Einschränkungen Einschränkungen
  • Dämpfungsbeschränkungen

Durch diese Änderungen werden diese Einschränkungen unterhalb des HAL für den Car-Audio-Dienst und schließlich für eine System-UI-App offengelegt, um den Benutzer zu informieren. Der letzte Teil, die Offenlegung einer möglichen System-Benutzeroberfläche, wurde in Android 14 weiter erweitert, um es System-UI-Apps zu ermöglichen, diese Informationen leichter über einen Rückrufmechanismus für Volumengruppeninformationen abzurufen.

Die Audiosteuerungs-HAL-API registriert den Verstärkungsrückruf wie folgt:

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

Der IAudioGainCallback ist wie folgt definiert:

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

Wie in der API-Dokumentation hervorgehoben, wird der Verstärkungsrückruf vom Car-Audio-Dienst im Audiosteuerungs-HAL registriert. Wenn die API von der Audiosteuerungs-HAL aufgerufen wird, antwortet der Car-Audio-Dienst mit einer entsprechenden Aktion (z. B. Blockieren, Begrenzen oder Abschwächen des Verstärkungsindex).

Der HAL bestimmt, wann die API aufgerufen wird, hauptsächlich um Änderungen am Gain-Index-Status zu melden. Gemäß den gesetzlichen Anforderungen sollte das Audiosystem des Fahrzeugs die erforderlichen Maßnahmen ergreifen und den Rückruf verwenden, um Informationen an den Audiodienst des Fahrzeugs zu übermitteln, um die Nutzung durch den Benutzer zu ermöglichen. Beispielsweise, um dem Benutzer eine Benutzeroberfläche anzuzeigen.

AIDL-Audiosteuerung HAL 3.0

Die Android 14 AIDL-Audiosteuerungs-HAL-Version wurde auf Version 3.0 aktualisiert, um die APIs zu aktualisieren und eine robustere Audio-Gain-Index-Funktionalität bereitzustellen. Mit der Audiosteuerungs-HAL-API kann der Audiodienst einen IModuleChangeCallback festlegen und deaktivieren:

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

Der setModuleChangeCallback wird vom Car-Audio-Dienst registriert, wenn der Dienst startet oder bei der Wiederherstellung nach einem Fehler. Zum Beispiel eine vom Car-Audio-Dienst empfangene Todesmeldung eines Audiosteuerungs-HAL-Ordners. Die HAL-Implementierung der Audiosteuerung sollte alle vorhandenen Moduländerungsrückrufe ersetzen, wenn die API aufgerufen wird.

Für die API clearModuleChangeCallback sollte die Implementierung den vorhandenen Rückruf löschen oder nichts unternehmen, wenn keiner vorhanden ist. Für die Audiosteuerungsimplementierung empfiehlt es sich, einen Todesbeobachter für den Rückruf zu registrieren und den Rückruf dann zu löschen, wenn der Ein-Binder-Tod ausgelöst wird.

IModuleChangeCallback ist wie folgt definiert:

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

Wenn der Moduländerungsrückruf vom Car-Audio-Dienst registriert wird, ist er bereit, Audio-Port-Änderungen über die onAudioPortChanged API zu empfangen. Über die API können Lautstärkeanhebungen für das Audiosystem initialisiert werden, sobald der Rückruf registriert wird. Für andere dynamische Verstärkungsänderungen kann die API jederzeit aufgerufen werden. Entsprechende Änderungen werden übernommen und der Car-Audio-Dienst entsprechend aktualisiert.