Zarządzanie woluminami

Zarządzanie głośnością odbywa się w CarAudioService, które używa stałych poziomów głośności. Zakłada się, że poziomy głośności są stosowane poniżej HAL przez wzmacniacz sprzętowy, a nie w oprogramowaniu. CarAudioService organizuje urządzenia wyjściowe w grupy głośności, aby stosować te same wzmocnienia do wszystkich urządzeń powiązanych z grupą głośności.

Woluminy stałe

Implementacje AAOS używają wzmacniacza sprzętowego do sterowania głośnością zamiast miksera programowego. Aby uniknąć efektów ubocznych, ustaw flagę config_useFixedVolume na true (w razie potrzeby nałóż nakładkę):

<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 false), aplikacje mogą wywoływać funkcję AudioManager.setStreamVolume(), aby zmieniać głośność według typu strumienia w mikserze oprogramowania. Nie zawsze jest to pożądane ze względu na potencjalny wpływ na inne aplikacje oraz fakt, że tłumienie głośności w mikserze programowym może skutkować mniejszą liczbą znaczących bitów dostępnych w sygnałach odbieranych przez wzmacniacz sprzętowy.

Grupy tomów

Grupy głośności zarządzają głośnością na wszystkich urządzeniach w strefie audio. Głośnością każdej grupy można sterować niezależnie. Uzyskane wzmocnienie jest konfigurowane na powiązanych urządzeniach, aby było stosowane przez wzmacniacz pojazdu. Ustawienia głośności są zapisywane dla użytkownika i wczytywane, gdy się on zaloguje.

Definiowanie grup woluminów

Usługa CarAudioService korzysta z grup głośności zdefiniowanych w car_audio_configuration.xml:

<audioZoneConfiguration version="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <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>
              </zoneConfig>
              ...
            </zoneConfigs>
        </zone>
     </zones>
</audioZoneConfiguration>

Każda grupa głośności powinna zawierać co najmniej 1 urządzenie wyjściowe z powiązanymi adresami. Adresy powinny odpowiadać urządzeniom wyjściowym zdefiniowanym w zasadzie audio_policy_configuration.xml.

Konfigurowanie wzmocnienia grupy głośności

Każda grupa głośności ma minimalną, maksymalną i domyślną wartość wzmocnienia, a także rozmiar kroku na podstawie wartości skonfigurowanych w audio_policy_configuration.xml dla urządzeń powiązanych z 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 głośności sprawdza wartości wzmocnienia powiązanych urządzeń i konfiguruje grupę w ten sposób:

  • Rozmiar kroku Musi być taka sama na wszystkich urządzeniach kontrolowanych przez grupę głośności.
  • Minimalny zysk Najmniejszy minimalny zysk 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 domyślne wzmocnienie wśród urządzeń w grupie.

Ze względu na sposób konfigurowania tych wartości można ustawić wzmocnienie grupy głośności poza zakresem obsługiwanym przez urządzenie powiązane z tą grupą. W takim przypadku wzmocnienie jest ustawiane na minimalną lub maksymalną wartość wzmocnienia urządzenia w zależności od tego, czy wartość grupy głośności jest poniżej czy powyżej zakresu.

Identyfikatory grupy woluminów

Grupy głośności są identyfikowane w czasie działania w kolejności zdefiniowanej w pliku XML. Identyfikatory w strefie audio mieszczą się w zakresie od 0 do N-1, 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 interfejsów API CarAudioManager powiązanych z grupami woluminów. Każdy interfejs API, który przyjmuje groupId bez zoneId, domyślnie korzysta z głównej strefy audio.

Zarządzanie głośnością w wielu strefach

Każda strefa audio powinna zawierać co najmniej 1 grupę głośności, a każda grupa głośności jest powiązana tylko z jedną strefą audio. Ta relacja jest zdefiniowana w ramach car_audio_configuration.xml. Więcej informacji znajdziesz w przykładzie powyżej w sekcji Definiowanie grup woluminów.

Aktualne poziomy głośności w poszczególnych strefach są zapisywane dla użytkownika powiązanego z daną strefą. Te ustawienia są specyficzne dla strefy, co oznacza, że jeśli użytkownik zaloguje się na wyświetlaczu powiązanym ze strefą główną, a później zaloguje się w strefie powiązanej z dodatkową strefą audio, poziomy głośności wczytane i zachowane dla pierwszej strefy będą się różnić od poziomów w strefie dodatkowej.

Minimalna i maksymalna głośność aktywacji

