Konfiguracja dźwięku w samochodzie

W Androidzie 10 car_audio_configuration.xml zastąpiło car_volumes_groups.xmlIAudioControl.getBusForContext. Pliki zasad audio, które zwykle znajdują się w partycji dostawcy, reprezentują konfigurację sprzętu audio na płycie. Wszystkie urządzenia, do których odwołuje się element car_audio_configuration.xml, muszą być zdefiniowane w elemencie audio_policy_configuration.xml.

Ilustracja 1 przedstawia ogólny zarys architektury usługi audio w samochodzie, w której usługa audio w samochodzie odczytuje plik konfiguracji audio w samochodzie, aby skonfigurować dźwięk na urządzeniu.

Omówienie architektury audio w samochodzie

Rysunek 1. Omówienie architektury systemu audio w samochodzie.

Umieść plik konfiguracyjny systemu audio w samochodzie w folderze vendor/etc/ lub vendor/etc/ na urządzeniu. Usługa audio w samochodzie najpierw wyszuka plik w folderze vendor/etc/.system/etc/ Usługi audio w samochodzie odczytują car_audio_configuration.xml, aby określić konfigurację dźwięku.

Strefy audio w samochodzie:

  • Każda strefa audio zawiera unikalny identyfikator strefy audio.
  • Każda strefa audio może być zmapowana na strefę zajmowaną przez pasażera.
  • Działania związane z dźwiękiem w każdej strefie są od siebie niezależne:

    • Aktywność audio
    • Kierowanie dźwięku
    • Wyciszanie tła
  • Grupy głośności w samochodzie:

    • Wszystkie urządzenia audio, które zawierają grupę głośności, są sterowane razem z tymi samymi zmianami wzmocnienia. Konfiguracja wzmocnienia dźwięku na wszystkich urządzeniach w grupie powinna być taka sama.

    • Mapowanie kontekstu audio na urządzenia audio. Użyj tej funkcji, aby utworzyć miks audio, który przypisuje sposoby użycia dźwięku do urządzenia wyjściowego.

    • Wszystkie konteksty audio powinny być reprezentowane w strefie. Umożliwia to prawidłowe skonfigurowanie routingu audio dla wszystkich zastosowań atrybutu audio.

Konteksty audio

Aby uprościć konfigurację dźwięku w AAOS, podobne zastosowania zostały zgrupowane w CarAudioContexts. Te konteksty audio są używane w całej aplikacji CarAudioService do definiowania routingu, grup głośności, ostrości dźwięku i zarządzania wyciszaniem. Statyczne konteksty audio w AAOS są wymienione w tej tabeli.

W tej tabeli opisujemy mapowanie kontekstów audio i sposobów użycia. Wyróżnione wiersze są przeznaczone do nowego sposobu korzystania z systemu.

CarAudioContext Associated AttributeUsages
MUSIC UNKNOWN
GAME
MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

Włączanie routingu AAOS

Aby korzystać z routingu opartego na AAOS, musisz ustawić flagę audioUseDynamicRouting na true:

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

Gdy false, routing i większość CarAudioService są wyłączone, AAOS wraca do domyślnego działania AudioService.

Konfigurowalny mechanizm zasad dotyczących dźwięku

Aby jeszcze bardziej rozszerzyć zarządzanie dźwiękiem w samochodzie w Androidzie 14, AAOS wprowadził zarządzanie dźwiękiem za pomocą konfigurowalnego silnika zasad audio (CAP). Dzięki temu zyskujesz większą elastyczność w zakresie sterowania routingiem i głośnością dźwięku oraz wszechstronne możliwości definiowania:

Silnik konfigurowalnych zasad dotyczących dźwięku (CAP) możesz włączyć za pomocą tagów useCoreAudioVolume i useCoreAudioRouting. Więcej informacji znajdziesz w artykule Silnik konfigurowalnych zasad dotyczących dźwięku.

Strefa główna

Domyślnie cały dźwięk jest kierowany do strefy głównej. Istnieje tylko jedna strefa podstawowa, która jest oznaczona w konfiguracji atrybutem isPrimary="true". Strefa podstawowa jest automatycznie oznaczana symbolemAudiomanager.PRIMARY_AUDIO_ZONE.

Przykładowa konfiguracja (wersja 2)

Na przykład pojazd może mieć 2 strefy: strefę główną i system rozrywki na tylnych siedzeniach. W takim przypadku możesz zaprojektować możliwą wersję 2car_audio_configuration.xml w ten sposób:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

W tym przykładzie strefa główna rozdziela niektóre konteksty audio na różne urządzenia. Umożliwia to warstwie HAL stosowanie różnych efektów przetwarzania końcowego i miksowanie danych wyjściowych na każdym urządzeniu za pomocą sprzętu pojazdu. Urządzenia zostały podzielone na kilka grup głośności: multimedia, nawigacja, połączenia, alarmy i dźwięki systemowe. Jeśli system jest skonfigurowany jako useFixedVolume, poziomy głośności dla każdej grupy są przekazywane do HAL, aby zastosować je do wyjścia tych urządzeń.

