Zarządzanie woluminami

Zarządzanie głośnością jest zawarte w CarAudioService, który 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 przez oprogramowanie. CarAudioService porządkuje 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

W implementacjach AAOS głośność jest regulowana za pomocą wzmacniacza sprzętowego, a nie miksera programowego. Aby uniknąć skutków ubocznych, ustaw flagę config_useFixedVolume na true (nakładaj w razie potrzeby):

<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 zmienić głośność w zależności od typu strumienia w mikserze programowym. Nie zawsze jest to pożądane ze względu na potencjalne skutki dla innych aplikacji oraz fakt, że tłumienie głośności w mikserze programowym może spowodować, że sygnał otrzymany przez wzmacniacz sprzętowy będzie zawierał mniej znaczących bitów.

Grupy objętości

Grupy głośności zarządzają głośnością kolekcji urządzeń w strefie audio. Głośność w poszczególnych grupach głośności można regulować niezależnie. Wzmocnienia są konfigurowane na powiązanych urządzeniach, aby mogły być stosowane przez wzmacniacz pojazdu. Ustawienia głośności są zapisywane dla użytkownika i wczytywane, gdy się zaloguje.

Definiowanie grup woluminów

Usługa CarAudioService używa 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 pliku audio_policy_configuration.xml.

Konfigurowanie zysków z grupy wolumenu

Każda grupa głośności ma wartości minimalne, maksymalne i domyślne 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 inicjalizacji grupa głośności sprawdza wartości wzmocnienia powiązanych urządzeń i konfiguruje grupę w następujący sposób:

  • wielkość kroku, Musi być taki sam na wszystkich urządzeniach kontrolowanych przez grupę woluminów.
  • Minimalny przyrost. Najmniejszy minimalny przyrost wśród urządzeń w grupie.
  • Maksymalny przyrost. Największe wzmocnienie wśród urządzeń w grupie.
  • Domyślny wzmocnienie. Największy domyślny przyrost wśród urządzeń w grupie.

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

Identyfikatory grup wolumenów

Grupy głośności są identyfikowane w czasie wykonywania w kolejności zdefiniowanej w pliku XML. Identyfikatory mieszczą się w zakresie 0N-1 w strefie audio, gdzie N to liczba grup głośności w tej strefie. W ten sposób identyfikatory grup wolumenów nie są unikalne w różnych strefach. Te identyfikatory są używane w przypadku interfejsów API CarAudioManager powiązanych z grupami wolumenów. Każdy interfejs API, który przyjmuje parametr groupId bez parametru zoneId, domyślnie przyjmuje główną strefę audio.

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

Każda strefa dźwięku powinna mieć co najmniej 1 grupę głośności, a każda grupa głośności jest powiązana tylko z 1 strefą dźwięku. 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.

Obecne poziomy głośności dla każdej strefy są zapisywane dla użytkownika powiązanego ze strefą. Te ustawienia są specyficzne dla strefy, co oznacza, że jeśli użytkownik zaloguje się na wyświetlaczu powiązanym z główną strefą, a następnie zaloguje się w strefie powiązanej z dodatkową strefą audio, poziomy głośności załadowane i utrzymywane w pierwszej strefie będą się różnić od tych w strefie dodatkowej.

Minimalny i maksymalny wolumen aktywacji

Android 15 wprowadza kontrolę nad indeksami grup głośności, aby zwiększyć bezpieczeństwo i wygodę użytkowników systemów audio w samochodach. Osiąga się to dzięki zastosowaniu minimalnych i maksymalnych poziomów aktywacji skonfigurowanych w konfiguracji audio samochodu (patrz Definiowanie grup głośności). Możesz włączyć tę funkcję, ustawiając wartość audioUseMinMaxActivationVolume na true w RRO usługi Car Service.

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

  • Musi zawierać unikalny identyfikator name w pliku konfiguracji dźwięku samochodowego, aby można było później odwołać się do niego w grupie głośności (group).
  • Może zawierać tylko 1 wartość activationVolumeConfigEntry.

