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 poniżej 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 dźwięku w samochodzie

Rysunek 1. Omówienie architektury dźwięku 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 samochodu 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ękową 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 tego, aby utworzyć miks 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 pogrupowane w grupę CarAudioContexts. Te konteksty audio 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:

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

CarAudioContext Powiązane atrybutyUsages
MUZYCZNA UNKNOWN
GAME
MEDIA
NAWIGACJA ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
ZADZWOŃ VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
POWIADOMIENIE NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
ALARM EMERGENCY
BEZPIECZEŃSTWO SAFETY
VEHICLE_STATUS VEHICLE_STATUS
POWIADOMIENIE ANNOUNCEMENT

Włączanie routingu AAOS

Aby korzystać z routingu na podstawie AAOS, musisz ustawić flagę audioUseDynamicRouting na wartość 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.

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 audio na różne urządzenia. Umożliwia to HAL-owi stosowanie różnych efektów postprodukcyjnych 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 tłumienia dźwięku. Na przykład prośba o awaryjne skupienie na dźwięku ma wyższy priorytet niż inna prośba o skupienie.

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

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ć audioZoneIddo 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 powyżej, ale z wykorzystaniem nowego pola do mapowania identyfikatora strefy pasażera i identyfikatora strefy dźwięku, 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>

Powyższa konfiguracja definiuje mapowanie strefy głównej na strefę 0 oraz audioZoneId 1 na occupantZoneId 1. Ogólnie można skonfigurować dowolne mapowanie strefy pasażera i strefy audio. Mapowanie musi być jednak jeden-do-jednego. Poniżej znajdziesz reguły, które zdefiniowały 2 nowe pola.

  • audioZoneId w przypadku głównej strefy to zawsze identyfikator PRIMARY_AUDIO_ZONE. Jeśli zdefiniujesz 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 bardziej aktywne zarządzanie zachowaniem dźwięku nadzorowanym przez usługę audio 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 OEM
  • Konfiguracje dynamiczne strefy innej niż główna

kontekst dźwięku w samochodzie 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 zdefiniowanych powyżej. Ten kontekst zdefiniowany przez producenta OEM można zdefiniować w pliku car_audio_configuration.xml wersji 3.

Zamiast tego używane są obecnie zdefiniowane statyczne konteksty audio. Poniżej przedstawiono ogólny format zdefiniowanego przez producenta OEM kontekstu dźwięku w samochodzie.

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
  • game context 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 dźwięku w samochodzie może przebiegać tak jak wcześniej. 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 matricy 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 fokusa audio służy do zmapowania 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.

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 dźwięku 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ć tę 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. Komunikat wyjątku zawiera odpowiednie informacje o tym, które dane są używane i której minimalnej wersji jest wymagana.