Android 15 wprowadza kontrolę nad indeksami grup głośności, co zwiększa bezpieczeństwo i komfort użytkowników samochodowych systemów audio. Można to osiągnąć, stosując minimalne i maksymalne poziomy aktywacji skonfigurowane w konfiguracji dźwięku w samochodzie (patrz Definiowanie grup głośności). Możesz włączyć tę funkcję, ustawiając wartość audioUseMinMaxActivationVolume na true w plikach RRO usługi samochodowej.

W sekcji activationVolumeConfig możesz zdefiniować wiele wpisów activationVolumeConfigs, z których każdy reprezentuje inną konfigurację minimalnego i maksymalnego progu aktywacji. Każdy activationVolumeConfig:

  • Musi zawierać unikalny element name w pliku konfiguracji dźwięku w samochodzie, aby można było się do niego później odwoływać w grupie głośności (group).
  • Musi zawierać tylko jeden znak activationVolumeConfigEntry.

Każdy element activationVolumeConfig ma te atrybuty:

  • minActivationVolumePercentage (liczba całkowita, 0–100, opcjonalnie, domyślnie: 0): określa minimalną liczbę aktywacji jako wartość procentową.
  • maxActivationVolumePercentage (liczba całkowita, 0–100, opcjonalny, domyślnie: 100): określa maksymalną objętość aktywacji w procentach.
  • invocationType (string, opcjonalny, domyślnie: onPlaybackChanged): określa warunki, w których stosowana jest minimalna i maksymalna objętość aktywacji:

    • onBoot: dotyczy tylko pierwszego nowo aktywnego odtwarzania w grupie głośności po uruchomieniu.
    • onSourceChanged: stosowane tylko w przypadku nowo aktywnego odtwarzania ze zmienioną aplikacją lub źródłem identyfikatora UID w grupie głośności.
    • onPlaybackChanged: stosowane do każdego nowo aktywowanego odtwarzania w grupie głośności.

CarAudioService zarządza minimalną i maksymalną aktywacją, monitorując te aktywne obecnie podkomponenty audio:

  • Obecnie odtwarzane ścieżki
  • Bieżący stan połączenia
  • Obecne żądanie aktywności audio z warstwy HAL sterowania dźwiękiem, w którym żądanie aktywności audio z tej warstwy sygnalizuje, że aktywne odtwarzanie dźwięku odbywa się poza Androidem.

Poniższy obraz przedstawia ogólny przegląd zarządzania minimalną i maksymalną liczbą aktywacji:

obraz

Rysunek 1. Zarządzanie minimalną i maksymalną głośnością aktywacji aktywnych ścieżek danych audio.

Po określeniu minActivationVolumePercentage, maxActivationVolumePercentage minimalnego i maksymalnego indeksu wzrostu głośności możesz obliczyć minimalny i maksymalny indeks wzrostu głośności aktywacji dla każdej grupy głośności. CarAudioService monitoruje każde nowo aktywne odtwarzanie i stosuje minimalną i maksymalną głośność aktywacji w tych warunkach:

  • Zgodność typu wywołania: typ aktywacji odtwarzania (pochodzący z Menedżera dźwięku, interfejsu HAL sterowania dźwiękiem lub Menedżera telefonii) musi być zgodny z wartością invocationType określoną w activationVolumeConfigEntry powiązanym z grupą głośności.
  • Indeks głośności poza zakresem: bieżący indeks wzmocnienia głośności grupy głośności musi znajdować się poza zdefiniowanym zakresem indeksu wzmocnienia głośności aktywacji, a konkretnie musi być spełniony jeden z tych warunków:

    • Indeks jest niższy niż obliczony minimalny indeks wzrostu wolumenu aktywacji.

      LUB

    • Indeks jest wyższy niż obliczony maksymalny indeks wzrostu wolumenu aktywacji.

W przypadku dopasowania aktywacji indeks wzrostu wolumenu grupy wolumenów zostanie dostosowany do jednej z tych wartości:

  • Minimalny indeks wzrostu głośności aktywacji, jeśli jest niższy niż minimalny indeks wzrostu głośności aktywacji

    LUB

  • Maksymalny indeks wzmocnienia głośności aktywacji, jeśli jest wyższy niż maksymalny indeks wzmocnienia głośności aktywacji

Ponadto zdarzenie grupy głośności samochodu o typie zdarzeniaEVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED jest wysyłane do wszystkich zarejestrowanych wywołań zwrotnych zdarzeń grupy głośności.

Obsługa zdarzeń przycisków głośności

