Konfiguracja dźwięku w samochodzie

W Androidzie 10 car_audio_configuration.xml zastąpiło car_volumes_groups.xmlIAudioControl.getBusForContext. Pliki zasad dotyczących dźwięku, 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ę elementcar_audio_configuration.xml, muszą być zdefiniowane w elemencieaudio_policy_configuration.xml.

Rysunek 1 przedstawia przegląd architektury usługi dźwięku w samochodzie, w której usługa dźwięku w samochodzie odczytuje plik konfiguracji dźwięku w samochodzie, aby skonfigurować dźwięk na urządzeniu.

Omówienie architektury dźwięku w samochodzie

Rysunek 1. Omówienie architektury audio w samochodzie

Umieść plik konfiguracji dźwięku w samochodzie w folderze vendor/etc/ lub system/etc/ na urządzeniu. Folder vendor/etc/ jest pierwszym miejscem, w którym usługa dźwięku w samochodzie będzie szukać pliku. Usługi audio w samochodzie odczytują wartość car_audio_configuration.xml, aby określić konfigurację dźwięku.

Strefy dźwięku w samochodzie:

  • Każda strefa audio ma unikalny identyfikator strefy audio.
  • Każdą strefę dźwięku można zmapować na strefę pasażera.
  • Działania dotyczące dźwięku w poszczególnych strefach 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ą kontrolowane razem z tymi samymi zmianami wzmocnienia. Konfiguracja wzmocnienia dźwięku na wszystkich urządzeniach w grupie powinna być taka sama.

    • Mapowanie kontekstu dźwięku na urządzenia audio Użyj go do stworzenia miksu audio, który mapuje użycie dźwięku na urządzeniu wyjściowym.

    • Wszystkie konteksty audio powinny być reprezentowane w strefie. Umożliwia to dokładne skonfigurowanie przekierowywania dźwięku w przypadku wszystkich zastosowań atrybutu audio.

Konteksty audio

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

Tabela ta opisuje mapowanie kontekstów dźwiękowych i ich zastosowań. Wyróżnione wiersze dotyczą nowego sposobu korzystania z systemu.

CarAudioContext Powiązane użycia atrybutu
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 na podstawie AAOS, musisz ustawić flagę audioUseDynamicRouting na true:

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

Gdy false, routing i duża część CarAudioService są wyłączone, AAOS powraca do domyślnego działania AudioService.

Konfigurowalny mechanizm zasad dotyczących dźwięku

Aby rozszerzyć zarządzanie dźwiękiem w samochodzie w Androidzie 14, w AAOS wprowadzono zarządzanie dźwiękiem za pomocą konfigurowalnego mechanizmu zasad dotyczących dźwięku (CAP). Dzięki temu możesz mieć większą elastyczność w zakresie sterowania routingiem dźwięku i zarządzania głośnością oraz łatwiej definiować:

Możesz włączyć mechanizm konfigurowalnych zasad dotyczących dźwięku (CAP) za pomocą interfejsów useCoreAudioVolumeuseCoreAudioRouting. Więcej informacji znajdziesz w artykule Konfigurowalny mechanizm 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 główna, która jest wskazywana w konfiguracji za pomocą atrybutu isPrimary="true". Strefa podstawowa jest automatycznie przypisywana do Audiomanager.PRIMARY_AUDIO_ZONE.

Przykładowa konfiguracja (wersja 2)

Na przykład pojazd może mieć 2 strefy: strefę główną i system rozrywki na tylnym siedzeniu. W tym przypadku możesz zaprojektować możliwą wersję car_audio_configuration.xml 2 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 dźwięku na różne urządzenia. Umożliwia to HAL-owi stosowanie różnych efektów post-processingu 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: media, nawigacja, połączenia, alarmy i dźwięki systemowe. Jeśli system jest skonfigurowany na useFixedVolume, poziomy głośności dla każdej grupy są przekazywane do HAL, aby zastosować je na wyjściu tych urządzeń.

W przypadku strefy głównej zalecamy oddzielanie dźwięków systemowych od innych dźwięków. Dzięki temu dźwięki pojazdu są traktowane z wyższym priorytetem. Usługa dźwiękowa w samochodzie już rozróżnia dźwięki pojazdu pod kątem zarządzania dźwiękiem i wyciszaniem dźwięku. Na przykład prośba o wyświetlenie dźwięku alarmowego ma wyższy priorytet niż inna prośba o wyświetlenie.

W przykładzie strefy dodatkowej wszystkie konteksty audio są kierowane na jedno urządzenie i jedną grupę głośności.

Definicja grupy woluminów dla mechanizmu CAP

Aby korzystać z zarządzania głośnością za pomocą mechanizmu CAP, jak opisano w konfigurowalnym mechanizmie zasad dotyczących dźwięku, 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 grupy woluminów musi być zgodna z nazwą woluminu zdefiniowaną w silniku CAP. Dodatkowo parametr useFixedVolume musi być ustawiony na false. Więcej informacji znajdziesz w sekcji Flagi AAOS konfiguracji audio.

Konfiguracja dźwięku w strefie dla pasażerów

W Androidzie 11 car_audio_configuration.xml wprowadzono 2 nowe pola: audioZoneIdoccupantZoneId. Możesz użyć audioZoneId do zarządzania strefami dźwięku. Za pomocą elementu occupantZoneId możesz skonfigurować kierowanie na podstawie identyfikatora użytkownika.

