Zarządzanie woluminami

AAOS ma własne funkcje zarządzania woluminami w usłudze CarAudioService. Wykorzystuje metody stałe woluminy z założeniami, że woluminy powinny być stosowane poniżej HAL przez sprzęt we wzmacniaczu, a nie w oprogramowaniu. Łączy też urządzenia wyjściowe w grupy woluminów aby zastosować te same wzmocnienia na wszystkich urządzeniach powiązanych z grupą głośności.

Korzystanie ze stałych woluminów

Implementacje AAOS powinny sterować głośnością za pomocą wzmacniacza sprzętowego zamiast mikser oprogramowania. Aby uniknąć efektów ubocznych, ustaw flagę config_useFixedVolume na wartość true (w razie potrzeby nakładki):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

Gdy flaga config_useFixedVolume nie jest ustawiona (lub jest ustawiona na „fałsz”), aplikacje mogą wywoływać metodę AudioManager.setStreamVolume() i zmieniać według typu strumienia w mikserze oprogramowania. Może to być niepożądane z powodu potencjalny wpływ na inne aplikacje oraz fakt, że tłumienie głośności mikser oprogramowania generuje mniej znaczących bitów dostępnych w sygnale, gdy odbierany przez wzmacniacz sprzętowy.

Grupy woluminów

Grupy głośności zarządzają poziomami głośności grupy urządzeń w strefie audio. W każdej grupie głośności można ją niezależnie regulować. są skonfigurowane na powiązanych urządzeniach, aby były stosowane przez wzmacniacz pojazdu. Ustawienia woluminu są zachowywane dla użytkownika i wczytywane, gdy użytkownik się zaloguje.

Definiowanie grup woluminów

CarAudioService używa grup głośności zdefiniowanych w car_audio_configuration.xml:

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

Przykładowa implementacja car_audio_configuration.xml.

Każda grupa woluminów powinna zawierać co najmniej 1 urządzenie wyjściowe z powiązanymi adresami. Te adresy powinny odpowiadać urządzeniom wyjściowym zdefiniowanym w audio_policy_configuration.xml

Konfigurowanie wzmocnienia grupy woluminów

Każda grupa głośności ma minimalne, maksymalne i domyślne wartości wzmocnienia oraz rozmiaru kroku. Są one określane na podstawie wartości skonfigurowanych w audio_policy_configuration.xml dla powiązanych urządzeń grupę głośności.

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

Podczas inicjowania grupa woluminów sprawdzi wartości wzmocnienia powiązanych i skonfiguruj grupę w następujący sposób:

  • Rozmiar kroku. Musi być taka sama w przypadku wszystkich urządzeń sterowanych przez grupę głośności
  • Minimalny zysk. Najmniejsze minimalne wzmocnienie wśród urządzeń w grupie
  • Maksymalny zysk. Najwyższe maksymalne wzmocnienie wśród urządzeń w grupie
  • Wzmocnienie domyślne. Najwyższe wzmocnienie domyślne wśród urządzeń w grupie

Ze względu na sposób konfiguracji tych wartości możliwe jest ustawienie wzmocnienia grupę głośności spoza zakresu obsługiwanego w przypadku urządzenia powiązanego z tą grupą. W takim przypadku wzmocnienie będzie ustawione na wartość minimalną lub maksymalną. w zależności od tego, czy wartość grupy głośności jest poniżej czy powyżej zakresu.

Identyfikatory grup woluminów

Grupy woluminów są identyfikowane w czasie działania według kolejności definicji w pliku XML. Identyfikatory mają zakres od 0 do N-1 w strefie audio, gdzie N to liczba grup głośności w tej strefie. W ten sposób identyfikatory grup woluminów nie są unikalne w różnych strefach. Te identyfikatory są używane w przypadku CarAudioManager interfejsów API powiązanych z grupami woluminów. Dowolny interfejs API przyjmujący groupId bez zoneId, domyślnie przyjmuje głównej strefy dźwięku.

Wielostrefowe zarządzanie woluminem

Każda strefa audio powinna mieć co najmniej 1 grupę głośności jest powiązana tylko z jedną strefą audio. Ta relacja została zdefiniowana jako część car_audio_configuration.xml Zapoznaj się z przykładem podanym tutaj: Definiowanie grup woluminów powyżej.

Bieżące poziomy głośności w każdej strefie zostaną zachowane dla użytkownika powiązanego z w tej strefie. Te ustawienia dotyczą poszczególnych stref, co oznacza, że użytkownik zaloguje się na wyświetlaczu ze strefą główną, a później po zalogowaniu się w strefie powiązanej z w dodatkowej strefie audio, poziomy głośności zostaną wczytane i utrwalone w pierwszej strefie różnią się od tych dla strefy dodatkowej.

