Audiosteuerung HAL

Die Audio Control HAL wurde in Android 9 eingeführt, um Audioanwendungsfälle zu unterstützen, die für die Automobilbranche relevant sind. Ab Android 14 unterstützt die Audio Control HAL Folgendes:

  • Ein- und Ausblenden sowie Ausbalancieren
  • HAL-Anfrage für Audiofokus
  • Stummschalten und Ducking von Geräten
  • Änderungen an der Verstärkung des Audiogeräts
  • Änderungen an der Audio-Portkonfiguration

Abbildung 1 zeigt einen allgemeinen Überblick über die Architektur des Autoaudiodienstes, bei der der Autoaudiodienst mit der Audiosteuerungs-HAL kommuniziert.

Mehrzonen-Audio konfigurieren

Abbildung 1: Mehrzonen-Audio konfigurieren

Audioausblendung und -balance

Die HIDL Audio Control HAL Version 1 wurde in Android 9 eingeführt, um Audio-Einblendungen und -Balance für den Einsatz in Autos zu unterstützen. Abgesehen von den bereits in Android verfügbaren generischen Audioeffekten ermöglicht dieser Mechanismus System-Apps, die Audiobalance über CarAudioManager APIs festzulegen und auszublenden:

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

Nach dem Aufruf dieser APIs werden die entsprechenden HAL-APIs für die Audiosteuerung vom Autoaudiodienst 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 für alle Versionen der Audio Control HAL verfügbar, einschließlich der neuen AIDL HAL-Schnittstelle.

Audiofokusanfrage von HAL

Ähnlich wie bei Android ist für die Audiowiedergabe in Autos die aktive Teilnahme von Apps am Audiofokus erforderlich. Anhand der Fokusinformationen wird gesteuert, für welche Streams die Lautstärke und das Stummschalten verwaltet werden sollen. Um den Audiofokus weiter zu erweitern und fahrzeugspezifische Töne besser in Android zu integrieren, wurden in Android 11 die folgenden Audioattribute eingeführt:

  • EMERGENCY
  • SAFETY
  • VEHICLE_STATUS
  • ANNOUNCEMENT

Zusätzlich zu dieser Änderung wurde ein Mechanismus hinzugefügt, mit dem Töne, die nicht von Android stammen, an Anfragen für den Audiofokus teilnehmen können. Daher wurde die HIDL Audio Control HAL Version 2 eingeführt, um Fokusanfragen zu ermöglichen, die 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);
}

Dabei ist IFocusListener so definiert:

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

Mit den oben genannten APIs können Sie den Audiofokus von der HAL anfordern bzw. aufheben. Als Reaktion berücksichtigt der Autoaudiodienst die Audiofokusanfrage und leitet die Ergebnisse asynchron an die IAudioControl#onAudioFocusChange-Methode weiter.

Mit dieser API können Sie auch Änderungen für die Audiofokusanfrage überwachen, die von der Audio Control HAL stammt. Im Allgemeinen gilt jede laufende Audiofokusanfrage von der HAL als aktiv. Dies unterscheidet sich von einer Audiofokusanfrage von Android, bei der nur eine entsprechende aktive Audiotrackwiedergabe als aktiv gilt.

HIDL-Audiosteuerungs-HAL zu AIDL migrieren

Mit der Einführung von AIDL und der erforderlichen Migration in Android 12 (weitere Informationen finden Sie unter AIDL für HALs) wurde die HAL für die Audiosteuerung zu AIDL migriert. Für vorhandene HIDL-Audiosteuerungs-APIs der Version 2 waren bei der Migration nur geringfügige Änderungen an den vorhandenen Methoden erforderlich:

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

Stummschalten von Volume-Gruppen

Mit Android 12 wurde die Stummschaltung von Lautstärkegruppen eingeführt, um eine umfassendere Stummschaltung während der Audiointeraktionen des Nutzers zu ermöglichen. So kann die HAL für die Audiosteuerung Stummschaltungsereignisse erhalten, die vom Audiodienst des Autos abgefangen wurden.

Um die Funktion zu aktivieren, müssen OEMs die audioUseCarVolumeGroupMuting-Konfiguration im Autodienst config.xml auf true festlegen:

