Aktywność audio

Przed uruchomieniem strumienia logicznego aplikacja żąda fokusu audio, korzystając z tych samych atrybutów audio, które są używane w przypadku strumienia logicznego. Aby aplikacja działała zgodnie z oczekiwaniami w zastosowaniach motoryzacyjnych, musi uwzględniać straty skupienia.

Chociaż wysyłanie żądania skupienia jest zalecane, nie jest ono wymuszane przez system. Dlatego też traktuj fokus jako sposób pośredniej kontroli i unikania konfliktów podczas odtwarzania, a nie jako główny mechanizm kontroli dźwięku. Pojazd nie powinien być zależny od systemu ostrości w zakresie obsługi podsystemu audio.

Skup się na interakcjach

Aby obsługiwać AAOS, żądania fokusu audio są obsługiwane w oparciu o predefiniowane interakcje między CarAudioContext żądania a bieżącymi posiadaczami fokusu. Istnieją trzy typy interakcji:

  • Ekskluzywny
  • Odrzucić
  • Równoległy

Ekskluzywna interakcja

Jest to model interakcji najczęściej używany w systemie Android.

W ekskluzywnych interakcjach tylko jedna aplikacja może w danym momencie utrzymywać fokus. Dlatego też przychodzące żądanie fokusu otrzymuje fokus, podczas gdy istniejący posiadacz fokusu traci fokus. Ponieważ obie aplikacje odtwarzają multimedia, tylko jedna może zachować fokus. W rezultacie żądanie fokusu nowo uruchomionej aplikacji jest zwracane z AUDIOFOCUS_REQUEST_GRANTED , podczas gdy aplikacja aktualnie odtwarzająca muzykę otrzymuje zdarzenie zmiany fokusu ze statusem utraty odpowiadającym typowi wysłanego żądania.

Odrzuć interakcję

W przypadku interakcji odrzucających przychodzące żądanie jest zawsze odrzucane. Na przykład podczas próby odtwarzania muzyki w trakcie połączenia. W takim przypadku, jeśli Dialer utrzyma fokus audio dla połączenia, a druga aplikacja zażąda fokusu w celu odtwarzania muzyki, aplikacja muzyczna otrzyma w odpowiedzi AUDIOFOCUS_REQUEST_FAILED . Ponieważ żądanie fokusu zostało odrzucone, do bieżącego posiadacza fokusu nie jest wysyłana żadna utrata fokusu.

Równoczesna interakcja

Unikalne dla AAOS są jednoczesne interakcje. Dzięki temu aplikacje żądające w samochodzie ustawienia ostrości audio mogą utrzymać fokus jednocześnie z innymi aplikacjami. Aby doszło do jednoczesnej interakcji, muszą zostać spełnione następujące warunki. :

Jeśli te kryteria są spełnione, żądanie fokusu powraca z AUDIOFOCUS_REQUEST_GRANTED , podczas gdy bieżący posiadacz fokusu nie zmienił fokusu. Jeśli jednak aktualny posiadacz fokusu zdecyduje się na otrzymywanie zdarzeń kaczek lub pauzę po schyleniu, bieżący posiadacz fokusu traci fokus, co ma miejsce w przypadku interakcji na wyłączność.

Obsługa współbieżnych strumieni

Chociaż jednoczesna interakcja ma wiele zastosowań, należy zachować ostrożność podczas miksowania i wyciszania na poziomie sprzętowym pomiędzy urządzeniami wyjściowymi. Zdecydowanie zalecamy, aby obiekty CarAudioContext , które mogą odtwarzać jednocześnie, były kierowane do różnych urządzeń wyjściowych.

Dzięki oddzielnym urządzeniom wyjściowym dla współbieżnych strumieni umożliwia to HAL wyciszenie jednego ze strumieni przed ich zmieszaniem lub skierowanie fizycznych strumieni do różnych głośników w pojeździe. Jeśli strumienie logiczne są mieszane w systemie Android, zyski pozostają niezmienione i dostarczane jako część tego samego strumienia fizycznego.

Na przykład, gdy nawigacja i multimedia są dostarczane jednocześnie, wzmocnienie strumienia multimediów można tymczasowo zmniejszyć (lub wyciszyć), aby instrukcje nawigacji były wyraźniejsze. Alternatywnie strumień nawigacyjny można skierować do głośników po stronie kierowcy, podczas gdy multimedia będą nadal odtwarzane w pozostałej części kabiny.

Macierz interakcji

Poniższa tabela przedstawia macierz interakcji zdefiniowaną przez CarAudioService . Każdy wiersz reprezentuje CarAudioContext bieżącego posiadacza fokusu, a każda kolumna reprezentuje żądanie przychodzące.

Na przykład, gdy aplikacja do obsługi multimediów muzycznych utrzymuje fokus, gdy aplikacja nawigacyjna żąda fokusu, macierz wskazuje, że dwie interakcje mogą być odtwarzane jednocześnie, zakładając, że spełnione są inne kryteria równoczesnych interakcji .

