Audiofokus

Vor dem Starten eines logischen Streams fordert eine App den Audiofokus mit denselben Audioattributen an, die für den logischen Stream verwendet werden. Die App muss Fokusverluste berücksichtigen, um in Anwendungsfällen im Automobilbereich die erwartete Leistung zu erbringen.

Das Senden einer Fokusanfrage wird zwar empfohlen, wird jedoch vom System nicht erzwungen. Betrachten Sie den Fokus daher als Mittel zur indirekten Kontrolle und Vermeidung von Konflikten während der Wiedergabe und nicht als primären Audiokontrollmechanismus. Das Fahrzeug sollte für den Betrieb des Audio-Subsystems nicht auf das Fokussystem angewiesen sein.

Konzentrieren Sie sich auf Interaktionen

Zur Unterstützung von AAOS werden Audio-Fokus-Anfragen auf der Grundlage vordefinierter Interaktionen zwischen dem CarAudioContext der Anfrage und dem der aktuellen Fokus-Inhaber bearbeitet. Es gibt drei Arten von Interaktionen:

  • Exklusiv
  • Ablehnen
  • Gleichzeitig

Exklusive Interaktion

Dies ist das bei Android am häufigsten verwendete Interaktionsmodell.

Bei exklusiven Interaktionen darf jeweils nur eine App den Fokus behalten. Daher wird einer eingehenden Fokusanforderung der Fokus gewährt, während der bestehende Fokusinhaber den Fokus verliert. Da beide Apps Medien abspielen, darf nur eine App den Fokus behalten. Infolgedessen wird die Fokusanforderung der neu gestarteten App mit AUDIOFOCUS_REQUEST_GRANTED zurückgegeben, während die App, die gerade Musik abspielt, ein Fokusänderungsereignis mit einem Verluststatus empfängt, der dem Typ der gestellten Anforderung entspricht.

Interaktion ablehnen

Bei Ablehnungsinteraktionen wird die eingehende Anfrage immer abgelehnt. Zum Beispiel, wenn Sie versuchen, während eines Anrufs Musik abzuspielen. Wenn in diesem Fall der Dialer den Audiofokus für einen Anruf behält und eine zweite App den Fokus zum Abspielen von Musik anfordert, erhält die Musik-App als Antwort auf die Anfrage AUDIOFOCUS_REQUEST_FAILED . Da die Fokusanforderung abgelehnt wird, wird kein Fokusverlust an den aktuellen Fokusinhaber weitergeleitet.

Gleichzeitige Interaktion

Einzigartig bei AAOS sind gleichzeitige Interaktionen. Dies gibt Apps, die im Auto einen Audiofokus anfordern, die Möglichkeit, den Fokus gleichzeitig mit anderen Apps beizubehalten. Damit eine gleichzeitige Interaktion stattfinden kann, müssen die folgenden Bedingungen erfüllt sein. Der:

Wenn diese Kriterien erfüllt sind, wird die Fokusanforderung mit AUDIOFOCUS_REQUEST_GRANTED zurückgegeben, während der aktuelle Fokusinhaber keine Änderung im Fokus hat. Wenn sich der aktuelle Fokusinhaber jedoch dafür entscheidet, Duck-Ereignisse zu empfangen oder beim Ducken zu pausieren, verliert der aktuelle Fokusinhaber den Fokus, wie es bei einer exklusiven Interaktion der Fall ist.

Umgang mit gleichzeitigen Streams

Während die gleichzeitige Interaktion zahlreiche Verwendungsmöglichkeiten hat, sollten Sie beim Mischen und Ducken auf Hardwareebene über die Ausgabegeräte hinweg vorsichtig sein. Wir empfehlen dringend, CarAudioContext , die gleichzeitig abgespielt werden dürfen, an verschiedene Ausgabegeräte weiterzuleiten.

Durch die Verwendung separater Ausgabegeräte für gleichzeitige Streams ermöglicht dies dem HAL, einen der Streams vor dem Mischen auszublenden oder die physischen Streams an verschiedene Lautsprecher im Fahrzeug weiterzuleiten. Wenn die logischen Streams innerhalb von Android gemischt werden, bleiben die Gewinne unverändert und werden als Teil desselben physischen Streams bereitgestellt.