Każdy element activationVolumeConfig zawiera te atrybuty:

  • minActivationVolumePercentage (liczba całkowita, 0–100, opcjonalnie, domyślnie 0): określa minimalną objętość aktywacji w procentach.
  • maxActivationVolumePercentage (liczba całkowita, 0–100, opcjonalnie, domyślnie 100): określa maksymalny poziom aktywacji w procentach.
  • invocationType (ciąg znaków, opcjonalnie, domyślnie: onPlaybackChanged): definiuje warunki, w których stosuje się minimalną i maksymalną wielkość aktywacji:

    • onBoot: dotyczy tylko pierwszego nowego odtwarzania w grupie woluminów po uruchomieniu.
    • onSourceChanged: dotyczy tylko nowo rozpoczętego odtwarzania z zmienioną aplikacją lub identyfikatorem UID w grupie objętej objętością.
    • onPlaybackChanged: dotyczy każdego nowego aktywnego odtwarzania w grupie głośności.

CarAudioService zarządza minimalną i maksymalną aktywacją, monitorując te obecnie aktywne komponenty dźwiękowe:

  • bieżące aktywne ścieżki odtwarzania;
  • Bieżący stan rozmowy
  • Bieżące żądanie skupienia dźwięku z interfejsu Audio Control HAL, w którym żądanie skupienia dźwięku z interfejsu Audio Control HAL sygnalizuje, że aktywne odtwarzanie dźwięku odbywa się poza Androidem.

Na poniższym obrazie znajdziesz ogólne omówienie minimalnego i maksymalnego zarządzania objętością aktywacji:

obraz

Rysunek 1. Minimalne i maksymalne ścieżki danych aktywnych dźwięków w ramach zarządzania objętością aktywacji.

Na podstawie określonych wartości minActivationVolumePercentage i maxActivationVolumePercentage, czyli minimalnego i maksymalnego indeksu wzrostu liczby odtworzeń, możesz obliczyć minimalny i maksymalny indeks wzrostu liczby aktywacji dla każdej grupy objętości. CarAudioServicemonitoruje każde nowo aktywne odtwarzanie i zachowuje minimalny i maksymalny poziom głośności aktywacji w tych warunkach:

  • Zgodność typu wywołania: typ aktywacji odtwarzania (pochodzący z Audio Managera, interfejsu Audio Control HAL lub menedżera telefonii) musi być zgodny z wartościąinvocationType określoną w activationVolumeConfigEntry powiązanym z grupą głośności.
  • Indeks objętości poza zakresem: bieżący indeks przyrostu objętości grupy objętości musi znajdować się poza zdefiniowanym zakresem indeksu przyrostu objętości aktywacji. W szczególności musi być spełniony jeden z tych warunków:

    • Wskaźnik jest niższy niż obliczony minimalny wskaźnik wzrostu objętości aktywacji.

      LUB

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

W przypadku dopasowania aktywacji indeks wzrostu wolumenu grupy wolumenu zostanie dostosowany do jednego z tych elementów:

  • indeks wzrostu minimalnej objętości aktywacji, jeśli jest on niższy niż indeks wzrostu minimalnej objętości aktywacji;

    LUB

  • Indeks maksymalnego przyrostu objętości aktywacji, jeśli jest wyższy niż indeks maksymalnego przyrostu objętości aktywacji

Ponadto do wszystkich zarejestrowanych wywołań zwrotnych zdarzenia dotyczącego grupy głośności w samochodzie o typie EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED wysyłane jest zdarzenie dotyczące grupy głośności w samochodzie.

Obsługa zdarzeń związanych z klawiszami 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 związane z klawiszami głośności do aplikacji. W przypadku implementacji w samochodach te kluczowe zdarzenia powinny być przetwarzane przez funkcję CarAudioService, która następnie wywołuje funkcję setGroupVolume lub setMasterMute, w stosownym przypadku. Aby wymusić to zachowanie, ustaw flagę config_handleVolumeKeysInWindowManager na true:

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

Kluczowe zdarzenia dotyczące głośności nie pozwalają obecnie na rozróżnienie, do której strefy są przeznaczone, i zakłada się, że wszystkie są powiązane z główną strefą dźwiękową. Gdy otrzymane zostanie zdarzenie związane z klawiszem głośności, CarAudioService określa, którą grupę głośności ma dostosować, pobierając konteksty audio dla aktywnych odtwarzaczy, a następnie dostosowując grupę głośności zawierającą urządzenie wyjściowe powiązane z kontekstem audio o najwyższym priorytecie. Priorytety są określane na podstawie ustalonej kolejności zdefiniowanej w CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Zanikanie i balans