W przypadku strefy głównej zalecamy oddzielenie dźwięków systemowych od innych dźwięków. Dzięki temu dźwięki pojazdów są traktowane priorytetowo. Usługa audio w samochodzie już rozróżnia dźwięki pojazdu pod względem priorytetu i zarządzania wyciszaniem. Na przykład żądanie skupienia na dźwięku alarmowym ma wyższy priorytet niż inne żądanie skupienia.

W przykładzie strefy dodatkowej wszystkie konteksty audio są kierowane do jednego urządzenia i jednej grupy głośności.

Definicja grupy woluminów dla silnika CAP

Aby używać zarządzania głośnością za pomocą silnika CAP, jak wspomniano w sekcji Konfigurowalny silnik zasad audio, definicja grupy głośności musi też zawierać nazwę:


<group name="media">
  <device address="bus0_media_out">
    <context context="music"/>
    <context context="announcement"/>
  </device>
  <device address="bus3_call_ring_out">
     <context context="call_ring"/>
  </device>
  <device address="bus6_notification_out">
    <context context="notification"/>
  </device>
</group>
<group name="navigation">
  <device address="bus1_navigation_out">
    <context context="navigation"/>
  </device>
  <device address="bus2_voice_command_out">
    <context context="voice_command"/>
  </device>
</group>

Nazwa tej grupy woluminów musi być zgodna z nazwą woluminu zdefiniowaną w silniku CAP. Dodatkowo parametr useFixedVolume musi być ustawiony na false. Szczegółowe informacje znajdziesz w sekcji Flagi konfiguracji dźwięku w AAOS.

Konfiguracja dźwięku w strefie pasażera

W Androidzie 11 car_audio_configuration.xml wprowadził 2 nowe pola: audioZoneIdoccupantZoneId. Do zarządzania strefami audio możesz używać audioZoneId. Możesz użyć occupantZoneId, aby skonfigurować routing na podstawie identyfikatora użytkownika.

Wracając do konfiguracji audio, ale korzystając z nowego pola mapowania identyfikatora strefy pasażera i identyfikatora strefy audio, nową konfigurację bez definicji grupy głośności można skonfigurować w ten sposób:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

Konfiguracja definiuje mapowanie strefy podstawowej na strefę zajmowaną 0 i audioZoneId 1 na occupantZoneId 1. Można skonfigurować dowolne mapowanie między strefą pasażera a strefą audio. Mapowanie musi być jednak typu „jeden do jednego”. Reguły, które zdefiniowały 2 nowe pola, to:

  • audioZoneId w przypadku strefy podstawowej jest zawsze PRIMARY_AUDIO_ZONE ID. Jeśli zdefiniowano właściwość isPrimary="true", właściwość audioZoneId nie jest potrzebna.

  • Numery audioZoneIdoccupantZoneId nie mogą się powtarzać.

  • audioZoneIdoccupantZoneId mogą mieć tylko mapowanie 1:1.

Konfiguracja dźwięku w samochodzie z Androidem 14

W Androidzie 14 AAOS wprowadziliśmy usługę wtyczek OEM, która umożliwia zarządzanie zachowaniem dźwięku nadzorowanym przez usługę audio w samochodzie. Oprócz nowych usług wtyczek do pliku konfiguracji audio w samochodzie dodano te zmiany:

  • Kontekst audio w samochodzie zdefiniowany przez OEM
  • Konfiguracje dynamiczne strefy innej niż podstawowa

Kontekst audio w samochodzie zdefiniowany przez OEM

Aby włączyć elastyczną konfigurację dźwięku, w Androidzie 14 usługa audio w samochodzie umożliwia grupowanie zastosowań audio w inny sposób niż w przypadku zdefiniowanych statycznych kontekstów audio. Ten zdefiniowany przez producenta OEM kontekst można określić w pliku car_audio_configuration.xml w wersji 3.

Zamiast tego używane są predefiniowane statyczne konteksty audio. Ogólny format kontekstu audio w samochodzie zdefiniowanego przez producenta OEM jest pokazany poniżej.

Każdy kontekst OEM wymaga elementu name oraz listy atrybutów audio używanych w tym kontekście. W przykładzie powyżej zdefiniowano 2 konteksty:

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • Kontekst media zawiera AUDIO_USAGE_MEDIA i AUDIO_USAGE_UNKNOWN
  • game kontekst zawiera tylko AUDIO_USAGE_GAME