Android definiuje kilka kodów klawiszy do sterowania głośnością, w tym:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Domyślnie Android kieruje zdarzenia przycisków głośności do aplikacji. Implementacje w przypadku motoryzacji powinny wymuszać przetwarzanie tych kluczowych zdarzeń przez CarAudioService, które następnie wywołuje odpowiednio setGroupVolume lub setMasterMute. Aby wymusić takie działanie, ustaw flagę config_handleVolumeKeysInWindowManager na true:

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

W przypadku zdarzeń związanych z przyciskiem głośności nie ma obecnie możliwości rozróżnienia, do której strefy są one przeznaczone. Zakłada się, że wszystkie są powiązane z główną strefą audio. Gdy zostanie odebrane zdarzenie związane z klawiszem głośności, CarAudioService określa, którą grupę głośności dostosować, pobierając konteksty audio dla aktywnych odtwarzaczy, a następnie dostosowując grupę głośności, która zawiera urządzenie wyjściowe powiązane z kontekstem audio o najwyższym priorytecie. Priorytety są ustalane na podstawie stałej kolejności zdefiniowanej w CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Zanikanie i balans

Obie wersje HAL AudioControl zawierają interfejsy API do ustawiania zanikania i równowagi w pojeździe. Odpowiednie interfejsy API systemu CarAudioManager przekazują wartości do interfejsu HAL AudioControl. Te interfejsy API wymagają android.car.permission.CAR_CONTROL_AUDIO_VOLUME. Interfejsy AudioControl API to:

  • setBalanceTowardRight(float value) przesuwa głośność głośnika w prawo (+) lub w lewo (-) samochodu.

    • 0,0 jest wyśrodkowane
    • +1,0 – całkowicie prawidłowa
    • -1,0 to pełna lewa strona
    • Wartość spoza zakresu od -1 do 1 jest błędem.
  • setFadeTowardFront(float value) przesuwa głośność w kierunku przodu (+) lub tyłu (-) samochodu.

    • 0,0 jest wyśrodkowane
    • +1,0 to pełne przekierowanie
    • -1,0 oznacza całkowite cofnięcie
    • Wartość spoza zakresu od -1 do 1 jest błędem.

Ty decydujesz, jak te wartości powinny być stosowane i jak wyświetlać je użytkownikom. Można je stosować wyłącznie do multimediów lub do wszystkich dźwięków na Androidzie. Android 11 wprowadził też obsługę stosowania efektów dźwiękowych na urządzeniach wyjściowych. Dzięki temu można alternatywnie zarządzać zanikaniem i balansem za pomocą efektów audio na odpowiednich urządzeniach wyjściowych, a nie za pomocą tych interfejsów API.

Wyciszanie tła

Wyciszanie tła następuje, gdy pojazd zmniejsza wzmocnienie jednego strumienia, aby inny strumień odtwarzany jednocześnie był lepiej słyszalny. W AAOS wyciszanie tła jest realizowane przez HAL. Android nie ma kontroli nad dźwiękami poza systemem operacyjnym. W Androidzie 11 główną informacją dostępną dla HAL-u do podejmowania decyzji o przyciszaniu jest to, czy 2 urządzenia wyjściowe mają aktywne strumienie.

Kiedy się schylić

To, jak HAL obsługuje wyciszanie, zależy od producenta OEM, ale zalecamy przestrzeganie tych wytycznych.

  • Wiele strumieni odtwarzanych na Androidzie występuje zwykle wtedy, gdy 2 aplikacje lub usługi jednocześnie mają fokus audio. Aby dowiedzieć się, kiedy Android może przyznać równoczesne skupienie, zapoznaj się z macierzą interakcji w sekcji Typy ograniczeń. Wraz z wprowadzeniem wtyczki audio w samochodzie zależy to również od zarządzania fokusem audio.

  • Wszystkie strumienie zmiksowane przez Androida są miksowane przed zastosowaniem jakichkolwiek wzmocnień. Dlatego każdy strumień, który powinien być wyciszany podczas jednoczesnego odtwarzania z innym strumieniem, musi być kierowany do oddzielnych urządzeń wyjściowych, aby HAL mógł zastosować wyciszanie przed zmiksowaniem strumieni.

Poniżej znajdziesz potencjalne interakcje równoczesne, w przypadku których zalecane jest przyciszanie.