Obie wersje interfejsu AudioControl HAL zawierają interfejsy API do ustawiania ścieżki i balansu w pojazdzie. Odpowiednie systemowe interfejsy API dla CarAudioManager przekazują wartości do interfejsu AudioControl HAL. Te interfejsy API wymagają: android.car.permission.CAR_CONTROL_AUDIO_VOLUME. Interfejsy API AudioControl:

  • setBalanceTowardRight(float value) przesuwa głośność głośnika w prawą (+) lub lewą (-) stronę samochodu.

    • Wartość 0,0 jest wyśrodkowana.
    • +1.0 jest w pełni prawidłowe
    • -1.0 to pełna odległość w lewo
    • Wartość spoza zakresu od -1 do 1 jest błędna.
  • setFadeTowardFront(float value) przesuwa głośność głośnika w stronę przodu (+) lub tyłu (-) samochodu.

    • Wartość 0,0 jest wyśrodkowana.
    • +1.0 jest w pełni zgodny z najnowszą wersją.
    • Wartość -1,0 oznacza, że obiekt jest całkowicie z tyłu.
    • Wartość spoza zakresu od -1 do 1 jest błędna.

Ty decydujesz, jak te wartości mają być stosowane i jak wyświetlać je użytkownikom. Mogą one dotyczyć tylko multimediów lub 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żesz alternatywnie zarządzać ściemnianiem i balansem za pomocą efektów dźwiękowych na odpowiednich urządzeniach wyjściowych, a nie za pomocą tych interfejsów API.

Wyciszanie tła

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

Kiedy się kłaść

Chociaż to poszczególni producenci OEM decydują o tym, jak funkcja wyciszania jest obsługiwana przez HAL, zalecamy przestrzeganie tych wskazówek.

  • Wiele strumieni odtwarzanych na Androidzie zwykle występuje, gdy 2 aplikacje lub usługi mają jednocześnie fokus audio. Aby dowiedzieć się, kiedy Android może przyznać jednoczesny fokus, zapoznaj się z macierzą interakcji w Typach ograniczeń. Wprowadzenie wtyczki audio do samochodu zależy też od zarządzania funkcją AudioFocus.

  • Wszystkie strumienie zmiksowane przez Androida są miksowane przed zastosowaniem wzmocnienia. Dlatego każdy strumień, który powinien być wyciszony podczas odtwarzania równocześnie z innym, powinien być kierowany na osobne urządzenia wyjściowe, aby HAL mógł zastosować wyciszenie przed zmiksowaniem.

Poniżej znajdziesz listę potencjalnych równoczesnych interakcji, w przypadku których zalecamy stosowanie tłumienia.

Interakcja Działanie
EMERGENCY Wyciszenie wszystkiego oprócz SAFETY
SAFETY Odrzuca wszystko oprócz EMERGENCY
NAVIGATION Omijaj wszystko oprócz SAFETY i EMERGENCY
CALL Wyklucza wszystko oprócz SAFETY, EMERGENCY i NAVIGATION
VOICE Kaczki CALL_RING
VEHICLE_SOUNDS Ty decydujesz o istotności aktywnego dźwięku i o tym, czy ma on przytłumiać inne dźwięki.
MUSICANNOUNCEMENT Wszystko minęło obok. Wyjątkiem są dźwięki dotykowe odtwarzane jako SYSTEM_SOUND.

Uwagi dotyczące wyciszania

Niektóre aplikacje i usługi, takie jak nawigacja czy asystent, mogą używać wielu odtwarzaczy do wykonywania czynności. Unikaj agresywnego odtwarzania dźwięku, gdy strumień danych przestaje być przesyłany przez urządzenia wyjściowe. Dzięki temu media nie powrócą do pełnej głośności przed 3 odtwarzaniem następnego dźwięku z aplikacji do nawigacji lub asystenta.

W przypadku pojazdów z wieloma etapami dźwięku o wystarczającej izolacji możesz kierować dźwięk do różnych obszarów samochodu zamiast stosować tłumienie. Na przykład instrukcje nawigacji mogą być kierowane do głośników w zagłówku kierowcy, a muzyka nadal będzie odtwarzana w całej kabinie z normalną głośnością.

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