Kontekst musi być zdefiniowany u góry pliku car_audio_configuration.xml. Po zdefiniowaniu kontekstów OEM pozostałą część konfiguracji dźwięku w samochodzie można przeprowadzić jak wcześniej. W przypadku kontekstu audio w samochodzie obowiązują te reguły:

  • Definicje kontekstu OEM są opcjonalne. Zamiast tego używany jest statyczny kontekst audio.

  • Nie powtarzaj nazw kontekstów.

  • Nie przypisuj użycia atrybutu audio do wielu kontekstów.

  • Do tworzenia kontekstu należy używać wszystkich zastosowań audio zdefiniowanych w AudioAttributes.

Ściśle mówiąc, w przypadku definicji kontekstu audio OEM należy użyć android.audio.policy.configuration.V7_0.AudioUsagereprezentacji tekstowej użycia dźwięku. W przyszłości nowsze zastosowania atrybutu audio będą przypisywane do najbardziej odpowiedniego kontekstu, aby zmniejszyć liczbę błędów podczas przechodzenia z jednej wersji Androida na inną.

Kontekst zdefiniowany przez producenta OEM został wprowadzony, aby jeszcze bardziej rozszerzyć usługę audio w przypadku wtyczki OEM, ale można go używać bez tej usługi. Dźwięk zachowuje się podobnie jak w przypadku statycznej usługi audio:

  • Interakcje z aktywnością audio. Atrybut audio służy do określania najlepszego dopasowania zgodnie z macierzą interakcji z fokusem audio. Więcej informacji znajdziesz w artykule Aktywność audio.

  • Atrybut dźwięku sterowania głośnością jest używany do określania najlepszego dopasowania:

    • Grupa głośności na podstawie kontekstu zdefiniowanego przez producenta OEM.
    • Priorytet z konfigurowanej statycznej listy woluminów.
  • Zachowanie wyciszania tła:

    • Użycie atrybutu audio dla bieżącego fokusu audio jest używane do mapowania informacji o wyjściowym urządzeniu audio zgodnie z definicją w pliku konfiguracyjnym audio w samochodzie.

    • Atrybut audio służy do mapowania odpowiedniego kontekstu statycznego na wyciszenie na podstawie statycznej macierzy wyciszania dźwięku.

Strategie dotyczące produktów z silnikiem CAP

Jeśli urządzenie musi używać silnika CAP do zarządzania głośnością lub routingiem, zdefiniowany przez producenta OEM kontekst musi być zgodny z definicją strategii produktu silnika CAP. W przeciwnym razie możesz użyć kontekstu zdefiniowanego przez producenta OEM bez silnika CAP.

Więcej informacji znajdziesz w sekcji dotyczącej strategii dotyczącej produktu w AAOS.

Konfiguracje dynamicznych stref audio

W Androidzie 14, aby uwzględnić dynamiczną konfigurację stref audio, schemat konfiguracji dźwięku w samochodzie do definiowania stref audio został zaktualizowany do wersji 3. Nowy schemat wymaga skonfigurowania każdej strefy.

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

Więcej informacji znajdziesz w pliku w wersji 3 zdefiniowanym w device/generic/car/emulator/audio/car_audio_configuration.xml. Od Androida 14 strefa główna może mieć tylko 1 konfigurację. Strefy inne niż podstawowe mogą mieć wiele konfiguracji. W przypadku konfiguracji audio w samochodzie obowiązują te zasady:

  • Główna strefa audio może mieć tylko jedną konfigurację.

  • Dodatkowe strefy audio mogą mieć wiele konfiguracji.

  • Nazwa musi być unikalna dla każdej strefy audio i konfiguracji strefy audio.

  • W strefie dźwięku konfiguracje dźwięku mogą się różnić:

    • Konfiguracja grup głośności nie musi być taka sama.
    • Przypisanie kontekstu audio nie musi być takie samo.
  • Nazwy urządzeń wyjściowych audio powinny być unikalne w obrębie stref lub konfiguracji. Nazwa urządzenia powinna pojawiać się tylko raz w konfiguracji audio lub strefach.

  • Urządzenia audio należące do tej samej grupy głośności powinny mieć takie same konfiguracje wzmocnienia dźwięku.

  • Wszystkie konteksty audio (OEM lub statyczne) muszą być przypisane do każdej konfiguracji audio.

Zgodność w przyszłości

Nowe wersje car_audio_configuration.xml wprowadzają nowe funkcje w każdej aktualizacji, ale w nowszych wersjach AAOS możesz nadal używać starszych plików. Producenci OEM aktualizujący system do nowych wersji Androida mogą ponownie użyć pliku car_audio_configuration.xml.

Aby korzystać z nowej funkcji, która wymaga nowych informacji zawartych w car_audio_configuration.xml, musisz zaktualizować wersję. Próba użycia starszej wersji pliku z informacjami, które nie są obsługiwane w tej wersji, powoduje zgłoszenie błędu IllegalStateException podczas uruchamiania usługi samochodowej. Komunikat o wyjątku zawiera odpowiednie informacje o tym, które informacje są używane i która minimalna wersja jest wymagana.