Wenn beispielsweise Navigation und Medien gleichzeitig bereitgestellt werden, könnte die Verstärkung für den Medienstream vorübergehend reduziert (oder geduckt) werden, damit Navigationsanweisungen klarer gehört werden können. Alternativ könnte der Navigationsstream zu den Lautsprechern auf der Fahrerseite geleitet werden, während die Medien im restlichen Innenraum weiter abgespielt werden.

Interaktionsmatrix

Die folgende Tabelle zeigt die von CarAudioService definierte Interaktionsmatrix. Jede Zeile stellt den CarAudioContext des aktuellen Fokusinhabers dar und jede Spalte stellt den CarAudioContext der eingehenden Anforderung dar.

Wenn beispielsweise eine Musikmedien-App den Fokus behält, während eine Navigations-App den Fokus anfordert, gibt die Matrix an, dass die beiden Interaktionen gleichzeitig abgespielt werden können, vorausgesetzt, die anderen Kriterien für gleichzeitige Interaktionen sind erfüllt.

Aufgrund der gleichzeitigen Interaktionen ist es möglich, mehr als einen Fokusinhaber zu haben. In diesem Fall wird eine eingehende Fokusanfrage mit jedem der aktuellen Fokusinhaber verglichen, bevor bestimmt wird, welche Interaktion angewendet werden soll. In diesem Fall gewinnt die konservativste Interaktion. Ablehnen, dann exklusiv und schließlich gleichzeitig.

Audio-Fokus-Interaktionsmatrix

Abbildung 1. Audio-Fokus-Interaktionsmatrix.

In Android 11 wurde eine neue Benutzereinstellung eingeführt, mit der Benutzer das Interaktionsverhalten zwischen Navigation und Telefonanrufen ändern können. Wenn diese Einstellung festgelegt ist, ändert android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL die Interaktion zwischen eingehenden NAVIGATION Fokusanforderungen und aktuellen CALL Fokusinhabern von „ gleichzeitig“ in „ablehnen “. Wenn ein Benutzer möchte, dass Navigationsanweisungen einen Anruf nicht unterbrechen, kann er die Einstellung aktivieren. Dies bleibt für den Benutzer bestehen und kann dynamisch festgelegt werden, sodass nachfolgende Fokusanforderungen die neue Einstellung berücksichtigen.

Verzögerbarer Audiofokus

In Android 11 hat AAOS Unterstützung für die Anforderung eines verzögerbaren Audiofokus hinzugefügt. Dadurch können nichtflüchtige Fokusanfragen verzögert werden, wenn ihre Interaktion mit aktuellen Fokusinhabern normalerweise dazu führen würde, dass sie abgelehnt werden. Sobald eine Fokusänderung zu einem Zustand führt, in dem die verzögerte Anfrage den Fokus erlangen kann, wird der Anfrage stattgegeben.

Regeln für verzögerte Audio-Fokus-Anfragen

  • Nur nicht vorübergehende Anfragen. Eine verzögerte Anfrage kann nur für nichtflüchtige Quellen gestellt werden, um zu vermeiden, dass ein vorübergehender Ton lange nach seiner Relevanz abgespielt wird.

  • Es kann jeweils nur eine Anfrage verzögert werden. Wenn eine verzögerbare Anfrage gestellt wird, während bereits eine verzögerte Anfrage vorliegt, empfängt die ursprüngliche verzögerte Anfrage ein AUDIOFOCUS_LOSS Änderungsereignis und die neue Anfrage erhält eine synchrone Antwort von AUDIOFOCUS_REQUEST_DELAYED .

  • Verzögerbare Anforderungen müssen über einen OnAudioFocusChangeListener verfügen . Sobald eine Anforderung verzögert wird, wird der Listener verwendet, um den Anforderer zu benachrichtigen, wenn die Anforderung schließlich gewährt wird ( AUDIOFOCUS_GAIN ) oder wenn sie später abgelehnt wird ( AUDIOFOCUS_LOSS ).