Android 11 wprowadził interfejsy HAL Audio Focus API. HAL zapewnia, że dźwięki krytyczne dla bezpieczeństwa mają wyższy priorytet niż inne dźwięki. Jeśli HAL ma wyłączność na dźwięk przez USAGE_EMERGENCY, nie ma gwarancji, że aplikacje i usługi na Androidzie nie będą odtwarzać dźwięku. HAL określa, które strumienie z Androida powinny być miksowane lub wyciszane, aby odtwarzać dźwięki istotne 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ć w sposób opisany w artykule Konfigurowanie zysków grupy objętości. Dzięki temu nie trzeba wprowadzać żadnych zmian w przypadku zmiany konfiguracji grup woluminów.

W interfejsie ustawień samochodu packages/apps/Car/Settings/res/xml/car_volume_items.xmlznajdują się elementy interfejsu (zasoby tytułu i ikony) powiązane z każdym z zdefiniowanych AudioAttributes.USAGE. Ten plik zapewnia odpowiednie renderowanie zdefiniowanego VolumeGroups za pomocą zasobów powiązanych z pierwszym rozpoznanym użyciem zawartym w każdym VolumeGroup.

Na przykład w tym przykładzie definiujemy VolumeGroup jako zbiór voice_communicationvoice_communication_signalling. Domyślna implementacja interfejsu ustawień samochodu renderuje VolumeGroup za pomocą zasobów powiązanych z voice_communication, ponieważ jest to pierwszy element dopasowania 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żej opisanej konfiguracji są zadeklarowane w elementach packages/apps/Car/Settings/res/values/attrs.xml. Interfejs użytkownika ustawień głośności korzysta z tych interfejsów CarAudioManager API opartych na VolumeGroup:

  • getVolumeGroupCount(), aby dowiedzieć się, ile elementów sterujących powinno być wyświetlanych.
  • 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 związane z grupą głośności samochodu

W przypadku samochodów funkcje aktualizacji głośności i wyciszania mają kontekstowe podstawy, które mogą określać działania niektórych aplikacji, takie jak ustawienia głośności. Bieżący wywołanie zwrotne dotyczące głośności i wyciszenia z poziomu sterowania dźwiękiem w samochodzie zawiera ograniczone informacje kontekstowe. Aby lepiej obsługiwać przypadki użycia związane z samochodami i zapewnić przyszłą skalowalność, do Androida 14 dodano zdarzenie CarVolumeGroupEvent. Każde zdarzenie zawiera 3 rodzaje kluczowych informacji:

  • Lista CarVolumeGroupInfo
  • EventTypes (mapowanie bitowe)
  • Lista ExtraInfos

CarVolumeGroupInfo

Odbiorca wywołania zwrotnego ma bezpośredni dostęp do listy informacji o grupach objętego problemem poziomu głośności. Oznacza to, że aplikacja nie musi wykonywać żadnych dodatkowych wywołań do interfejsu Car Audio Framework, aby uzyskać najnowszy stan. Może ona po prostu użyć otrzymanego CarVolumeGroupInfos do zaktualizowania interfejsu lub wewnętrznych stanów. Aby ułatwić aplikacjom korzystanie z tych informacji, aspekty, które uległy zmianie w grupie objętej objętością, są również dostępne w ramach EventTypes, jak wyjaśniono poniżej.

EventTypes

Określa, który aspekt CarVolumeGroupInfo uległ zmianie. Aplikacje mogą używać tych informacji do wykrywania zmian i podejmowania wymaganych działań. Na przykład:EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED wskazuje, że odpowiedni indeks CarVolumeGroups maksymalnego przyrostu sprzedaży zmienił się i można go zapytać za pomocą CarVolumeGroupInfo.getMaxVolumeGainIndex().

Poniższa tabela pokazuje związek między 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ła zmianie. Aplikacje mogą używać tych informacji, aby wyświetlić użytkownikowi dodatkowe informacje, które pomogą mu podjąć działanie lub powiadomić go o czymś. Na przykład EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL wskazuje na aktywne przejściowe tłumienie z powodu przeciążenia termicznego. Aplikacja może poinformować użytkownika, jeśli spróbuje zwiększyć głośność.