Obsługa kluczowych zdarzeń dotyczących woluminów

Android definiuje kilka kodów klawiszy do sterowania głośnością, w tym KEYCODE_VOLUME_UP, KEYCODE_VOLUME_DOWN i KEYCODE_VOLUME_MUTE Domyślnie Android przekierowuje klawisz głośności zdarzeń do aplikacji. Implementacje w branży motoryzacyjnej powinny wymuszać te kluczowe zdarzenia CarAudioService, który może następnie wywołać funkcję setGroupVolume lub setMasterMute.

Aby wymusić takie działanie, ustaw config_handleVolumeKeysInWindowManager flaga do true:

<resources>
    <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>

Obecnie kluczowe zdarzenia dotyczące głośności nie mogą w ten sposób rozróżnić strefy, w której są i w związku z tym zakłada się, że wszystkie są powiązane z główną strefą audio. Po odebraniu kluczowego zdarzenia dotyczącego głośności CarAudioService określa głośność aby dostosować grupę, pobierając konteksty dźwiękowe aktywnych odtwarzaczy, a następnie dostosowując grupę głośności zawierającą urządzenie wyjściowe powiązane z najwyższym priorytetem kontekstu audio. Priorytety są ustalane na podstawie ustalonej kolejności zdefiniowanej w CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY

Zanikanie i balans

Obie wersje HAL AudioControl zawierają interfejsy API do ustawiania zanikania i balansu w pojeździe. Istnieją odpowiednie systemowe interfejsy API dla CarAudioManager, które przekazują wartości do poziomu HAL AudioControl. Te interfejsy API wymagają android.car.permission.CAR_CONTROL_AUDIO_VOLUME

Interfejsy API AudioControl to:

  • setBalanceTowardRight(float value) Przesuwa głośność głośnika w stronę prawej (+) lub lewej (-) strony samochodu. 0,0 jest wyśrodkowane, +1,0 to całkowita poprawka, -1,0 to cała reszta, a wartość spoza zakresu od -1 do 1 jest błędem.
  • setFadeTowardFront(float value) – zmienia głośność głośnika w kierunku przedniej (+) lub tylnej strony samochodu (–). 0,0 jest wyśrodkowane, +1,0 jest całkowicie do przodu, -1,0 jest całkowicie wsteczne, a wartość spoza zakresu od -1 do 1 jest błędem.

To producent OEM decyduje, jak stosować te wartości i w jaki sposób będą wyświetlane użytkownikom. Mogą być stosowane bezpośrednio w mediach lub wszystkie dźwięki Androida.

W Androidzie 11 wprowadzono też obsługę stosowania efektów audio na urządzeniach wyjściowych. Dzięki temu można za pomocą efektów dźwiękowych zarządzać stopniowym rozjaśnięciem i balansem na odpowiednich urządzeniach wyjściowych, a nie za pomocą tych interfejsów API.

Wyciszanie tła

Wyciszanie tła ma miejsce, gdy pojazd zmniejsza wzmocnienie podczas 1 transmisji. aby można było usłyszeć wyraźniejszy dźwięk z innej transmisji w tym samym czasie. W systemie AAOS wyciszanie wyciszania dźwięku jest pozostawiane zespołowi HAL do wdrożenia, ponieważ może tam być poza Androidem, na które system operacyjny nie ma kontroli. W Androidzie 11 główne informacje dostępne dla HAL do podejmowania decyzji o wyciszaniu, jest to, czy dwa urządzenia wyjściowe mają strumienie aktywne.

Kiedy udawać

To pojedynczy OEM, w jaki sposób posługuje się ukryciem obrazu w HAL, decyduje o tym, skorzystaj z kilku ogólnych wskazówek. Odtwarzanie wielu strumieni na urządzeniu z Androidem najczęściej występuje, gdy 2 aplikacje lub usługi są skupione jednocześnie na dźwięku. Mając to na uwadze, Więcej informacji: Tablica interakcji aby dowiedzieć się, w których przypadkach Android może równolegle skupić się na jednym urządzeniu, a tym samym, gdy dwie możliwości różne strumienie do odtwarzania równocześnie.

Pamiętaj, że wszystkie transmisje na żywo z Androida zostaną przeprowadzone przed ewentualnymi korzyściami. obecnie stosowane. W związku z tym każdy strumień, który powinien zostać wyciszony podczas odtwarzania inny powinien zostać przekierowany na oddzielne urządzenia wyjściowe, aby HAL mógł zastosować wyciszanie tła, zanim mieszając je ze sobą.