Interakcja Działanie
EMERGENCY Wycisza wszystko oprócz SAFETY
SAFETY Wycisza wszystko oprócz EMERGENCY
NAVIGATION Wycisza wszystko oprócz SAFETY i EMERGENCY
CALL Wycisza wszystko oprócz SAFETY, EMERGENCY i NAVIGATION
VOICE Kaczki CALL_RING
VEHICLE_SOUNDS Ty decydujesz o znaczeniu aktywnego dźwięku i o tym, czy ma on przyciszać inne dźwięki.
MUSIC i ANNOUNCEMENT Wszystko go omijało. Wyjątkiem są dźwięki interakcji dotykowych odtwarzane jako SYSTEM_SOUND.

Co wziąć pod uwagę podczas wyciszania

Niektóre aplikacje i usługi, takie jak nawigacja czy asystent, mogą używać wielu odtwarzaczy do wykonywania działań. Unikaj agresywnego wyciszania, gdy strumień danych przestaje przepływać przez urządzenia wyjściowe, aby mieć pewność, że multimedia nie wrócą do pełnej głośności, zanim zostaną wyciszone przed rozpoczęciem odtwarzania z nawigacji lub aplikacji asystenta.

W przypadku pojazdów z kilkoma scenami dźwiękowymi o wystarczającej izolacji możesz kierować dźwięk do różnych obszarów samochodu zamiast go wyciszać. Na przykład instrukcje nawigacji mogą być kierowane do głośników w zagłówku kierowcy, a muzyka może być nadal odtwarzana w całym samochodzie z normalną głośnością.

Dźwięki związane z bezpieczeństwem

W Androidzie 11 wprowadzono interfejsy API HAL do zarządzania aktywnością audio. Warstwa HAL zapewnia, że dźwięki o krytycznym znaczeniu dla bezpieczeństwa mają priorytet przed innymi dźwiękami. Jeśli HAL utrzymuje fokus audio przez USAGE_EMERGENCY, nie ma gwarancji, że aplikacje i usługi z Androida nie będą odtwarzać dźwięków. Warstwa HAL określa, które strumienie z Androida powinny być miksowane lub wyciszane, aby odtwarzać dźwięki o krytycznym znaczeniu dla bezpieczeństwa.

Konfigurowanie interfejsu ustawień głośności

AAOS oddziela interfejs ustawień głośności od konfiguracji grupy głośności. Można je nakładać na siebie w sposób opisany w artykule Konfigurowanie wzmocnienia grupy głośności. Taki podział gwarantuje, że w przypadku zmiany konfiguracji grup woluminów nie trzeba będzie wprowadzać żadnych zmian.

W interfejsie ustawień samochodu element packages/apps/Car/Settings/res/xml/car_volume_items.xml zawiera elementy interfejsu (tytuł i ikony) powiązane z każdym zdefiniowanym elementem AudioAttributes.USAGE. Ten plik zapewnia rozsądne renderowanie zdefiniowanego znaku VolumeGroups przez użycie zasobów powiązanych z pierwszym rozpoznanym użyciem zawartym w każdym znaku VolumeGroup.

Na przykład poniższy przykład definiuje VolumeGroup jako zawierający voice_communication i voice_communication_signalling. Domyślna implementacja interfejsu ustawień samochodu renderuje VolumeGroup za pomocą zasobów powiązanych z voice_communication, ponieważ jest to pierwsze dopasowanie 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żyte w powyższej konfiguracji są zadeklarowane w packages/apps/Car/Settings/res/values/attrs.xml. Interfejs ustawień głośności korzysta z tych interfejsów API CarAudioManager opartych na VolumeGroup:

  • getVolumeGroupCount(), aby dowiedzieć się, ile elementów sterujących należy narysować.
  • getGroupMinVolume()getGroupMaxVolume(), aby uzyskać dolną i górną granicę.
  • getGroupVolume(), aby uzyskać bieżącą głośność.
  • registerVolumeChangeObserver(), aby otrzymywać powiadomienia o zmianach głośności.

Zdarzenie dotyczące grupy wolumenu samochodów

Motoryzacyjne przypadki użycia aktualizacji głośności i przełącznika wyciszania mają podstawy kontekstowe, które mogą określać działania niektórych aplikacji, np. ustawienia głośności. Obecne wywołanie zwrotne głośności i wyciszenia z warstwy audio w samochodzie dostarcza ograniczone informacje kontekstowe. Aby lepiej obsługiwać przypadki użycia w motoryzacji i zapewnić przyszłą skalowalność, w Androidzie 14 dodano CarVolumeGroupEvent. Każde zdarzenie zawiera 3 rodzaje kluczowych informacji:

  • Lista: CarVolumeGroupInfo
  • EventTypes (mapa bitowa)
  • Lista: ExtraInfos