Nie stosujemy żadnych procesów w przypadku ExtraInfos. To od Ciebie zależy, jak określić proces na podstawie ExtraInfos. Jeśli na przykład tłumienie jest aktywne z powodu EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, możesz też początkowo stosować zniekształcenie paska głośności, aby uniemożliwić użytkownikowi zmianę głośności. Inni mogą wyświetlić komunikat, że wyciszenie jest aktywne, i zezwolić użytkownikowi na zmianę głośności.

Usługa dźwiękowa w samochodzie korzysta z interfejsu AudioControl HAL IAudioGainCallback do dostarczania sugerowanych ExtraInfos. Więcej informacji znajdziesz w artykule Pomoc dotycząca funkcji wywołania zwrotnego wzmocnienia dźwięku.

CarVolumeGroupEvent skalowanie w celu zaspokojenia przyszłych potrzeb związanych z systemem audio w samochodzie. Zamierzamy obsługiwać nowe funkcje tylko za pomocą CarVolumeGroupEvent. Zdecydowanie zalecamy, aby deweloperzy aplikacji używali CarVolumeGroupEvent do obsługi zmian głośności grupy i wyciszania.

Zwrot funkcji wywołania zdarzenia związanego z grupą głośności w samochodzie

Android 14 udostępnia nowy wywołanie zwrotne dla aplikacji uprzywilejowanych i aplikacji platformowych, aby mogły się zarejestrować i otrzymywać powiadomienia o CarVolumeGroupEvents.

  • Aby zarejestrować się na wywołanie zwrotne, użyj:CarAudioManager#registerCarVolumeGroupEventCallback()

  • Aby anulować rejestrację wywołania zwrotnego, użyj:CarAudioManager#unregisterCarVolumeGroupEventCallback()

Jeśli aplikacja rejestruje się za pomocą nowego atrybutu CarVolumeGroupEventCallback i starego atrybutu CarVolumeCallback, priorytet ma zdarzenie CarVolumeGroupEventCallbacks. Komponent audio samochodowy nie powoduje już aktywacji CarVolumeCallback. Zapobiega to powielaniu wyzwalaczy w tej samej aplikacji dla tego samego zdarzenia.

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

wywołanie zwrotne dotyczące wzmocnienia dźwięku,

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

Interfejs HAL API

AudioControl @2.0 AIDL

Wersja 2.0 interfejsu AudioControl AIDL HAL dodaje te interfejsy API:

Interfejs API Cel
IAudioControl#registerGainCallback Rejestruje wystąpienie IAudioGainCallback w interfejsie AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged asynchroniczne wywołanie zwrotne z informacją o zmianach w konfiguracji wzmocnienia dźwięku.

Wywołanie zwrotne HAL AudioControl zawiera listy powodów i odpowiednich AudioGainConfigInfo, które składają się z tych elementów:

  • Identyfikator strefy
  • Adres portu urządzenia
  • Indeks objętości > indeks może być indeksem ograniczonym lub indeksem aktualizacji.

Powody można ogólnie podzielić na 3 kategorie:

  • Przyczyny ograniczenia. Przejściowa zmiana zachowania głośności i wyciszania.
  • Zaktualizuj powody trwała zmiana zachowania 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 ❌ (wyciszenie)

✔ (wyciszenie)
Blokowanie
Ograniczenie ❌ (powyżej limitu)

✔ (poniżej limitu)
tłumienie,

Priorytet ograniczeń to wyciszenie > blokowanie > ograniczenie > tłumienie.

Ograniczenia wyciszania

Ograniczenia dotyczące wyciszania:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

System dźwiękowy samochodu obsługuje wewnętrznie te 2 stany wyciszenia:

  • Wyciszanie użytkownika. Przełączanie na podstawie prośby użytkownika za pomocą CarAudioManager lub kluczowych zdarzeń.

  • HAL, wycisz. Przełączanie na podstawie ograniczeń wyciszenia otrzymanych przez AudioGain callback.

W przypadku aplikacji takich jak Ustawienia stan ogólnego wyciszenia grupy głośności (CarVolumeGroupInfo.isMuted()) będzie zależał od tego, czy włączone jest jedno z wyciszania wymienionych powyżej.