<!-- 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 Laufzeit-Ressourcen-Overlay für packages/services/Car/service/res/values/config.xml überschrieben werden. Weitere Informationen finden Sie unter Build mit Ressourcen-Overlays anpassen. Ab Android 13 können Sie mithilfe von Laufzeitressourcenüberlagerungen einen Konfigurationswert ändern. Weitere Informationen finden Sie unter Wert der Ressourcen einer App zur Laufzeit ändern.

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

Neben der Aktivierung der audioUseCarVolumeGroupMuting-Funktion muss die HAL für die Audiosteuerung von AIDL den Mechanismus zum Stummschalten von Lautstärkegruppen 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);
}

Die Informationen zur Stummschaltung enthalten die relevanten Informationen zur Stummschaltung für das Audiosystem:

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 bietet zwei verschiedene Stummschaltungsmechanismen:

  • Schlüsselereignisse mit der Audiotaste KEYCODE_VOLUME_MUTE

  • Direkte Aufrufe des Autoaudiodienstes über die API „Car Audio Manager mute“,CarAudioManager#setVolumeGroupMute.

Wenn beide Mechanismen aktiviert sind, wird die Stummschaltung des Anrufs an die HAL für die Audiosteuerung ausgelöst.

Ducking der Auto-Audioanlage

Mit Android 12 wurde die Funktion „Audioducking für Auto“ eingeführt, um die Steuerung der gleichzeitigen Wiedergabe von Audiostreams zu optimieren. So können OEMs ihr eigenes Ducking-Verhalten basierend auf der physischen Audiokonfiguration eines Autos und dem aktuellen Wiedergabestatus implementieren, der vom Audiodienst des Autos bestimmt wird.

Der Ducking-Mechanismus basiert auf den Änderungen am Audiofokus-Stack. Jedes Mal, wenn sich der Fokus ändert (sei es durch eine Fokusanfrage oder ein Aufheben des Fokus), wird die HAL für die Audiosteuerung benachrichtigt. Ähnlich wie bei der Unterstützung für die Stummschaltung von Lautstärkegruppen im Auto kann die Audio-Unterdrückung im Auto 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 HAL für die AIDL-Audiosteuerung die entsprechende Logik mit dem vom Autoaudiodienst 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 Informationen zum Audiosystem sind in den Informationen zur Audioducking-Funktion 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;
}

Neben den Informationen zur Konfiguration des Autoaudios in den Geräteadressen, die zum Stummschalten und Aktivieren der Unterdrückung verwendet werden, enthalten Informationen zur Unterdrückung auch Informationen dazu, welche Audioattributnutzungen den Fokus halten. Mit diesen Daten wird das Audiosystem darüber informiert, welche Audioattribute aktiv sind.

Dies ist erforderlich, da in der Audiokonfiguration für Autos einem einzelnen Gerät mehrere Audioattribute zugewiesen werden können. Ohne die zusätzlichen Informationen ist nicht klar, welche Verwendungen aktiv sind.

AIDL-Audiosteuerung HAL 2.0

Zur Aktualisierung von APIs und zur Implementierung neuer Funktionen wurde die HAL für die AIDL-Audiosteuerung in Android 13 auf Version 2.0 aktualisiert:

  • Audiofokus mit PlaybackTrackMetadata
  • Rückruf für Audioverstärkung

Wiedergabemetadaten sind in android.hardware.audio.common so definiert:

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

Alle anderen Funktionen der AIDL-Audiosteuerung Version 1.0 wurden beibehalten und können verwendet werden. Eine Ausnahme gilt für die Methode zur Änderung des Audiofokus, wie unter On audio focus change method (Methode zur Änderung des Audiofokus) beschrieben.

Audiofokus mit Metadaten des Wiedergabe-Tracks steuern

Um dem Audiosystem unter der HAL mehr Informationen zur Verfügung zu stellen, wird in Updates jetzt PlaybackTrackMetadata freigegeben. Insbesondere wurde die HAL für die Audiosteuerung 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);
}

Methode zum Ändern des Audiofokus

Die oben beschriebenen Fokusfunktionen funktionieren genauso wie die in Audiofokusanfrage von HAL beschriebenen. Nur die Metadaten des Wiedergabe-Tracks enthalten weitere Informationen sowie die Verwendungen der Audioattribute. Im Allgemeinen können die bisherigen Methoden in der aktualisierten Android Control HAL weiter verwendet werden, sofern die zusätzlichen Informationen aus den Metadaten des Wiedergabe-Tracks nicht benötigt werden.