CarVolumeGroupInfo

Odbiorca wywołania zwrotnego zdarzenia ma łatwy dostęp do listy informacji o grupach głośności w samochodzie, na które to zdarzenie wpłynęło. Oznacza to, że aplikacja nie musi wykonywać żadnych dodatkowych wywołań do platformy audio w samochodzie, aby uzyskać najnowszy stan. Może po prostu użyć otrzymanego CarVolumeGroupInfos do zaktualizowania interfejsu lub wewnętrznych stanów. Aby ułatwić to aplikacjom, aspekty, które uległy zmianie w grupie wolumenu samochodów, są też podawane w ramach EventTypes, jak wyjaśniono poniżej.

EventTypes

Określa, który aspekt CarVolumeGroupInfo uległ zmianie. Aplikacje mogą używać tej funkcji do identyfikowania zmian i podejmowania wymaganych działań. Na przykład EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED oznacza, że odpowiedni indeks maksymalnego wzrostu wolumenu CarVolumeGroups uległ zmianie i można go sprawdzić za pomocą zapytania CarVolumeGroupInfo.getMaxVolumeGainIndex().

W tabeli poniżej przedstawiono zależność między kolumnami EventTypeCarVolumeGroupInfo.

EventType CarVolumeGroupInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

ExtraInfos

Zawiera dodatkowe informacje o tym, dlaczego CarVolumeGroup uległ zmianie. Aplikacje mogą używać tych informacji, aby zapewnić dodatkowy kontekst, który pozwoli ostrzec użytkownika lub powiadomić go o konieczności podjęcia działania. Na przykład symbol EXTRA_INFO_TRANSIENT_ATTENUATION_THERMALoznacza aktywną przejściową redukcję mocy z powodu przeciążenia termicznego. Aplikacja może poinformować użytkownika, jeśli spróbuje zwiększyć głośność.

Nie stosujemy żadnego procesu w przypadku ExtraInfos. Decyzja o określeniu procesu na podstawie ExtraInfos należy do Ciebie. Jeśli np. tłumienie jest aktywne z powodu EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, możesz też początkowo przyciemnić interfejs paska głośności, aby uniemożliwić użytkownikowi zmianę głośności. Inni mogą wyświetlać komunikat o aktywnym wyciszaniu i umożliwiać użytkownikowi zmianę głośności.

Platforma audio w samochodzie zależy od interfejsu HAL AudioControl IAudioGainCallback, który zapewnia sugerowane ExtraInfos. Więcej informacji znajdziesz w artykule Audio Gain Callback.

CarVolumeGroupEvent skalowalność, aby sprostać przyszłym potrzebom platformy audio w samochodzie; Nowe funkcje zamierzamy obsługiwać CarVolumeGroupEvent wyłącznie. Zdecydowanie zalecamy, aby deweloperzy aplikacji używali CarVolumeGroupEvent do obsługi zmian głośności grupy i wyciszania.

Wywołanie zwrotne zdarzenia grupy głośności samochodu

Android 14 udostępnia nowe wywołanie zwrotne dla aplikacji uprzywilejowanych i platformowych, które umożliwia rejestrowanie się i otrzymywanie powiadomień o CarVolumeGroupEvents.

  • Aby zarejestrować się w celu skorzystania z wywołania zwrotnego, użyj CarAudioManager#registerCarVolumeGroupEventCallback()

  • Aby wyrejestrować wywołanie zwrotne, użyj CarAudioManager#unregisterCarVolumeGroupEventCallback()

Jeśli aplikacja zarejestruje się w nowym interfejsie CarVolumeGroupEventCallback i starszym interfejsie CarVolumeCallback, zdarzenie CarVolumeGroupEventCallbacks będzie miało wyższy priorytet. Stos audio w samochodzie nie wywołuje już funkcji CarVolumeCallback. Zapobiega to duplikowaniu wywołań tej samej aplikacji w przypadku tego samego zdarzenia.

Zdecydowanie zalecamy używanie CarVolumeGroupEventCallback do zarządzania głośnością grupy i zmianami wyciszenia.

Wywołanie zwrotne wzmocnienia dźwięku

Od Androida 13 interfejs HAL AudioControl może wywoływać asynchroniczne wywołanie zwrotne w celu zarządzania aktualizacjami poziomu głośności spowodowanymi zmianami w systemie audio samochodu.

HAL API

AudioControl @2.0 AIDL