Ze względu na równoczesne interakcje możliwe jest posiadanie więcej niż jednego posiadacza fokusu. W takim przypadku przychodzące żądanie fokusu jest porównywane z każdym z bieżących posiadaczy fokusu przed określeniem, jaką interakcję zastosować. W tym przypadku wygrywa najbardziej konserwatywna interakcja. Odrzuć, potem wyłączność, a na końcu współbieżność.

Matryca interakcji fokusu audio

Rysunek 1. Macierz interakcji fokusu audio.

W Androidzie 11 wprowadzono nowe ustawienie użytkownika, które pozwala użytkownikom zmieniać zachowanie interakcji między nawigacją a rozmowami telefonicznymi. Po ustawieniu, android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL zmienia interakcję pomiędzy przychodzącymi żądaniami fokusu NAVIGATION i bieżącymi posiadaczami fokusu CALL z równoczesnych na odrzucane . Jeśli użytkownik woli, aby instrukcje nawigacyjne nie zakłócały połączenia, może włączyć to ustawienie. Jest to zachowywane dla użytkownika i można je ustawiać dynamicznie, tak aby kolejne żądania fokusu uwzględniały nowe ustawienie.

Opóźniona ostrość dźwięku

W systemie Android 11 AAOS dodał obsługę żądania opóźnionego ustawiania ostrości dźwięku. Dzięki temu można opóźniać nieprzejściowe żądania fokusu, gdy ich interakcja z bieżącymi posiadaczami fokusu normalnie skutkowałaby ich odrzuceniem. Gdy zmiana fokusu doprowadzi do stanu, w którym opóźnione żądanie może uzyskać fokus, żądanie zostaje przyjęte.

Zasady dotyczące opóźnionych żądań skupienia dźwięku

  • Tylko żądania nieprzejściowe. Opóźnione żądanie można złożyć tylko w przypadku źródeł nieprzejściowych, aby uniknąć odtwarzania dźwięku przejściowego długo po tym, jak jest to istotne.

  • W danym momencie można opóźnić tylko jedno żądanie. Jeżeli żądanie opóźnione zostanie wykonane, gdy istnieje już opóźnione żądanie, pierwotne opóźnione żądanie otrzyma zdarzenie zmiany AUDIOFOCUS_LOSS , a nowe żądanie otrzyma synchroniczną odpowiedź AUDIOFOCUS_REQUEST_DELAYED .

  • Żądania opóźniane muszą mieć OnAudioFocusChangeListener . Gdy żądanie jest opóźnione, słuchacz jest używany do powiadamiania osoby żądającej, gdy żądanie zostanie ostatecznie spełnione ( AUDIOFOCUS_GAIN ) lub jeśli zostanie później odrzucone ( AUDIOFOCUS_LOSS ).

Poproś o opóźnioną ostrość

Aby zbudować żądanie, które można opóźnić:

  1. Użyj 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. Składając żądanie, obsłuż odpowiedź 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. Gdy żądanie jest opóźnione, słuchacz fokusu obsługuje zmiany fokusu:

    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
    

Zarządzanie ostrością w wielu strefach

W pojazdach z wieloma strefami audio fokus audio jest zarządzany niezależnie dla każdej strefy. W związku z tym żądanie skierowane do jednej strefy nie uwzględnia tego, co utrzymuje fokus w innych strefach, ani nie powoduje utraty fokusu w innych strefach. Dzięki temu skupienie uwagi w głównej kabinie może być zarządzane niezależnie od systemu rozrywki na tylnych siedzeniach, nie zakłócając w ten sposób odtwarzania dźwięku w jednej strefie w wyniku zmiany ostrości w innej.

W przypadku wszystkich aplikacji CarAudioService automatycznie zarządza fokusem. Strefa audio żądania fokusu jest określana na podstawie powiązanego z nią UserId lub UID (aby uzyskać szczegółowe informacje, zobacz Routing audio ).

Żądaj dźwięku z wielu stref jednocześnie

Jeśli aplikacja chce odtwarzać dźwięk w wielu strefach jednocześnie, musi zażądać fokusu dla każdej strefy, włączając AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID w pakiecie:

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

Ten parametr pakietu pozwala żądającemu zastąpić automatyczne mapowania stref audio i zamiast tego używać określonego identyfikatora strefy. Dlatego aplikacja może wysyłać osobne żądania dla różnych stref audio.

Skupienie dźwięku HAL

Począwszy od systemu Android 11, warstwa HAL może żądać fokusu w imieniu strumieni zewnętrznych. Chociaż korzystanie z tych interfejsów API jest opcjonalne, zdecydowanie zaleca się, aby zewnętrzne dźwięki mogły optymalnie uczestniczyć w ekosystemie Androida i zapewniać użytkownikom bezproblemową obsługę.