Zalecane zachowanie wyciszania tła

Oto potencjalne równoczesne interakcje, w przypadku których zalecamy wycofanie do zastosowania:

  • EMERGENCY Wycisz lub wycisz wszystko oprócz SAFETY w Upewnij się, że kierowca słyszy dźwięk
  • SAFETY Ukryj wszystko oprócz EMERGENCY, aby się upewnić kierowca słyszy dźwięk
  • NAVIGATION Ukryj wszystko oprócz SAFETY i EMERGENCY
  • CALL Dukuj wszystko oprócz SAFETY, EMERGENCY i NAVIGATION
  • VOICE Kaczka CALL_RING
  • To producenci OEM określają znaczenie aktywnych urządzeń VEHICLE_SOUNDS. i możliwość wyciszania innych dźwięków, aby kierowca je usłyszał.
  • Elementy MUSIC i ANNOUNCEMENT powinny być ukryte przed wszystkim. Głównym wyjątkiem są dźwięki interakcji dotykiem, które obecnie są odtwarzane jako SYSTEM_SOUND

Inne rzeczy, które warto wziąć pod uwagę podczas wyciszania tła

Niektóre aplikacje/usługi, takie jak nawigacja czy asystent, mogą korzystać z kilku odtwarzaczy swoich działań. OEM nie powinni podejmować zbyt agresywnego działania w zależności od tego, kiedy transmisja danych zatrzymuje się przechodzących przez te urządzenia wyjściowe, aby użytkownik nie mógł na chwilę wrócić do multimediów do pełnej głośności, a potem zostanie cofnięty podczas następnego odtwarzania w obszarze nawigacji lub uruchomi się aplikacja Asystent.

W przypadku pojazdów z kilkoma scenami dźwiękowymi i odpowiednią izolacją aby kierować dźwięk do różnych obszarów samochodu, zamiast wyciszać się. Na przykład nawigacja instrukcje mogą być przekierowywane na głośniki zagłówka kierowcy, gdy muzyka wciąż będzie odtwarzać się w całym domu z normalną głośnością.

Dźwięki zagrażające bezpieczeństwu

Chociaż Android 11 wprowadził interfejsy API HAL Audiofokus, do HAL należy priorytetowe traktowanie dźwięków o znaczeniu bezpieczeństwa, reszta. Nawet jeśli HAL utrzymuje aktywność audio na urządzeniu USAGE_EMERGENCY, zagwarantowanie, że aplikacje i usługi na Androidzie nie będą odtwarzać dźwięków. Zależy od HAL określać, które strumienie z Androida należy mieszać, a które wyciszać (dźwięki o znaczeniu krytycznym dla bezpieczeństwa). odtworzonej przez grę.

Konfigurowanie interfejsu ustawień głośności

AAOS oddziela interfejs ustawień głośności od konfiguracji grupy głośności (którą można nałożone zgodnie z opisem w sekcji Konfigurowanie grup woluminów. Taki podział zapewnia, zmiany będą wymagane, jeśli w przyszłości konfiguracja grup woluminów ulegnie zmianie.

W interfejsie ustawień samochodu ikona packages/apps/Car/Settings/res/xml/car_volume_items.xml zawiera elementy UI (zasoby tytułu i ikon) powiązane z każdym zdefiniowanym AudioAttributes.USAGE Zapewnia on uzasadnione renderowanie zdefiniowaną VolumeGroups przy użyciu zasobów powiązanych z pierwszym rozpoznawane zastosowania w każdej grupie woluminów.

W tym przykładzie definicja grupy woluminów obejmuje obie voice_communication i voice_communication_signalling. Domyślny implementacja interfejsu ustawień samochodu renderuje grupę VolumeGroup przy użyciu powiązanych zasobów z elementem voice_communication jako pierwszą w pliku.

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

Atrybuty i wartości używane w powyższej konfiguracji są zadeklarowane w packages/apps/Car/Settings/res/values/attrs.xml Ustawienia głośności Interfejs użytkownika korzysta z tych interfejsów API CarAudioManager opartych na VolumeGroup:

  • getVolumeGroupCount(), aby dowiedzieć się, ile elementów sterujących ma zostać narysowanych.
  • getGroupMinVolume() i getGroupMaxVolume(), aby uzyskać dolną i górną granicę.
  • getGroupVolume(), by otrzymać aktualny poziom głośności.
  • registerVolumeChangeObserver(), aby otrzymywać powiadomienia o zmianach głośności.