Wersja 2.0 interfejsu AIDL HAL AudioControl dodaje ten interfejs API:

Interfejs API Cel
IAudioControl#registerGainCallback Rejestruje instancję IAudioGainCallback w warstwie HAL AudioControl.
IAudioGainCallback#onAudioDeviceGainsChanged Asynchroniczne wywołanie zwrotne, które powiadamia o zmianach w konfiguracji wzmocnienia dźwięku.

Wywołanie zwrotne AudioControl HAL zawiera listy przyczyn i odpowiednie AudioGainConfigInfo, które obejmują:

  • Identyfikator strefy
  • Adres portu urządzenia
  • Indeks wolumenu > indeks może być indeksem ograniczonym lub indeksem aktualizacji.

Powody można podzielić na te kategorie:

  • Przyczyny ograniczenia Chwilowa zmiana głośności i wyciszenia.
  • Przyczyny aktualizacji Trwała zmiana działania głośności.

Typy ograniczeń

Od AudioControl HAL AIDL V3 obsługiwane są te typy ograniczeń:

  • Wycisz
  • Blokowanie
  • Ograniczenie
  • Tłumienie
Aktywne ograniczenie Zmiana głośności wywołana przez użytkownika Przełącznik wyciszenia uruchamiany przez użytkownika
Wycisz ❌ (wycisz)

✔ (wycisz)
Blokowanie
Ograniczenie ❌ (limit przekroczony)

✔ (limit nieprzekroczony)
Tłumienie

Priorytet ograniczeń jest następujący: wyciszenie > blokowanie > ograniczenie > tłumienie.

Ograniczenia dotyczące wyciszania

Ograniczenia dotyczące wyciszania:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Platforma audio w samochodzie wewnętrznie utrzymuje te 2 stany wyciszenia:

  • Wyciszenie użytkownika Włączane na podstawie prośby użytkownika, za pomocą CarAudioManager lub kluczowych zdarzeń.

  • Wycisz HAL Przełączane na podstawie ograniczeń wyciszenia otrzymanych za pomocą wywołania zwrotnego AudioGain.

Dla odbiorców, takich jak aplikacja Ustawienia, ogólny stan wyciszenia grupy głośności CarVolumeGroupInfo.isMuted() będzie zależeć od tego, czy włączone jest którekolwiek z powyższych wyciszeń.

Gdy wyciszenie HAL jest włączone, wszystkie przychodzące żądania zmiany głośności i wyłączenia wyciszenia grupy są ignorowane przez cały czas trwania ograniczenia.

Przypadek interakcji: wyciszenie HAL jest aktywne, a użytkownik prosi o przełączenie wyciszenia

Gdy wyciszenie HAL jest włączone, a wyciszenie użytkownika jest wyłączone:

  • Ogólny stan wyciszenia grupy głośności został zmieniony na true.
  • Prośby użytkownika o włączenie wyciszenia będą przetwarzane.
    • Przyczyna: prośby użytkowników o wyciszenie powinny być zawsze uwzględniane, aby chronić ich prywatność.

Gdy wyciszenie HAL jest włączone, a wyciszenie użytkownika jest włączone:

  • Ogólny stan wyciszenia grupy głośności został zmieniony na true.

  • Prośby użytkownika o wyłączenie wyciszenia będą NOT przetwarzane. Stan wyciszenia użytkownika w pamięci podręcznej pozostaje włączony.

    • Przyczyna: prośby użytkownika o wyłączenie wyciszenia będą uwzględniane tylko wtedy, gdy nie ma aktywnych ograniczeń.

    • Przyczyna: wyłączenie wyciszenia buforowanego wyciszenia użytkownika może spowodować nieoczekiwany wybuch dźwięku i zagrozić bezpieczeństwu użytkownika. Jest to szczególnie ważne, gdy wyciszenie jest włączone podczas cykli zapłonu, co zmniejsza świadomość użytkowników dotyczącą poziomu dźwięku.

Scenariusz interakcji: wyciszenie HAL włączone i wyłączone, a wyciszenie użytkownika bez zmian