HAL dokonuje ostatecznego ustalenia, które dźwięki powinny mieć pierwszeństwo. W tym zakresie dźwięki alarmowe i dźwięki krytyczne dla bezpieczeństwa powinny być odtwarzane niezależnie od tego, czy HAL uzyskał fokus audio, czy nie, i powinien być nadal odtwarzany, jeśli to konieczne, nawet jeśli HAL utraci fokus audio. To samo dotyczy wszelkich dźwięków wymaganych przez przepisy rządowe.

HAL powinien proaktywnie wyciszać strumienie Androida, jeśli to konieczne, podczas odtwarzania dźwięków awaryjnych lub krytycznych dla bezpieczeństwa, aby zapewnić ich wyraźne słyszenie.

Sterowanie dźwiękiem@2.0

Wersja 2.0 AudioControl HAL wprowadza następujące nowe interfejsy API:

API Zamiar
IAudioControl#registerFocusListener Rejestruje instancję IFocusListener w warstwie HAL AudioControl. Ten odbiornik umożliwia warstwie HAL żądanie i porzucenie fokusu audio. HAl udostępnia instancję ICloseHandle , która będzie używana przez system Android w celu wyrejestrowania słuchacza.
IAudioControl#onAudioFocusChange Powiadamia warstwę HAL o zmianach statusu żądań skupienia wysyłanych przez warstwę HAL za pośrednictwem IFocusListener , w tym odpowiedzi na wstępne żądania skupienia.
IFocusListener#requestAudioFocus Żądania skupienia w imieniu warstwy HAL dla określonego użycia, identyfikatora strefy i typu wzmocnienia skupienia.
IFocusListener#abandonAudioFocus Porzuca istniejące żądania skupienia HAL dla określonego użycia i identyfikatora strefy.

HAL może mieć jednocześnie wiele żądań skupienia, ale jest ograniczone do jednego żądania na użycie i parowanie identyfikatora strefy. Android zakłada, że ​​warstwa HAL natychmiast rozpoczyna odtwarzanie dźwięków po wysłaniu żądania i kontynuuje to, dopóki nie opuści fokusu.

W odróżnieniu od registerFocusListener ” żądania te mają oneway i zapewniają, że system Android nie opóźnia warstwy HAL podczas przetwarzania żądania fokusu. HAL nie powinien czekać, aż się skupi, zanim zacznie odtwarzać dźwięki istotne dla bezpieczeństwa. Opcjonalne jest, aby warstwa HAL nasłuchiwała zmian w fokusie dźwięku i reagowała na nie za pomocą IAudioControl#onAudioFocusChange .

Usługa skupienia się na samochodowym audio OEM

W systemie Android 14 firma AAOS wprowadziła usługi wtyczek OEM samochodów, aby umożliwić konfigurację niektórych komponentów samochodu. W przypadku usługi wtyczki Car Audio usługa wtyczki umożliwia producentom OEM zarządzanie żądaniami skupienia przechwytywanymi przez usługę car audio. Daje to producentom OEM większą elastyczność w zakresie zarządzania koncentracją, zgodnie z wymaganiami zasad i przepisów. W związku z tym interakcja fokusu audio może różnić się w zależności od producenta i regionu. Podstawowe założenie dotyczące dźwięku jest nadal aktualne, że aplikacje powinny nadal żądać skupienia na lepszym zarządzaniu dźwiękiem, aby poprawić komfort użytkownika. Ogólnie rzecz biorąc, w przypadku żądań skupienia dźwięku wysyłanych przez aplikacje nadal obowiązują pewne zasady:

  • Bez stałego fokusu dźwiękowego o wysokim priorytecie (w tym połączenia telefonicznego, alertu awaryjnego lub powiadomienia dotyczącego bezpieczeństwa) aplikacje powinny być w stanie uzyskać fokus dźwiękowy przejściowo lub na stałe.

  • Gdy fokus multimedialny jest aktywny:

    • Aplikacje żądające skupienia się na użyciu połączeń powinny mieć możliwość odbierania połączeń jednocześnie lub wyłącznie.

    • Aplikacje żądające skupienia się na nawigacji powinny mieć możliwość uzyskania fokusu nawigacyjnego jednocześnie lub wyłącznie.

    • Aplikacje żądające skupienia się na użyciu asystenta powinny mieć możliwość uzyskania fokusu na użyciu jednocześnie lub wyłącznie.

  • Gdy aplikacje fokusu audio o wysokim priorytecie (w tym połączenia telefonicznego, alertu awaryjnego lub powiadomienia dotyczącego bezpieczeństwa) są aktywne, wszelkie przychodzące opóźnione żądania fokusu audio powinny zostać przyjęte lub opóźnione w razie potrzeby.

Chociaż powyższe sugestie nie są wyczerpujące, mogą pomóc aplikacjom żądającym fokusu uzyskać fokus, jeśli nie ma aktywnych dźwięków o wysokim priorytecie. Nawet gdy dźwięki o wysokim priorytecie są aktywne, żądania opóźnionego skupienia powinny być nadal przestrzegane i powinno być możliwe uzyskanie skupienia, gdy dźwięk o wysokim priorytecie ustanie.