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 głośność jest stosowana 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>

Jeśli 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. Wzmocnienie jest konfigurowane na powiązanych urządzeniach, aby wzmacniacz pojazdu mógł je stosować. 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="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 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 na urządzeniach 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 ten 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 grupie urządzeń.
  • Domyślny wzmocnienie. Najwyższy 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 od 0 do N-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ą przechowywane 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 strefą główną, a potem zaloguje się w strefie powiązanej z dodatkową strefą audio, poziomy głośności zapisane i zapisane w pierwszej strefie będą się różnić od tych w strefie dodatkowej.

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

Zmiana i wyważenie

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 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ą.
    • -1,0 to pełny widok 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ę 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-a, która pozwala podejmować decyzje dotyczące wyciszania, 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 systemie 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ć jednoczesne skupienie, 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 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, 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, zanim zostanie wyciszony przed rozpoczęciem odtwarzania z poziomu nawigacji lub aplikacji 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 przy normalnej 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 istotne 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 związane z bezpieczeństwem.

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ściowej. 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 w samochodach 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 głośności samochodowej, są też dostępne w ramach EventTypes, jak wyjaśniono poniżej.

Typy zdarzeń

Określa, który aspekt CarVolumeGroupInfo uległ zmianie. Aplikacje mogą używać tego 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ą CarVolumeGroupInfo.getMaxVolumeGainIndex().

Poniższa tabela przedstawia 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. 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ślisz 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ć wygładzanie 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 w przypadku 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 związanej z grupą głośności samochodu

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

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

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

Jeśli aplikacja rejestruje się za pomocą nowego zdarzenia CarVolumeGroupEventCallback i starego zdarzenia CarVolumeCallback, priorytet ma zdarzenie CarVolumeGroupEventCallbacks. Komponent 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 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 AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged asynchroniczny callback, który powiadamia 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 ograniczeń. 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 audio samochodu obsługuje wewnętrznie 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 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 wymienionych powyżej wyciszenia.

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 powinny być zawsze respektowane, aby chronić prywatność 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 dźwięku 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. Zezwalanie 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 prośba o wyłączenie wyciszenia mogą niepotrzebnie przerywać użytkownikowi, gdy stan wyciszenia często się zmienia.

  • 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 osłabioną głośność (zamiast na poprzednią głośność). Przyszłe zmiany objętości są wprowadzane na tym poziomie.

  • Przełącz wyciszenie zostało przetworzone.

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ć indeks 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 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 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 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 końcu 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 w trakcie harmonogramu obsługi.

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

    Gdy zostanie wykryty, wywołuje się funkcję 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 1. 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ę 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 z informacją o zmianach w AudioPorts

Sekwencja

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

obraz

Rysunek 2. Sekwencyjny diagram konfiguracji dynamicznego wolumenu.

Najważniejsze aspekty

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

  • Porty audio podane w ramach wywołania zwrotnego 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.