Przełączenie wyciszenia HAL spowoduje zmianę ogólnego stanu wyciszenia grupy głośności. Nie zmienia jednak bezpośrednio stanu wyciszenia użytkownika. Gdy wyciszenie użytkownika jest wyłączone i otrzymano wywołanie zwrotne HAL mute włączające:

  • Ogólny stan wyciszenia grupy głośności został zmieniony na true.
  • Żądania użytkownika dotyczące zmiany głośności będą NOT przetwarzane, gdy wyciszenie HAL jest włączone.

    • Przyczyna: użytkownik nie słyszy dźwięku, gdy wyciszenie jest włączone. Zezwolenie na zmianę głośności może spowodować nagły wzrost głośności i zagrozić bezpieczeństwu użytkownika.

    • Uzasadnienie: aplikacje do obsługi głośności mogą rejestrować wywołania zwrotne i automatycznie wyłączać wyciszenie (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) bez interwencji użytkownika, jeśli jest to oczekiwane zachowanie producenta OEM.

Gdy wyciszenie HAL jest wyłączone, a wyciszenie użytkownika jest wyłączone:

  • Stan wyciszenia grupy głośności został zmieniony na false.

    Przyczyna: utrwalanie stanu wyciszenia i prośba o wyłączenie wyciszenia mogą niepotrzebnie przeszkadzać użytkownikowi, gdy stan wyciszenia jest często przełączany.

  • Żądania użytkowników dotyczące zmiany głośności będą przetwarzane w zwykły sposób.

Blokowanie

Ograniczenia blokowania to:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE.

Gdy ograniczenia blokowania są aktywne, użytkownicy nie mogą:

  • Zmiany głośności nie są przetwarzane.
  • Włączanie i wyłączanie wyciszenia jest przetwarzane.

Ograniczenie

Ograniczenia dotyczące limitów:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Gdy ograniczenia dotyczące limitów są aktywne, użytkownicy nie mogą:

  • Zmień głośność:

    • W ramach ograniczeń są przetwarzane
    • Powyższe ograniczenia nie są przetwarzane.
  • Włączanie i wyłączanie wyciszenia jest przetwarzane.

Tłumienie

Ograniczenia dotyczące tłumienia:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

Gdy ograniczenia dotyczące tłumienia są aktywne, prośby użytkowników o:

  • zmiana głośności, Nowy poziom głośności jest ustawiony na stłumiony poziom głośności (zamiast na poprzedni poziom głośności). Wszelkie przyszłe zmiany głośności będą wprowadzane na tym poziomie.

  • Włączanie i wyłączanie wyciszenia zostało przetworzone.

Aktualizacja indeksu

Za asynchroniczną aktualizację indeksu wolumenu uznaje się:Reasons.EXTERNAL_AMP_VOL_FEEDBACK

Z tego powodu interfejs HAL AudioControl może zaktualizować bieżący indeks grupy głośności do określonego indeksu. Jest to używane głównie jako informacja zwrotna z systemu audio w odpowiedzi na prośbę o zmianę głośności z platformy audio w samochodzie. Informacja o aktualizacji indeksu jest też przekazywana do aplikacji w postaci wywołania zwrotnego CarVolumeGroupEvent, aby zsynchronizować indeks.

Przykłady

Przypadek użycia: użytkownik zmienia indeks głośności na 30

  • Użytkownik używa aplikacji Głośność, aby zmienić indeks głośności na 30.

  • Ten indeks jest przeliczany na wzmocnienie głośności i wysyłany do HAL dźwięku.

  • Implementacje dostawcówAudio HAL otrzymują nową wartość wzmocnienia i aktualizują system audio (np. wzmacniacz zewnętrzny).

  • System audio odpowiada, że poziom głośności został zaktualizowany tylko do indeksu 15 (z przyczyn nieznanych systemowi Android).

  • Implementacje aktywatorówAudioControl HAL dostawców:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Usługa audio w samochodzie korzysta z nowego indeksu z wywołania zwrotnego, który jest używany do utrwalania i wywołań zwrotnych do aplikacji głośności. Indeks żądany przez użytkownika to 30. Jednak asynchroniczne informacje zwrotne z systemu audio aktualizują indeks do wartości 15.

Przypadek użycia: pierwsze odtwarzanie dźwięku po wyjściu z trybu uśpienia

  • Indeks głośności przed zawieszeniem jest ustawiony na wysoki poziom 95 (zakres: [0–99]).

  • Android przechodzi w stan zawieszenia.

  • Gdy Android istnieje, zawieś (np. wznow):

    • Dostawca Audio HAL/AudioControl HAL stosuje lokalnie bezpieczny indeks 30 do systemu audio.

    • Dostawca AudioControl HAL wywołuje też wywołanie zwrotne dla bezpiecznego indeksu:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Usługa audio w samochodzie korzysta z nowego indeksu z wywołania zwrotnego, który jest używany do utrwalania i własnych wywołań zwrotnych do aplikacji głośności synchronizującej indeks. Indeks głośności przed zawieszeniem wynosi 95. Po wznowieniu odtwarzania indeks jest jednak ustawiany na bezpieczny poziom głośności 30 przez implementatora AudioControl HAL.