Fordern Sie einen verzögerbaren Fokus an

So erstellen Sie eine Anfrage, die verzögert werden kann:

  1. Verwenden Sie AudioFocusRequest.Builder#setAcceptsDelayedFocusGain .

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. Behandeln Sie beim Stellen der Anfrage die Antwort AUDIOFOCUS_REQUEST_DELAYED :

    int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // start audio playback
        return;
    }
    if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
         // audio playback delayed to audio focus listener
         return;
    }
    
  3. Wenn die Anfrage verzögert wird, verarbeitet der Fokus-Listener Änderungen im Fokus:

    private final class MediaWithDelayedFocusListener implements
    OnAudioFocusChangeListener {
           @Override
           public void onAudioFocusChange(int focusChange) {
               synchronized (mLock) {
                   switch (focusChange) {
                       case AudioManager.AUDIOFOCUS_GAIN:
                           … // Start focus playback
                       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                           … // Pause media transiently
                       case AudioManager.AUDIOFOCUS_LOSS:
                           … // Stop media
    

Mehrzonen-Fokusmanagement

Bei Fahrzeugen mit mehreren Audiozonen wird der Audiofokus für jede Zone unabhängig verwaltet. Daher berücksichtigt eine Anfrage an eine Zone nicht, was in anderen Zonen den Fokus hält, und führt auch nicht dazu, dass Fokusinhaber in anderen Zonen den Fokus verlieren. Dadurch kann der Fokus der Hauptkabine getrennt von einem Fond-Entertainment-System verwaltet werden, sodass die Audiowiedergabe in einer Zone nicht durch Fokusänderungen in einer anderen unterbrochen wird.

Für alle Apps verwaltet der CarAudioService automatisch den Fokus. Die Audiozone einer Fokusanforderung wird durch die zugehörige UserId oder UID bestimmt (Einzelheiten finden Sie unter Audio-Routing ).

Fordern Sie Audio aus mehreren Zonen gleichzeitig an

Wenn eine App Audio in mehreren Zonen gleichzeitig abspielen möchte, muss sie den Fokus für jede Zone anfordern, indem sie AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID in das Bundle einschließt:

//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

//Create focus request using built attributesWithZone

Dieser Bundle-Parameter ermöglicht es dem Anforderer, die automatischen Audiozonenzuordnungen zu überschreiben und stattdessen die angegebene Zonen-ID zu verwenden. Daher könnte eine App separate Anfragen für verschiedene Audiozonen stellen.

HAL-Audiofokus

Ab Android 11 kann HAL den Fokus für externe Streams anfordern. Die Verwendung dieser APIs ist zwar optional, wird jedoch dringend empfohlen, damit externe Sounds optimal in das Android-Ökosystem integriert werden und ein nahtloses Benutzererlebnis bieten.

Der HAL trifft die endgültige Entscheidung darüber, welche Geräusche Vorrang haben sollen. In diesem Umfang sollten Notfall- und sicherheitskritische Geräusche unabhängig davon abgespielt werden, ob dem HAL der Audiofokus gewährt wird oder nicht, und sollten entsprechend weiterhin abgespielt werden, auch wenn der HAL den Audiofokus verliert. Das Gleiche gilt für alle Geräusche, die aufgrund staatlicher Vorschriften erforderlich sind.

Der HAL sollte Android-Streams bei Bedarf proaktiv stummschalten, wenn Notfall- oder sicherheitskritische Töne abgespielt werden, um sicherzustellen, dass sie deutlich gehört werden.

AudioControl@2.0

Version 2.0 von AudioControl HAL führt diese neuen APIs ein:

API Zweck
IAudioControl#registerFocusListener Registriert eine Instanz von IFocusListener bei der AudioControl-HAL. Mit diesem Listener kann der HAL den Audiofokus anfordern und aufgeben. Die HAl stellt eine ICloseHandle Instanz bereit, die von Android zum Aufheben der Registrierung des Listeners verwendet werden kann.
IAudioControl#onAudioFocusChange Benachrichtigt die HAL über Statusänderungen an Fokusanfragen, die von der HAL über den IFocusListener vorgenommen werden, einschließlich Antworten auf anfängliche Fokusanfragen.
IFocusListener#requestAudioFocus Anfragen konzentrieren sich im Namen des HAL auf eine bestimmte Nutzung, Zonen-ID und einen Fokusverstärkungstyp.
IFocusListener#abandonAudioFocus Verwirft bestehende HAL-Fokusanforderungen für die angegebene Nutzung und Zonen-ID.

Der HAL kann mehrere Fokusanfragen gleichzeitig haben, ist jedoch auf eine Anfrage pro Nutzung und Zonen-ID-Paarung beschränkt. Android geht davon aus, dass der HAL sofort mit der Wiedergabe von Sounds für eine Nutzung beginnt, sobald eine Anfrage gestellt wurde, und fährt damit fort, bis er den Fokus verlässt.

Anders als registerFocusListener handelt es sich bei diesen Anfragen oneway um eine Möglichkeit, um sicherzustellen, dass Android den HAL nicht verzögert, während eine Fokusanforderung verarbeitet wird. Der HAL sollte nicht darauf warten, sich zu konzentrieren, bevor er sicherheitskritische Geräusche abspielt. Es ist optional, dass die HAL über IAudioControl#onAudioFocusChange auf Änderungen im Audiofokus wartet und darauf reagiert.

OEM-Car-Audio-Fokusservice

In Android 14 führte AAOS die Auto-OEM-Plugin-Dienste ein, um die Konfigurierbarkeit für einige Autokomponenten zu ermöglichen. Für den Car-Audio-Plugin-Dienst ermöglicht der Plugin-Dienst OEMs die Verwaltung von Fokusanfragen, die vom Car-Audio-Dienst abgefangen werden. Dies gibt OEMs mehr Flexibilität bei der Steuerung des Fokus gemäß den Vorschriften und Vorschriften. Daher kann die Audio-Fokus-Interaktion von Hersteller zu Hersteller und von Region zu Region unterschiedlich sein. Die Grundvoraussetzung für den Audio-Fokus gilt weiterhin: Apps sollten weiterhin den Fokus anfordern, um Audio besser verwalten und das Benutzererlebnis verbessern zu können. Generell gelten weiterhin bestimmte Regeln für die Audio-Fokus-Anfrage durch Apps:

  • Ohne einen ständigen Audiofokus mit hoher Priorität (einschließlich eines Telefonanrufs, eines Notfallalarms oder einer Sicherheitsbenachrichtigung) sollten Apps in der Lage sein, vorübergehend oder dauerhaft den Audiofokus zu erlangen.

  • Während ein Medienfokus aktiv ist:

    • Apps, die den Fokus auf die Anrufnutzung anfordern, sollten den Anruf entweder gleichzeitig oder ausschließlich empfangen können.

    • Apps, die den Navigationsnutzungsfokus anfordern, sollten den Navigationsfokus entweder gleichzeitig oder ausschließlich erhalten können.

    • Apps, die den Nutzungsfokus des Assistenten anfordern, sollten den Nutzungsfokus entweder gleichzeitig oder ausschließlich erhalten können.

  • Während Apps mit hoher Audiofokus-Priorität (einschließlich eines Telefonanrufs, eines Notfallalarms oder einer Sicherheitsbenachrichtigung) aktiv sind, sollte jeder eingehenden verzögerten Audiofokus-Anfrage nach Bedarf stattgegeben oder verzögert werden.

Obwohl die oben genannten Vorschläge keinen Anspruch auf Vollständigkeit erheben, können sie Apps, die den Fokus anfordern, dabei helfen, den Fokus zu erhalten, wenn keine aktiven Töne mit hoher Priorität vorhanden sind. Auch wenn Töne mit hoher Priorität aktiv sind, sollten verzögerte Fokusanforderungen weiterhin berücksichtigt werden und in der Lage sein, den Fokus zu erlangen, wenn der Ton mit hoher Priorität stoppt.