Wenn HAL-Entwickler IAudioControl#onAudioFocusChangeWithMetaData nicht unterstützen, sollte die Methode Ergebnisse mit dem Fehler UNKNOWN_TRANSACTION zurückgeben, wie unter Versionierte Schnittstellenmethoden verwenden beschrieben.

Der Audiodienst ruft zuerst onAudioFocusChangeWithMetaData auf und versucht dann mit der Methode onAudioFocusChange noch einmal, falls ein UNKNOWN_TRANSACTION-Fehler auftritt.

Unterdrücken von Autoaudio mit Metadaten des Wiedergabetracks

In Version 2.0 der HAL für die Audiosteuerung von AIDL wurden den Informationen zur Audioducking-Funktion die Metadaten des Wiedergabetracks hinzugefügt:

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

Rückruf für Audioverstärkung

Damit Audioänderungen unter der HAL für das AAOS in Android 13 besser sichtbar sind, haben wir einen Mechanismus hinzugefügt, mit dem Sie Änderungen der Audioverstärkung vom Audiosystem des Autos an den Audiodienst des Autos senden können. Der Mechanismus zeigt Änderungen des Lautstärkeindex für die Audioverstärkung mit dem jeweiligen Grund für die Änderung der Verstärkung an:

  • Blockierte oder stummgeschaltete Einschränkungen
  • Einschränkungen
  • Einschränkungen bei der Dämpfung

Durch diese Änderungen werden diese Einschränkungen von unterhalb der HAL an den Autoaudiodienst und schließlich an eine System-UI-App weitergegeben, um den Nutzer zu informieren. Der letzte Teil, die Einblendung einer möglichen System-UI, wurde in Android 14 weiter ausgebaut, damit Apps mit System-UI diese Informationen leichter über einen Rückrufmechanismus für Informationen zu Volumegruppen abrufen können.

Die HAL API für die Audiosteuerung registriert den Gain-Callback so:

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 so 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 Gain-Callback vom Autoaudiodienst bei der HAL für die Audiosteuerung registriert. Wenn die API von der Audiosteuerungs-HAL aufgerufen wird, antwortet der Audiodienst des Autos mit einer entsprechenden Aktion (z. B. Blockieren, Begrenzen oder Dämpfen des Verstärkungsindexes).

Die HAL bestimmt, wann die API aufgerufen wird, hauptsächlich um Änderungen am Status des Gewinnindex zu melden. Gemäß den gesetzlichen Bestimmungen sollte das Audiosystem des Autos die erforderlichen Maßnahmen ergreifen und über den Rückruf Informationen an den Audiodienst des Autos senden, um die Nutzung durch den Nutzer zu ermöglichen. Beispielsweise, um dem Nutzer eine Benutzeroberfläche anzuzeigen.

AIDL-Audiosteuerung HAL 3.0

Die HAL-Version der Android 14-AIDL-Audiosteuerung wurde auf Version 3.0 aktualisiert, um die APIs zu aktualisieren und eine robustere Funktion für den Audio-Verstärkungsindex bereitzustellen. Mit der HAL API für die Audiosteuerung kann der Audiodienst Folgendes festlegen und aufheben: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();
}

Die setModuleChangeCallback wird vom Autoaudiodienst beim Starten des Dienstes oder bei der Wiederherstellung nach einem Fehler registriert. Beispiel: Eine HAL-Binder-Benachrichtigung über den Tod der Audiosteuerung, die vom Audiodienst des Autos empfangen wird. Die HAL-Implementierung der Audiosteuerung sollte beim Aufruf der API alle vorhandenen Rückruffunktionen für Moduländerungen ersetzen.

Bei der clearModuleChangeCallback API sollte die Implementierung den vorhandenen Callback löschen oder nichts tun, wenn keiner vorhanden ist. Es wird empfohlen, bei der Implementierung der Audiosteuerung einen Callback-Beobachter für den Rückruf zu registrieren und den Rückruf dann zu löschen, wenn der Binder beendet wird.

IModuleChangeCallback ist so 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 Rückruf für die Moduländerung vom Autoaudiodienst registriert wurde, kann er Audioportänderungen über die onAudioPortChanged API empfangen. Mit der API können Lautstärkeverstärkungen für das Audiosystem initialisiert werden, sobald der Rückruf registriert wurde. Bei anderen dynamischen Verstärkungsänderungen kann die API jederzeit aufgerufen werden. Entsprechende Änderungen werden angewendet und der Autoaudiodienst wird entsprechend aktualisiert.