Wracając do konfiguracji dźwięku, ale wykorzystując nowe pole do mapowania identyfikatorów strefy pasażera i strefy dźwiękowej, nową konfigurację bez definicji grup 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ę 0 oraz audioZoneId 1 na occupantZoneId 1. Można skonfigurować dowolne mapowanie między strefą pasażera a strefą audio. Mapowanie musi być jednak 1:1. Reguły, które zdefiniowały 2 nowe pola:

  • audioZoneId w przypadku głównej strefy to zawsze identyfikator PRIMARY_AUDIO_ZONE. Jeśli określona jest właściwość isPrimary="true", parametr audioZoneId nie jest wymagany.

  • Numerów audioZoneId i occupantZoneId nie można powtarzać.

  • audioZoneIdoccupantZoneId mogą mieć tylko mapowanie jeden do jednego.

Konfiguracja dźwięku w samochodzie w Androidzie 14

W Androidzie 14 AAOS wprowadził usługę wtyczki OEM, która umożliwia zarządzanie zachowaniem dźwięku nadzorowanym przez usługę dźwiękową samochodu. Oprócz nowych usług wtyczek do pliku konfiguracji dźwięku w samochodzie wprowadzono następujące zmiany:

  • Kontekst dźwięku w samochodzie zdefiniowany przez producenta OEM
  • Konfiguracje dynamiczne strefy innej niż główna

kontekst dźwięku samochodowego zdefiniowany przez producenta OEM,

Aby umożliwić elastyczne konfigurowanie dźwięku, w Androidzie 14 usługa dźwięku w samochodzie umożliwia grupowanie zastosowań dźwięku w inny sposób niż w przypadku statycznych kontekstów dźwięku. Ten kontekst zdefiniowany przez producenta OEM można zdefiniować w pliku car_audio_configuration.xml wersji 3.

Zamiast tego używane są zdefiniowane wstępnie statyczne konteksty audio. Ogólny format zdefiniowany przez producenta OEM w kontekście dźwięku samochodowego jest wyświetlany później.

Każdy kontekst OEM wymaga name oraz listy atrybutów audio, które są przypisane do kontekstu. W powyższym przykładzie 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_MEDIAAUDIO_USAGE_UNKNOWN
  • Kontekst game zawiera tylko AUDIO_USAGE_GAME

Kontekst musi być zdefiniowany u góry pliku car_audio_configuration.xml. Gdy konteksty OEM zostaną zdefiniowane, pozostała część konfiguracji audio samochodu może przebiegać tak jak do tej pory. W kontekście dźwięku w samochodzie obowiązują te zasady:

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

  • Nie powtarzaj nazw kontekstów.

  • Nie przypisuj atrybutu audio do wielu kontekstów.

  • Do tworzenia kontekstu należy używać wszystkich zastosowań dźwięku zdefiniowanych w AudioAttributes.

W przypadku definicji kontekstu dźwięku OEM należy używać android.audio.policy.configuration.V7_0.AudioUsage, czyli ciągu znaków reprezentującego użycie 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 migracji z jednej wersji Androida na inną.

Chociaż kontekst zdefiniowany przez OEM został wprowadzony, aby rozszerzyć usługę audio w pluginie OEM, można z niego korzystać bez plugina OEM. Zachowanie dźwięku przypomina zachowanie statycznej usługi audio:

  • Interakcje z aktywizacją audio Atrybut audio służy do określania najlepszego zachowania dopasowywania zgodnie z konfiguracją w ramach matrycy interakcji z uwzględnieniem dźwięku. Więcej informacji znajdziesz w artykule Aktywność audio.

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

    • Grupa objętości na podstawie kontekstu zdefiniowanego przez producenta OEM.
    • Priorytet z skonfigurowanej listy wolumenów statycznych.
  • Zachowanie wyciszania dźwięku:

    • Użycie atrybutu audio dla bieżącego elementu audio służy do mapowania informacji o wyjściowym urządzeniu audio zgodnie z definicją w pliku konfiguracji audio samochodu.

    • 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 w układzie CAP

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

Więcej informacji znajdziesz w strategii produktowej silnika CAP w AAOS.

Konfiguracje dynamicznych stref dźwięku

W Androidzie 14 schemat konfiguracji dźwięku w samochodzie został zaktualizowany do wersji 3, aby uwzględnić dynamiczną konfigurację stref dźwiękowych. Nowy schemat wymaga skonfigurowania dla 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 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ż główne mogą mieć wiele konfiguracji. W przypadku konfiguracji audio w samochodzie obowiązują te zasady:

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

  • Niepodstawowe strefy audio mogą mieć wiele konfiguracji.

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

  • W obrębie strefy dźwiękowej 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 dźwięku powinny być unikalne w przypadku różnych stref lub konfiguracji. Nazwa urządzenia powinna pojawiać się tylko raz w konfiguracji dźwięku lub strefach.

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

  • Każda konfiguracja audio musi mieć przypisane wszystkie konteksty audio (OEM lub statyczne).

Zgodność wsteczna

Chociaż nowe wersje car_audio_configuration.xml wprowadzają nowe funkcje w każdej aktualizacji, w nowszych wersjach AAOS nadal możesz używać starszych plików. Producenci urządzeń OEM, którzy aktualizują swoje urządzenia do nowych wersji Androida, mogą ponownie użyć pliku car_audio_configuration.xml.

Aby korzystać z nowej funkcji, która wymaga nowych informacji 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 pliku, powoduje błąd IllegalStateException po uruchomieniu usługi samochodowej. Komunikat wyjątku zawiera odpowiednie informacje o tym, które dane są używane i której minimalnej wersji jest wymagana.