Konfiguracja woluminu dynamicznego

W przypadku tej funkcji bierzemy pod uwagę te główne przypadki użycia:

  1. Konfiguracja pojazdu na końcu linii produkcyjnej.

    • Producenci samochodów wolą aktualizować konfiguracje głośności na końcu okresu eksploatacji na podstawie konfiguracji systemu audio w pojeździe. Zwykle jest to instalacja z pominięciem sklepu bez aktualizacji obrazu oprogramowania Androida.

    • Producenci samochodów mogą potrzebować zaktualizować konfigurację głośności podczas serwisu.

  2. Konfiguracja środowiska wykonawczego Systemy audio w samochodach obsługują konfiguracje wzmacniaczy zewnętrznych, a te jednostki ECU mogą zawierać konfiguracje zakresu głośności, o które systemy te wysyłają zapytania podczas uruchamiania.

  3. Konfiguracja na żądanie Oferowane w odpowiedzi na rosnące zapotrzebowanie na funkcje audio oparte na popycie, w ramach których użytkownicy subskrybują ulepszone przetwarzanie sygnału na określony czas. Nowe konfiguracje zakresu woluminu obowiązują przez cały okres subskrypcji.

Projektowanie

Konfiguracja dynamicznej głośności odbywa się w 3 etapach:

  • Odkrywanie Implementacja AudioControl HAL dostawcy wykrywa nowe aktualizacje zakresu głośności za pomocą niestandardowego mechanizmu IPC należącego do dostawcy.

    Po wykryciu wywoływane jest wywołanie zwrotne za pomocą funkcji AudioControl::IModuleChangeCallback.

  • Aktualizacja Stos audio w samochodzie aktualizuje stany grup głośności o nowe zakresy głośności.

    Staramy się utrzymać ten sam poziom głośności po aktualizacji zakresu głośności. Jeśli jednak indeks wyjdzie poza zakres, bieżący indeks głośności zostanie ustawiony na bezpieczną wartość. Na przykład domyślny poziom podany przez dostawcę podczas wywołania zwrotnego.

  • Oddzwanianie

    • Po aktualizacji zakresu grupy głośności stos audio w samochodzie wywołuje wywołanie zwrotne do aplikacji zarejestrowanych za pomocą CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent zawiera zaktualizowane CarVolumeGroupInfo, typ zdarzenia (co się zmieniło) i dodatkowe informacje (dlaczego się zmieniło).

obraz

Rysunek 2. Dynamiczna konfiguracja głośności.

HAL API

AudioControl @ 3.0 AIDL

Wersja 3.0 interfejsu AudioControl AIDL HAL wprowadza te interfejsy API:

Interfejs API
IAudioControl#setModuleChangeCallback Ustawia instancję IModuleChangeCallback w przypadku HAL sterowania dźwiękiem.
IAudioControl#clearModuleChangeCallback Usuwa instancję IModuleChangeCallback, która została wcześniej ustawiona za pomocą interfejsu HAL AudioControl.
IModuleChangeCallback#onAudioPortsChanged Wywołanie zwrotne powiadamiające o zmianach w AudioPortach

Sekwencja

Poniżej znajduje się diagram sekwencji dynamicznej konfiguracji woluminu.

obraz

Rysunek 3. Diagram sekwencji dynamicznej konfiguracji woluminu.

Najważniejsze aspekty

Aby zoptymalizować tę funkcję, weź pod uwagę te wskazówki.

  • Obiekty AudioPort dostarczane w ramach wywołania zwrotnego muszą być zgodne z definicją Automotive BUS:

    • Port urządzenia IN_DEVICE, OUT_DEVICE
    • Połączenie.BUS
    • Adres Zdefiniowane w definicji Audio HAL
    • Tryb wzmocnienia.JOINT
  • Dostawcy muszą zdefiniować nadzbiór definicji zakresu głośności w zasadach HAL audio i użyć wywołania zwrotnego, aby dostosować go do różnych wersji pojazdu. Więcej informacji znajdziesz w IModuleChangeCallbacdefinicji AIDL.

  • Jeśli więcej niż 1 ścieżka audio należy do tej samej grupy głośności, każda z nich musi mieć identyczne definicje zakresu głośności. Jeśli tego nie zrobisz, platforma audio w samochodzie odrzuci nową definicję zakresu głośności.