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 do sterowania głośnością używany jest wzmacniacz sprzętowy, a nie mikser programowy. Aby uniknąć skutków ubocznych, ustaw flagę config_useFixedVolume na true (w razie potrzeby dodaj zaznaczenie):

<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 i to, ż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ą w przypadku zbioru urządzeń w strefie audio. Głośność każdej grupy 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 grupy objętości

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 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 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 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ć unikalną wartość 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ą liczbę aktywacji jako wartość procentowa.
  • maxActivationVolumePercentage (liczba całkowita, 0–100, opcjonalnie, domyślnie 100): określa maksymalny poziom aktywacji w postaci wartości procentowej.
  • 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ęku do 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 invocationType określonym 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.

Jeśli aktywacja się zgadza, indeks wzrostu wolumenu grupy wolumenu zostanie dostosowany do jednego z tych ustawień:

  • 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 zdarzeń grupy głośności samochodu o typie EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED jest wysyłane zdarzenie grupy głośności samochodu.

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>

Obecnie nie ma możliwości odróżnienia, do której strefy mają być przypisane kluczowe zdarzenia dotyczące głośności. Zakłada się, że wszystkie są powiązane z główną strefą audio. 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 interfejsy API systemu 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 całkowicie 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 do przodu
    • -1,0 to 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 w celu 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 działa w 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ą zmiksowane przed zastosowaniem wzmocnienia. Dlatego każdy strumień, który powinien być wyciszony podczas odtwarzania jednocześ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, które zalecamy pominąć.

Interakcja Działanie
EMERGENCY Wyciszenie wszystkich dźwięków 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 skończyło się dobrze. 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 nawigacyjnej 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 wyciszać. 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 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 głośności samochodu

W przypadku samochodów funkcje zmiany 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 wyciszania 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 funkcji, aspekty, które uległy zmianie w grupie głośności samochodu, są też 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 wzrostu wolumenu uległ zmianie i można go zapytać za pomocą parametru CarVolumeGroupInfo.getMaxVolumeGainIndex().

Poniższa tabela pokazuje związek 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 wyświetlić użytkownikowi dodatkowy kontekst, który pomoże mu podjąć działanie lub poinformować 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ą interfejsu CarVolumeGroupEvent. Zalecamy, aby deweloperzy aplikacji używali CarVolumeGroupEvent do obsługi zmian głośności grupy i wyciszania.

Zwrot funkcji wywołania zdarzenia dotyczącego grupy głośności samochodu

Android 14 udostępnia nowy wywołanie zwrotne dla aplikacji uprzywilejowanych i aplikacji platformowych, aby mogły rejestrować się 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. Pakiet audio samochodowy nie powoduje już aktywacji CarVolumeCallback. Zapobiega to powielaniu wyzwalaczy w tej samej aplikacji w przypadku 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 zależności od zmian w systemie audio samochodu.

API HAL

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ń:

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

✔ (wyciszenie)
Blokowanie
Ograniczenie ❌ (przekroczony limit)

✔ (nie przekroczono limitu)
tłumienie,

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

Ograniczenia wyciszania

Ograniczenia dotyczące wyciszenia:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

System audio 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 wyciszony. Przełączanie na podstawie ograniczeń wyciszenia otrzymanych w ramach wywołania zwrotnego AudioGain.

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 wyżej wymienionych wyciszeń.

Gdy funkcja wyciszenia HAL jest włączona, 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 głośnoś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 włączone jest wyciszenie HAL i wyciszenie użytkownika:

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

  • Prośby użytkownika o wyłączenie wyciszenia będą NOTprzetwarzane. 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 w 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 na temat 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 zmienia on jednak bezpośrednio stanu wyciszenia użytkownika. Gdy wyciszenie użytkownika jest wyłączone i otrzymano wywołanie zwrotne wyciszenia HAL w celu włączenia:

  • Ogólny stan wyciszenia grupy głośnoś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. Zezwalanie na zmianę głośności może spowodować wybuch dźwięku i zagrażać bezpieczeństwu użytkownika.

    • Powód: 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 prośba o wyłączenie wyciszenia mogą 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 ograniczenia tłumienia są aktywne, 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 interfejsu Audio HAL.

  • Implementacje dostawców Audio HAL 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 dźwięku w samochodzie używa nowego indeksu z wywołania zwrotnego, który jest używany do trwałości i wywołań zwrotnych do aplikacji głośności. Indeks żądany przez użytkownika to 30. Jednak asynchroniczny sygnał zwrotny systemu audio aktualizuje 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 tryb 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 ten indeks jest ustawiany przez implementatora AudioControl HAL na bezpieczny poziom głośności 30.

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 popycie, w ramach których użytkownicy subskrybują ulepszone przetwarzanie sygnału przez określony czas. Nowe konfiguracje zakresu objętości 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 okna AudioControl::IModuleChangeCallback generowany jest wywołanie zwrotne.

  • 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.

API HAL

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ę IModuleChangeCallback wcześniej ustawioną za pomocą interfejsu AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Połączenie zwrotne w celu powiadomienia 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 HAL dźwięku
    • 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ć je 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.