Zarządzanie woluminami

Zarządzanie głośnością znajduje się w zasadzie CarAudioService, która używa stałych woluminów w założeniu, że woluminy są stosowane poniżej HAL przez wzmacniacz sprzętowy, a nie w oprogramowaniu. Funkcja CarAudioService porządkuje urządzenia wyjściowe w grupy głośności, aby zastosować te same korzyści do wszystkich urządzeń powiązanych z grupą woluminów.

Stała głośność

Implementacje AAOS do sterowania głośnością używają wzmacniacza sprzętowego, a nie miksera programowego. Aby uniknąć efektów ubocznych, ustaw flagę config_useFixedVolume na true (w razie potrzeby należy nałożyć 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ć 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 i to, że wyciszanie głośności przez mikser oprogramowania może skutkować mniejszą liczbą istotnych bitów dostępnych w sygnale odbieranym przez wzmacniacz sprzętowy.

Grupy woluminów

Grupy głośności służą do zarządzania poziomem głośności grupy urządzeń w strefie audio. W każdej grupie głośności głośność można regulować niezależnie. Wzmacniacze pojazdu są konfigurowane na powiązanych urządzeniach i stosowane w wynikach wzmocnienia. Ustawienia woluminu są zachowywane dla użytkownika i są wczytywane, gdy użytkownik się zaloguje.

Zdefiniuj grupy woluminów

CarAudioService używa grup głośności zdefiniowanych w car_audio_configuration.xml:

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <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>
        </zone>
     </zones>
</audioZoneConfiguration>

Każda grupa woluminów powinna zawierać co najmniej 1 urządzenie wyjściowe z powiązanymi adresami. Adresy powinny odpowiadać urządzeniom wyjściowym określonym w polu audio_policy_configuration.xml.

Skonfiguruj zyski grup woluminów

Każda grupa głośności ma minimalne, maksymalne i domyślne wartości wzmocnienia oraz rozmiar kroku określony 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 woluminów sprawdza wartości wzmocnienia na powiązanych urządzeniach i konfiguruje grupę w ten sposób:

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

Po skonfigurowaniu tych wartości możliwe jest ustawienie wzmocnienia grupy głośności spoza obsługiwanego zakresu w przypadku urządzenia powiązanego z grupą głośności. W tym przypadku wzmocnienie jest ustawione 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 grup woluminów

Grupy woluminów są identyfikowane w czasie działania w kolejności zdefiniowanej w pliku XML. Identyfikatory mają zakres od 0 do N-1 w strefie audio, gdzie N to liczba grup głośności w danej strefie. W ten sposób identyfikatory grup woluminów nie są unikalne w różnych strefach. Te identyfikatory są używane w CarAudioManager interfejsach API powiązanych z grupami woluminów. Każdy interfejs API, który przyjmuje groupId bez zoneId, domyślnie ustawia główną strefę audio.

Wielostrefowe zarządzanie woluminem

Każda strefa audio powinna mieć co najmniej 1 grupę głośności, a każda grupa powinna być powiązana tylko z 1 strefą audio. Relacja ta została zdefiniowana w zasadzie car_audio_configuration.xml. Więcej informacji znajdziesz w przykładzie powyżej w sekcji Definiowanie grup woluminów.

Bieżące poziomy głośności w każdej strefie są zachowywane dla użytkownika powiązanego z tą strefą. Ustawienia te zależą od strefy – 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 wczytywane i utrzymywane w pierwszej strefie będą inne niż w strefie dodatkowej.

Obsługa kluczowych zdarzeń dotyczących głośności

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Domyślnie Android przekierowuje do aplikacji zdarzenia związane z kluczowymi głośnościami. Implementacje motoryzacyjne powinny wymuszać przetwarzanie tych kluczowych zdarzeń przez funkcję CarAudioService, która następnie wywołuje odpowiednio metodę setGroupVolume lub setMasterMute. Aby wymusić takie działanie, ustaw flagę config_handleVolumeKeysInWindowManager na true:

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

Kluczowe zdarzenia dotyczące głośności nie są obecnie w stanie rozróżnić, do której strefy są przeznaczone. Zakładamy, że wszystkie są powiązane z główną strefą audio. Po otrzymaniu kluczowego zdarzenia CarAudioService określa grupę głośności, którą należy dostosować, pobierając kontekst audio 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ą ustalane na podstawie stałej kolejności zdefiniowanej w polu CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Zanikanie i balans

Obie wersje HAL AudioControl zawierają interfejsy API do ustawiania zanikania i równoważenia w pojeździe. 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 to:

  • setBalanceTowardRight(float value) przesuwa głośność głośnika w stronę prawej (+) lub w lewo (-) w samochodzie.

    • 0,0 jest wyśrodkowane
    • +1.0 to prawda
    • -1,0 to całkowita wartość
    • Wartość spoza zakresu od -1 do 1 jest błędem
  • setFadeTowardFront(float value) zmienia głośność głośnika w kierunku przedniego (+) lub tylnego (-) samochodu.

    • 0,0 jest wyśrodkowane
    • Przycisk +1.0 jest całkowicie do przodu
    • -1,0 w całości na tył
    • Wartość spoza zakresu od -1 do 1 jest błędem

Ty decydujesz, jak powinny być stosowane i jak mają być wyświetlane użytkownikom. Można je stosować bezpośrednio w przypadku multimediów lub wszystkich dźwięków Androida. W Androidzie 11 wprowadzono też obsługę efektów audio na urządzeniach wyjściowych. Dzięki temu możliwe jest sterowanie zanikaniem i balansem za pomocą efektów audio na odpowiednich urządzeniach wyjściowych, a nie z wykorzystaniem tych interfejsów API.

wyciszanie tła.

Wyciszanie tła ma miejsce, gdy pojazd zmniejsza wzmocnienie w jednej transmisji, aby można było usłyszeć wyraźniej dźwięk z innej transmisji w tym samym czasie. W AAOS wyciszanie tła jest wdrażane przez HAL. Android nie kontroluje dźwięków poza systemem operacyjnym. W Androidzie 11 głównymi informacjami dostępnymi dla HAL na potrzeby podejmowania decyzji dotyczących wyciszania transmisji jest to, czy 2 urządzenia wyjściowe mają aktywne strumienie.

Kiedy udawać

Decyzja o sposobie ukrywania treści przez HAL zależy od konkretnego producenta OEM. Zalecamy jednak stosowanie się do podanych niżej wskazówek.

  • Na urządzeniu z Androidem często występuje wiele transmisji, gdy 2 aplikacje lub usługi są jednocześnie odtwarzane. Aby dowiedzieć się, kiedy Android może przyznawać równoczesne skupienie, zapoznaj się z tabelą interakcji w sekcji Typy ograniczeń. Od wprowadzenia wtyczki do samochodowego systemu audio zależy to również od sposobu zarządzania funkcją AudioFocus.

  • Wszystkie strumienie mieszane w Androidzie są wykonywane przed zastosowaniem korzyści. Dlatego każdy strumień, który powinien być wyciszany podczas odtwarzania z innym, powinien zostać przekierowany na osobne urządzenia wyjściowe, aby HAL mógł zastosować wyciszanie przed mieszaniem.

Poniżej podajemy informacje o potencjalnych współbieżnych interakcjach wyciszanych.

Interakcja Działanie
EMERGENCY Wycisza lub wycisza wszystko oprócz SAFETY
SAFETY Powoduje ukrycie wszystkiego oprócz EMERGENCY
NAVIGATION Powoduje ukrycie wszystkiego oprócz SAFETY i EMERGENCY
CALL Powoduje ukrycie wszystkiego oprócz SAFETY, EMERGENCY i NAVIGATION
VOICE Kaczki CALL_RING
VEHICLE_SOUNDS To Ty określasz, jak ważny jest aktywny dźwięk i czy wycisza on inne dźwięki.
MUSICANNOUNCEMENT Nic nie szkodzi. Wyjątkiem są dźwięki interakcji przy dotknięciu odtwarzane jako SYSTEM_SOUND.

O czym warto pamiętać podczas wyciszania

Niektóre aplikacje i usługi, np. nawigacja lub asystent, mogą używać do wykonywania działań wielu graczy. Unikaj agresywnego tłumienia, gdy strumień danych przestanie przepływać przez urządzenia wyjściowe, aby treści multimedialne nie wróciły do pełnej głośności, zanim zostaną wyciszone przed kolejnym odtworzeniem filmu z poziomu nawigacji lub aplikacji Asystenta.

W pojazdach z kilkoma stopniami dźwięku o odpowiedniej izolacji dźwięku możesz przekierować dźwięk do różnych części samochodu, zamiast wyciszać się. Na przykład instrukcje nawigacji można przekierować na głośniki zagłówka kierowcy z zachowaniem normalnej głośności, aby odtwarzać muzykę w całym samochodzie.

Dźwięki zagrażające bezpieczeństwu

W Androidzie 11 wprowadzono interfejsy API sterowania fokusem HAL. HAL sprawia, że dźwięki o istotnym znaczeniu dla bezpieczeństwa są traktowane priorytetowo w porównaniu z innymi dźwiękami. Jeśli HAL przechowuje dźwięk w aplikacji USAGE_EMERGENCY, nie ma gwarancji, że aplikacje i usługi z Androida nie będą odtwarzać dźwięków. HAL określa, które strumienie z Androida należy mieszać lub wyciszać, aby odtwarzać dźwięki o krytycznym znaczeniu dla bezpieczeństwa.

Konfigurowanie interfejsu ustawień woluminu

AAOS oddziela interfejs ustawień głośności od konfiguracji grupy głośności. Można je nałożyć w sposób opisany w sekcji Konfigurowanie wzmocnień grup woluminów. Taki podział sprawia, że w przypadku zmiany konfiguracji grup woluminów nie są wymagane żadne zmiany.

W interfejsie ustawień samochodu element packages/apps/Car/Settings/res/xml/car_volume_items.xml zawiera elementy interfejsu (zasoby tytułu i ikony) powiązane z każdym zdefiniowanym AudioAttributes.USAGE. Ten plik umożliwia uzasadnione renderowanie zdefiniowanego obiektu VolumeGroups dzięki wykorzystaniu zasobów powiązanych z pierwszym rozpoznanym użyciem uwzględnionym w poszczególnych VolumeGroup.

W tym przykładzie VolumeGroup definiuje się jako zawierające voice_communication i voice_communication_signalling. Domyślna implementacja interfejsu ustawień samochodu renderuje element VolumeGroup za pomocą zasobów powiązanych z obiektem voice_communication, ponieważ jest to pierwsza płyta 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ższej konfiguracji są zadeklarowane w packages/apps/Car/Settings/res/values/attrs.xml. Interfejs ustawień głośności używa tych interfejsów API CarAudioManager opartych na VolumeGroup:

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

Zdarzenie dotyczące grupy głośności samochodu

W motoryzowanych przypadkach użycia przełącznika głośności i aktualizacji głośności w poszczególnych okolicznościach można określić kontekst, który może określać działania określonych aplikacji, np. ustawienia głośności. Obecna głośność i wyciszone połączenie zwrotne z samochodowego zestawu audio zapewniają ograniczone informacje kontekstowe. Aby ułatwić obsługę przypadków użycia w branży motoryzacyjnej i przyszłą skalowalność, do Androida 14 dodaliśmy zdarzenie CarVolumeGroupEvent. Każde zdarzenie zawiera 3 krytyczne typy informacji:

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

CarVolumeInfo

Odbiorca wywołania zwrotnego zdarzenia ma gotowy dostęp do listy informacji o grupie głośności w samochodzie, której dotyczy problem. Oznacza to, że aplikacja nie musi nawiązywać żadnych dodatkowych wywołań platformy audio w samochodzie, aby uzyskać najnowszy stan. Wystarczy użyć otrzymanego CarVolumeGroupInfos do zaktualizowania stanów UI lub wewnętrznych. Aby ułatwić działanie aplikacji, w usłudze EventTypes wprowadziliśmy też zmiany w grupie głośności w samochodzie, co wyjaśniamy poniżej.

Typy zdarzeń

Określa, który aspekt elementu CarVolumeGroupInfo uległ zmianie. Na podstawie tych informacji aplikacje mogą wykrywać zmiany i podejmować wymagane działania. Na przykład EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED oznacza, że odpowiedni indeks maksymalnego wzrostu głośności (CarVolumeGroups) zmienił się i może być odczytywany przez funkcję CarVolumeGroupInfo.getMaxVolumeGainIndex().

W tabeli poniżej znajdziesz zależność między EventType a CarVolumeGroupInfo.

Typ zdarzenia CarVolumeInfo
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 CarVolumeInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

Dodatkowe informacje

Zawiera dodatkowe informacje o przyczynach zmiany wymiaru CarVolumeGroup. Aplikacje mogą korzystać z tych informacji, aby zapewnić dodatkowy kontekst informujący użytkownika o konieczności podjęcia działania lub powiadomienia. Na przykład EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL wskazuje aktywne wyciszanie przejściowe spowodowane przeciążeniem termicznym. Aplikacja może poinformować użytkownika, gdy spróbuje zwiększyć głośność.

Nie egzekwujemy żadnych procedur w przypadku domeny ExtraInfos. Decyzja o tym, jak przebiega ten proces, należy do CiebieExtraInfos. Jeśli na przykład wyciszanie jest aktywne z powodu: EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, możesz też początkowo zanikać w interfejsie paska głośności, aby użytkownik nie mógł go zmienić. Inne mogą wyświetlać informację o tym, że wyciszanie tła jest aktywne, i umożliwiać użytkownikowi zmianę głośności.

Platforma audio w samochodzie korzysta z interfejsu HAL IAudioGainCallback AudioControl w celu dostarczania sugerowanego elementu ExtraInfos. Więcej informacji znajdziesz w sekcji Wywołanie zwrotne wzmocnienia dźwięku.

Urządzenie CarVolumeGroupEvent można skalować tak, aby zaspokajać przyszłe potrzeby samochodowej platformy audio. Nowe funkcje zamierzamy obsługiwać CarVolumeGroupEvent wyłącznie. Do obsługi głośności grupy i wyciszania zmian zdecydowanie zalecamy deweloperom aplikacji korzystanie z CarVolumeGroupEvent.

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

Android 14 udostępnia nowe wywołanie zwrotne w przypadku aplikacji z podwyższonymi uprawnieniami i platformy, które umożliwiają rejestrację i otrzymywanie powiadomień na temat CarVolumeGroupEvents.

  • Aby zarejestrować się do oddzwonienia, użyj CarAudioManager#registerCarVolumeGroupEventCallback()

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

Jeśli aplikacja zostanie zarejestrowana przy użyciu nowej wersji CarVolumeGroupEventCallback i starszej wersji CarVolumeCallback, priorytet będzie miał zdarzenie CarVolumeGroupEventCallbacks. System audio w samochodzie nie uruchamia już polecenia CarVolumeCallback. Zapobiega to duplikowaniu aktywatorów w tej samej aplikacji w przypadku danego zdarzenia.

Zdecydowanie zalecamy korzystanie z CarVolumeGroupEventCallback do zarządzania głośnością grupy i zmian wyciszania.

Wywołanie zwrotne wzmocnienia dźwięku

Od Androida 13 funkcja AudioControl HAL może aktywować asynchroniczne wywołanie zwrotne w celu zarządzania zmianami poziomu głośności w związku z zmianami w systemie audio w samochodzie.

Interfejs API HAL

AudioControl @2.0 AIDL

W wersji 2.0 interfejsu AudioControl AIDL HAL dodano następujący interfejs API:

Interfejs API Cel
IAudioControl#registerGainCallback Rejestruje instancję IAudioGainCallback w interfejsie HAL AudioControl.
IAudioGainCallback#onAudioDeviceGainsChanged Asynchroniczne wywołanie zwrotne powiadamiające o zmianach w konfiguracji wzmocnienia dźwięku.

Wywołanie zwrotne HAL AudioControl zawiera listę przyczyn i odpowiednie AudioGainConfigInfo, na które składają się:

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

Przyczyny można ogólnie podzielić:

  • Przyczyny ograniczeń. Tymczasowa zmiana w działaniu głośności i wyciszenia.
  • Przyczyny aktualizacji. Trwała zmiana w działaniu głośności.

Typy ograniczeń

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

  • Wycisz
  • Blokuje
  • Ograniczenie
  • Uwaga
Aktywne ograniczenie Zmiana głośności wywołanej przez użytkownika Przełącznik ignorowania wyzwalanego przez użytkownika
Wycisz ❌ (wyłącz wyciszenie)

✔ (wycisz)
Blokuje
Ograniczenie ❌ (ponad limit)

✔ (poniżej limitu)
Uwaga

Priorytet między ograniczeniami to Wycisz > Blokowanie > Ograniczenie > Attenuation.

Wycisz ograniczenia

Ograniczenia wyciszania:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Samochodowa platforma audio wewnętrznie zachowuje 2 stany wyciszenia:

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

  • Wyciszenie HAL. Przełączono na podstawie ograniczeń wyciszania otrzymanych za pośrednictwem wywołania zwrotnego AudioGain.

Dla słuchaczy, na przykład w aplikacji Ustawienia, ogólny stan wyciszenia grupy głośności (CarVolumeGroupInfo.isMuted()) będzie zależeć od tego, czy włączono któreś z powyższych wyciszeń.

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

Przypadek interakcji: wyciszenie HAL jest aktywne i przełącznik próśb użytkowników o wyciszenie

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

  • Ogólny stan wyciszenia grupy głośności zmieniono na true.
  • Prośby użytkowników o włączenie ignorowania będą przetwarzane.
    • Przyczyna: w celu ochrony prywatności użytkowników prośby o wyciszenie powinny być zawsze uwzględniane.

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

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

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

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

    • Przyczyna: wyłączenie wyciszenia wyciszonego w pamięci podręcznej może wywołać niezamierzone efekty dźwiękowe i zagrozić bezpieczeństwo użytkowników. Dzieje się tak zwłaszcza wtedy, gdy tryb wyciszenia jest włączony w różnych cyklach zapłonu, co zmniejsza świadomość poziomu dźwięku.

Przypadek interakcji: funkcja wyciszenia HAL włączona i wyłączona, gdy funkcja wyciszenia użytkownika nie wprowadza żadnych zmian

Przełączenie wyciszenia HAL zmieni ogólny stan wyciszenia grupy głośności. Nie powoduje to jednak bezpośrednio zmiany stanu wyciszenia użytkownika. Gdy funkcja wyciszenia użytkownika jest wyłączona i otrzymano wywołanie zwrotne funkcji wyciszenia HAL w celu włączenia:

  • Ogólny stan wyciszenia grupy głośności zmieniono na true.
  • Prośby użytkowników o zmianę głośności będą NOT przetwarzane, gdy funkcja wyciszenia HAL jest włączona.

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

    • Przyczyna: aplikacje zwiększające głośność mogą rejestrować się jako wywołania zwrotne i uruchamiać wyłączenie wyciszenia (CarAudioManager.setVolumeGroupmute(...,/* mute=*/ true,..)) automatycznie bez interwencji użytkownika, jeśli jest to oczekiwane przez producenta OEM.

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

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

    Przyczyna: ustawienie stanu wyciszenia na stałe i wysyłanie do użytkownika prośby o wyłączenie wyciszenia może niepotrzebnie przerywać działanie użytkownika w przypadku częstego przełączania stanu wyciszenia.

  • Prośby użytkowników o zmianę liczby będą przetwarzane normalnie.

Blokuje

Ograniczenia blokowania:

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

Gdy włączone są ograniczenia blokowania, żądania od użytkowników są wysyłane na:

  • Zmiany głośności nie są przetwarzane.
  • Przełącznik wyciszenia został przetworzony.

Ograniczenie

Ograniczenia są następujące:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Gdy ograniczenia ograniczeń są aktywne, żądania od użytkowników są wysyłane do:

  • Zmiana głośności:

    • Przetwarzane są dane w ramach ograniczenia
    • Powyżej ograniczenia nie są przetwarzane
  • Przełącznik wyciszenia został przetworzony.

Uwaga

Ograniczenia powiadomień:

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

Gdy ograniczenia powiadomień są aktywne, żądania od użytkowników są wysyłane do:

  • Zmiana głośności została przetworzona. Nowy bieżący poziom głośności zostanie ustawiony na wyciszony (a nie na poprzedni). Kolejne zmiany wartości będą wprowadzane w przyszłości.

  • Przełączenie wyciszenia zostało przetworzone.

Zaktualizuj, aby zindeksować

Ta aktualizacja jest uznawana za asynchroniczną aktualizację indeksu woluminów: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Dzięki temu HAL AudioControl może zaktualizować bieżący indeks grupy głośności do określonego indeksu. Używa się go głównie jako informacji zwrotnej z systemu audio w przypadku żądania zmiany głośności z samochodu. Aktualizacja indeksu jest też przekazywana do Google Apps jako wywołanie zwrotne CarVolumeGroupEvent w celu synchronizowania indeksu.

Przykłady

Przypadek użycia: użytkownik aktualizuje indeks woluminu do 30

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

  • Indeks jest konwertowany na wzmocnienie głośności i wysyłany do audio HAL.

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

  • System audio odpowiada, że poziom głośności jest aktualizowany tylko do indeksu 15 (z przyczyn nieznanych Androidowi).

  • Implementacje aktywatorów AudioControl HAL przez dostawcę:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Samochodowa usługa audio pobiera nowy indeks z wywołania zwrotnego, który jest używany do zapewnienia trwałości i wywołań zwrotnych do aplikacji obsługującej głośność. Żądany przez użytkownika indeks to 30. Jednak sprzężenie asynchroniczne systemu audio aktualizuje indeks do 15.

Przypadek użycia: pierwsze odtworzenie dźwięku po wyłączeniu zawieszenia

  • Indeks woluminu przed zawieszeniem jest ustawiony na wysoki poziom 95 (zakres: [0–99]).

  • Android przechodzi w tryb zawieszenia.

  • Zawieś urządzenie (np. wznów działanie) po utworzeniu Androida:

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

    • Dostawca AudioControl HAL również wywołuje wywołanie zwrotne dla bezpiecznego indeksu:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Samochodowa usługa audio pobiera nowy indeks z wywołania zwrotnego, który jest używany do zapewnienia trwałości, oraz z własnych wywołań zwrotnych do aplikacji synchronizującej indeks głośności. Indeks woluminu przed zawieszeniem wynosi 95. Jednak po wznowieniu indeks ten jest ustawiany przez Implementator AudioControl HAL na bezpieczny poziom głośności 30.

Konfiguracja woluminu dynamicznego

Oto główne przypadki użycia tej funkcji:

  1. Konfiguracja końca linii pojazdu.

    • Producenci samochodów wolą aktualizować konfiguracje głośności na podstawie ustawień systemu audio w pojeździe. Zazwyczaj jest to instalacja z innego urządzenia bez aktualizowania obrazu Androida SW.

    • W ramach harmonogramu usług producenci samochodów mogą być zmuszeni do aktualizacji konfiguracji woluminów.

  2. Konfiguracja środowiska wykonawczego. Samochodowe systemy audio obsługują konfiguracje zewnętrznych wzmacniaczy, które mogą hostować konfiguracje zakresu głośności wysyłane do zapytań podczas uruchamiania.

  3. Konfiguracja na żądanie. Ma to na celu zaspokojenie rosnącego zapotrzebowania na funkcje audio oparte na zapotrzebowaniu, w przypadku których użytkownicy subskrybują ulepszone przetwarzanie sygnałów na określony czas. Nowe konfiguracje zakresów woluminów są ważne przez cały okres subskrypcji.

Design

Dynamiczna konfiguracja woluminu odbywa się w 3 etapach:

  • Odkrywanie treści. Implementacja HAL dostawcy AudioControl wykrywa nowe aktualizacje zakresu woluminów za pomocą niestandardowego mechanizmu IPC należącego do dostawcy.

    Po wykryciu wywołanie zwrotne jest generowane przez AudioControl::IModuleChangeCallback.

  • Aktualizuj. Automatyczny system audio 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 wykracza poza dopuszczalny zakres, bieżący indeks woluminów zostanie ustawiony na wartość bezpieczną. Może to być na przykład domyślny poziom udostępniany przez dostawcę podczas wywołania zwrotnego.

  • Oddzwanianie.

    • Po zaktualizowaniu zakresu grupy głośności system audio w samochodzie wywołuje wywołanie zwrotne do aplikacji zarejestrowanych w CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent zawiera zaktualizowane elementy CarVolumeGroupInfo, Typ zdarzenia (zmiana) i Dodatkowe informacje (dlaczego uległ zmianie).

obraz

Rysunek 1. Konfiguracja woluminu dynamicznego.

Interfejs API HAL

AudioControl @ 3.0 AIDL

W wersji 3.0 interfejsu AudioControl AIDL HAL wprowadzono te interfejsy API:

Interfejs API
IAudioControl#setModuleChangeCallback Ustawia instancję IModuleChangeCallback z HAL AudioControl.
IAudioControl#clearModuleChangeCallback Czyści instancję IModuleChangeCallback wcześniej ustawioną za pomocą interfejsu HAL AudioControl.
IModuleChangeCallback#onAudioPortsChanged Oddzwanianie do powiadomień o zmianach w AudioPortach

Sekwencja

Schemat sekwencji konfiguracji woluminu dynamicznego wyświetla się poniżej.

obraz

Rysunek 2. Diagram sekwencji do konfiguracji woluminu dynamicznego.

Najważniejsze aspekty

Aby zoptymalizować tę funkcję, weź pod uwagę poniższe kwestie.

  • Porty audio dostarczane w ramach wywołania zwrotnego muszą być zgodne z definicją interfejsu Automotive BUS:

    • Port urządzenia. IN_DEVICE, OUT_DEVICE
    • Połączenie. BUS
    • Adres. Zdefiniowane w definicji HAL audio
    • Tryb wzmocnienia JOINT
  • Dostawcy muszą zdefiniować nadrzędny zbiór definicji zakresów głośności w zasadach dotyczących HAL i użyć wywołania zwrotnego, aby dostosować go do wersji pojazdów. Więcej informacji znajdziesz w definicji AIDL IModuleChangeCallbac.

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