Gdy wyciszenie HAL jest włączone, wszystkie przychodzące prośby o zmianę głośności i wyciszenia grupy są ignorowane przez czas trwania ograniczenia.

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

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

  • Ogólny stan wyciszenia grupy objętości został zmieniony na true.
  • Prośby użytkownika o włączenie wyciszenia będą przetwarzane.
    • Przyczyna: prośby o wyciszenie użytkownika powinny być zawsze respektowane, aby zapewnić ochronę prywatności użytkowników.

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

  • Ogólny stan wyciszenia grupy objętoś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.

    • Uzasadnienie: prośby o odblokowanie użytkownika będą uwzględniane tylko wtedy, gdy nie ma aktywnych ograniczeń.

    • Przyczyna: wyłączenie wyciszenia użytkownika z wykorzystaniem pamięci podręcznej może spowodować nieoczekiwane zwiększenie głośności i zagrażać bezpieczeństwu użytkownika. Jest to szczególnie ważne, jeśli wyciszenie jest włączone w cyklach zapłonu, co zmniejsza świadomość użytkowników w zakresie postrzegania poziomu dźwięku.

Przypadek interakcji: wyciszenie HAL włączone i wyłączone, podczas gdy wyciszenie użytkownika nie ulega zmianie

Przełączanie wyciszenia HAL spowoduje zmianę ogólnego stanu wyciszenia grupy głośności. Nie aktualizuje on jednak bezpośrednio stanu wyciszenia użytkownika. Gdy wyciszenie użytkownika jest wyłączone, a HAL wyciszenie otrzymuje wywołanie zwrotne z prośbą o włączenie:

  • Ogólny stan wyciszenia grupy objętości został zmieniony na true.
  • Prośby użytkownika o zmianę głośności będą NOTprzetwarzane, gdy funkcja wyciszania HAL jest włączona.

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

    • Uzasadnienie: aplikacje do regulacji głośności mogą rejestrować wywołania zwrotne i uruchamiać odtwarzanie dźwięku (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automatycznie bez udziału użytkownika, jeśli jest to oczekiwane zachowanie 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.

    Uzasadnienie: przyklejenie stanu wyciszenia i proszenie użytkownika o wyłączenie wyciszenia może niepotrzebnie przerywać użytkownikowi, gdy stan wyciszenia jest często przełączany.

  • Prośby użytkowników o zmianę objętości będą przetwarzane w zwykły sposób.

Blokowanie

Ograniczenia blokowania:

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

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

  • Zmiany głośności nie będą przetwarzane.
  • Włączanie i wyłączanie wyciszenia

Ograniczenie

Ograniczenia:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

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

  • Zmiana głośności:

    • Przetwarzanie w ramach limitu
    • Powyższe ograniczenia nie są przetwarzane.
  • Włączanie i wyłączanie wyciszenia

tłumienie,

Ograniczenia tłumienia:

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

Gdy aktywne są ograniczenia osłabiania, użytkownicy nie mogą:

  • Zmiana głośności jest przetwarzana. Nowy bieżący poziom głośności jest ustawiony na głośność osłabioną (zamiast pierwotnej głośności). Przyszłe zmiany objętości są wprowadzane na tym poziomie.

  • Przełącz wyciszenie jest przetwarzane.

Aktualizacja indeksu

Asynchroniczna aktualizacja indeksu objętości to:Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Z tego powodu interfejs AudioControl HAL może zaktualizować bieżący indeks grupy głośności do określonego indeksu. Jest ona używana głównie jako informacja zwrotna z systemu audio w przypadku prośby o zmianę głośności z ramy systemu audio samochodu. Aktualizacja indeksu jest również przekazywana aplikacjom jako wywołanie zwrotne CarVolumeGroupEvent w celu synchronizacji indeksu.

Przykłady

Przypadek użycia: użytkownik zmienia wskaźnik głośności na 30

  • Użytkownik używa aplikacji Volume, aby zmienić wskaźnik głośności na 30.

  • Ten indeks jest przekształcany w wzmocnienie głośności i przesyłany do Audio HAL.

  • Implementacje Audio HAL dostawców otrzymują nowy wzmocnienie głośności i aktualizują system audio (np. zewnętrzny wzmacniacz).

  • System audio odpowiada, że poziom głośności został zaktualizowany tylko do indeksu 15 (z nieznanych Androidowi powodów).

  • Implementacje dostawców:AudioControl HAL

    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 trwałości i wywołań zwrotnych do aplikacji sterowania głośnością. Indeks żądany przez użytkownika to 30. Jednak asynchroniczne informacje zwrotne systemu audio aktualizują indeks do 15.

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

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

  • Android przechodzi w stan zawieszenia.

  • Gdy Android zawiesi działanie (np. wznowi):

    • Dostawca Audio HAL/AudioControl HAL stosuje lokalnie bezpieczny wskaźnik 30 do systemu audio.

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

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Usługa dźwięku w samochodzie używa nowego indeksu z wywołania zwrotnego, który jest używany do trwałości, oraz własnych wywołań zwrotnych do aplikacji sterowania głośnością, która synchronizuje indeks. Indeks wolumenu przed zawieszeniem wynosi 95. Jednak po wznowieniu indeks jest ustawiany na bezpieczny poziom głośności 30 przez implementatora AudioControl HAL.

Dynamiczna konfiguracja głośności

W przypadku tej funkcji rozważamy te podstawowe przypadki użycia:

  1. Konfiguracja pojazdu na koniec linii (EOL).

    • Producenci samochodów wolą aktualizować konfiguracje głośności w ramach EOL na podstawie konfiguracji systemu audio pojazdu. Zwykle jest to wczytywanie z urządzenia bez aktualizowania obrazu oprogramowania Android.

    • Producenci samochodów mogą potrzebować aktualizacji konfiguracji objętości podczas harmonogramu serwisowania.

  2. Konfiguracja środowiska wykonawczego Systemy audio samochodowe obsługują konfiguracje zewnętrznych wzmacniaczy, a te sterowniki mogą hostować konfiguracje zakresu głośności, które są zapytane podczas uruchamiania.

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

Projektowanie

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

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

    Po wykryciu żądania generowany jest wywołanie zwrotne za pomocą AudioControl::IModuleChangeCallback.

  • Aktualizacja. Komponent audio samochodowy aktualizuje stany grupy głośności za pomocą nowych zakresów głośności.

    Staramy się zachować ten sam poziom głośności po aktualizacji zakresu głośności. Jeśli jednak indeks wykracza poza zakres, bieżący indeks wolumenu jest ustawiany na bezpieczną wartość. Na przykład domyślny poziom określony przez dostawcę podczas rozmowy zwrotnej.

  • Oddzwanianie.

    • Po aktualizacji zakresu grupy głośności pakiet audio samochodowy uruchamia wywołanie zwrotne do aplikacji zarejestrowanych za pomocą CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent zawiera zaktualizowane wartości CarVolumeGroupInfo, typ zdarzenia (co się zmieniło) i informacje dodatkowe (dlaczego nastąpiła zmiana).

obraz

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

Interfejs HAL API

AudioControl @ 3.0 AIDL

Wersja 3.0 interfejsu AudioControl AIDL HAL zawiera te interfejsy API:

Interfejs API
IAudioControl#setModuleChangeCallback Ustawia instancję interfejsu IModuleChangeCallback za pomocą interfejsu AudioControl HAL.
IAudioControl#clearModuleChangeCallback Czyści instancję interfejsu IModuleChangeCallback wcześniej ustawioną za pomocą interfejsu AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Połączenie zwrotne z informacją o zmianach w AudioPorts

Sekwencja

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

obraz

Rysunek 3. Sekwencyjny diagram konfiguracji dynamicznego wolumenu.

Najważniejsze aspekty

Aby zoptymalizować tę funkcję, weź pod uwagę te kwestie.

  • Porty audio podane w wywołaniu zwrotnym muszą odpowiadać definicji Automotive BUS:

    • Port urządzenia. IN_DEVICE, OUT_DEVICE
    • Połączenie BUS
    • Adres. Zdefiniowane w definicji interfejsu Audio HAL
    • Tryb wzmocnienia JOINT
  • Dostawcy muszą zdefiniować superzbiór definicji zakresu głośności w zasadach dotyczących dźwięku HAL i użyć wywołania zwrotnego, aby dostosować go do wariantów pojazdu. Więcej informacji znajdziesz w definicji IModuleChangeCallbac AIDL.

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