Zarządzanie głośnością odbywa się w CarAudioService, które używa stałych poziomów głośności. Zakłada się, że poziomy głośności są stosowane poniżej HAL przez wzmacniacz sprzętowy, a nie w oprogramowaniu. CarAudioService organizuje urządzenia wyjściowe w grupy głośności, aby stosować te same wzmocnienia do wszystkich urządzeń powiązanych z grupą głośności.
Woluminy stałe
Implementacje AAOS używają wzmacniacza sprzętowego do sterowania głośnością zamiast miksera programowego. Aby uniknąć efektów ubocznych, ustaw flagę config_useFixedVolume na true (w razie potrzeby nałóż nakładkę):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
Gdy flaga config_useFixedVolume nie jest ustawiona (lub jest ustawiona na false), aplikacje mogą wywoływać funkcję AudioManager.setStreamVolume(), aby zmieniać głośność według typu strumienia w mikserze oprogramowania. Nie zawsze jest to pożądane ze względu na potencjalny wpływ na inne aplikacje oraz fakt, że tłumienie głośności w mikserze programowym może skutkować mniejszą liczbą znaczących bitów dostępnych w sygnałach odbieranych przez wzmacniacz sprzętowy.
Grupy tomów
Grupy głośności zarządzają głośnością na wszystkich urządzeniach w strefie audio. Głośnością każdej grupy można sterować niezależnie. Uzyskane wzmocnienie jest konfigurowane na powiązanych urządzeniach, aby było stosowane przez wzmacniacz pojazdu. Ustawienia głośności są zapisywane dla użytkownika i wczytywane, gdy się on zaloguje.
Definiowanie grup woluminów
Usługa CarAudioService korzysta z grup głośności zdefiniowanych w car_audio_configuration.xml:
<audioZoneConfiguration version="4">
</deviceConfigurations>
<activationVolumeConfigs>
<activationVolumeConfig name="activation_volume_on_boot_config">
<activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
invocationType="onBoot" />
</activationVolumeConfig>
...
</activationVolumeConfigs>
<zones>
<zone name="primary zone" isPrimary="true">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group activationConfig="activation_volume_on_boot_config">
<device address="bus0_media_out">
<context context="music"/>
</device>
</group>
<group>
<device address="bus1_navigation_out">
<context context="navigation"/>
</device>
<device address="bus2_voice_command_out">
<context context="voice_command"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
...
</zoneConfigs>
</zone>
</zones>
</audioZoneConfiguration>
Każda grupa głośności powinna zawierać co najmniej 1 urządzenie wyjściowe z powiązanymi adresami. Adresy powinny odpowiadać urządzeniom wyjściowym zdefiniowanym w zasadzie audio_policy_configuration.xml.
Konfigurowanie wzmocnienia grupy głośności
Każda grupa głośności ma minimalną, maksymalną i domyślną wartość wzmocnienia, a także rozmiar kroku na podstawie wartości skonfigurowanych w audio_policy_configuration.xml dla urządzeń powiązanych z grupą głośności.
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
<profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
<gains>
<gain name="" mode="AUDIO_GAIN_MODE_JOINT"
minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
</gains>
</devicePort>
Podczas inicjowania grupa głośności sprawdza wartości wzmocnienia powiązanych urządzeń i konfiguruje grupę w ten sposób:
- Rozmiar kroku Musi być taka sama na wszystkich urządzeniach kontrolowanych przez grupę głośności.
- Minimalny zysk Najmniejszy minimalny zysk wśród urządzeń w grupie.
- Maksymalny zysk Najwyższe maksymalne wzmocnienie wśród urządzeń w grupie.
- Wzmocnienie domyślne Najwyższe domyślne wzmocnienie wśród urządzeń w grupie.
Ze względu na sposób konfigurowania tych wartości można ustawić wzmocnienie grupy głośności poza zakresem obsługiwanym przez urządzenie powiązane z tą grupą. W takim przypadku wzmocnienie jest ustawiane na minimalną lub maksymalną wartość wzmocnienia urządzenia w zależności od tego, czy wartość grupy głośności jest poniżej czy powyżej zakresu.
Identyfikatory grupy woluminów
Grupy głośności są identyfikowane w czasie działania w kolejności zdefiniowanej w pliku XML.
Identyfikatory w strefie audio mieszczą się w zakresie od 0 do N-1, gdzie N to liczba grup głośności w tej strefie. W ten sposób identyfikatory grup woluminów nie są unikalne w różnych strefach. Te identyfikatory są używane w przypadku interfejsów API CarAudioManager powiązanych z grupami woluminów. Każdy interfejs API, który przyjmuje groupId bez zoneId, domyślnie korzysta z głównej strefy audio.
Zarządzanie głośnością w wielu strefach
Każda strefa audio powinna zawierać co najmniej 1 grupę głośności, a każda grupa głośności jest powiązana tylko z jedną strefą audio. Ta relacja jest zdefiniowana w ramach car_audio_configuration.xml. Więcej informacji znajdziesz w przykładzie powyżej w sekcji Definiowanie grup woluminów.
Aktualne poziomy głośności w poszczególnych strefach są zapisywane dla użytkownika powiązanego z daną strefą. Te ustawienia są specyficzne dla strefy, co oznacza, że jeśli użytkownik zaloguje się na wyświetlaczu powiązanym ze strefą główną, a później zaloguje się w strefie powiązanej z dodatkową strefą audio, poziomy głośności wczytane i zachowane dla pierwszej strefy będą się różnić od poziomów w strefie dodatkowej.
Minimalna i maksymalna głośność aktywacji
Android 15 wprowadza kontrolę nad indeksami grup głośności, co zwiększa bezpieczeństwo i komfort użytkowników samochodowych systemów audio. Można to osiągnąć, stosując minimalne i maksymalne poziomy aktywacji skonfigurowane w konfiguracji dźwięku w samochodzie (patrz Definiowanie grup głośności). Możesz włączyć tę funkcję, ustawiając wartość audioUseMinMaxActivationVolume na true w plikach RRO usługi samochodowej.
W sekcji activationVolumeConfig możesz zdefiniować wiele wpisów activationVolumeConfigs, z których każdy reprezentuje inną konfigurację minimalnego i maksymalnego progu aktywacji. Każdy activationVolumeConfig:
- Musi zawierać unikalny element
namew pliku konfiguracji dźwięku w samochodzie, aby można było się do niego później odwoływać w grupie głośności (group). - Musi zawierać tylko jeden znak
activationVolumeConfigEntry.
Każdy element activationVolumeConfig ma te atrybuty:
minActivationVolumePercentage(liczba całkowita, 0–100, opcjonalnie, domyślnie: 0): określa minimalną liczbę aktywacji jako wartość procentową.maxActivationVolumePercentage(liczba całkowita, 0–100, opcjonalny, domyślnie: 100): określa maksymalną objętość aktywacji w procentach.invocationType(string, opcjonalny, domyślnie:onPlaybackChanged): określa warunki, w których stosowana jest minimalna i maksymalna objętość aktywacji:onBoot: dotyczy tylko pierwszego nowo aktywnego odtwarzania w grupie głośności po uruchomieniu.onSourceChanged: stosowane tylko w przypadku nowo aktywnego odtwarzania ze zmienioną aplikacją lub źródłem identyfikatora UID w grupie głośności.onPlaybackChanged: stosowane do każdego nowo aktywowanego odtwarzania w grupie głośności.
CarAudioService zarządza minimalną i maksymalną aktywacją, monitorując te aktywne obecnie podkomponenty audio:
- Obecnie odtwarzane ścieżki
- Bieżący stan połączenia
- Obecne żądanie aktywności audio z warstwy HAL sterowania dźwiękiem, w którym żądanie aktywności audio z tej warstwy sygnalizuje, że aktywne odtwarzanie dźwięku odbywa się poza Androidem.
Poniższy obraz przedstawia ogólny przegląd zarządzania minimalną i maksymalną liczbą aktywacji:
Rysunek 1. Zarządzanie minimalną i maksymalną głośnością aktywacji aktywnych ścieżek danych audio.
Po określeniu minActivationVolumePercentage, maxActivationVolumePercentage minimalnego i maksymalnego indeksu wzrostu głośności możesz obliczyć minimalny i maksymalny indeks wzrostu głośności aktywacji dla każdej grupy głośności. CarAudioService
monitoruje każde nowo aktywne odtwarzanie i stosuje minimalną i maksymalną głośność aktywacji w tych warunkach:
- Zgodność typu wywołania: typ aktywacji odtwarzania (pochodzący z Menedżera dźwięku, interfejsu HAL sterowania dźwiękiem lub Menedżera telefonii) musi być zgodny z wartością
invocationTypeokreśloną wactivationVolumeConfigEntrypowiązanym z grupą głośności. Indeks głośności poza zakresem: bieżący indeks wzmocnienia głośności grupy głośności musi znajdować się poza zdefiniowanym zakresem indeksu wzmocnienia głośności aktywacji, a konkretnie musi być spełniony jeden z tych warunków:
Indeks jest niższy niż obliczony minimalny indeks wzrostu wolumenu aktywacji.
LUB
Indeks jest wyższy niż obliczony maksymalny indeks wzrostu wolumenu aktywacji.
W przypadku dopasowania aktywacji indeks wzrostu wolumenu grupy wolumenów zostanie dostosowany do jednej z tych wartości:
Minimalny indeks wzrostu głośności aktywacji, jeśli jest niższy niż minimalny indeks wzrostu głośności aktywacji
LUB
Maksymalny indeks wzmocnienia głośności aktywacji, jeśli jest wyższy niż maksymalny indeks wzmocnienia głośności aktywacji
Ponadto zdarzenie grupy głośności samochodu o typie zdarzeniaEVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED jest wysyłane do wszystkich zarejestrowanych wywołań zwrotnych zdarzeń grupy głośności.
Obsługa zdarzeń przycisków głośności
Android definiuje kilka kodów klawiszy do sterowania głośnością, w tym:
KEYCODE_VOLUME_UPKEYCODE_VOLUME_DOWNKEYCODE_VOLUME_MUTE
Domyślnie Android kieruje zdarzenia przycisków głośności do aplikacji. Implementacje w przypadku motoryzacji powinny wymuszać przetwarzanie tych kluczowych zdarzeń przez CarAudioService, które następnie wywołuje odpowiednio setGroupVolume lub setMasterMute. Aby wymusić takie działanie, ustaw flagę config_handleVolumeKeysInWindowManager na true:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
W przypadku zdarzeń związanych z przyciskiem głośności nie ma obecnie możliwości rozróżnienia, do której strefy są one przeznaczone. Zakłada się, że wszystkie są powiązane z główną strefą audio. Gdy zostanie odebrane zdarzenie związane z klawiszem głośności, CarAudioService określa, którą grupę głośności dostosować, pobierając konteksty audio dla aktywnych odtwarzaczy, a następnie dostosowując grupę głośności, która zawiera urządzenie wyjściowe powiązane z kontekstem audio o najwyższym priorytecie. Priorytety są ustalane na podstawie stałej kolejności zdefiniowanej w CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.
Zanikanie i balans
Obie wersje HAL AudioControl zawierają interfejsy API do ustawiania zanikania i równowagi w pojeździe. Odpowiednie interfejsy API systemu CarAudioManager przekazują wartości do interfejsu HAL AudioControl. Te interfejsy API wymagają android.car.permission.CAR_CONTROL_AUDIO_VOLUME. Interfejsy AudioControl API to:
setBalanceTowardRight(float value)przesuwa głośność głośnika w prawo (+) lub w lewo (-) samochodu.- 0,0 jest wyśrodkowane
- +1,0 – całkowicie prawidłowa
- -1,0 to pełna lewa strona
- Wartość spoza zakresu od -1 do 1 jest błędem.
setFadeTowardFront(float value)przesuwa głośność w kierunku przodu (+) lub tyłu (-) samochodu.- 0,0 jest wyśrodkowane
- +1,0 to pełne przekierowanie
- -1,0 oznacza całkowite cofnięcie
- Wartość spoza zakresu od -1 do 1 jest błędem.
Ty decydujesz, jak te wartości powinny być stosowane i jak wyświetlać je użytkownikom. Można je stosować wyłącznie do multimediów lub do wszystkich dźwięków na Androidzie. Android 11 wprowadził też obsługę stosowania efektów dźwiękowych na urządzeniach wyjściowych. Dzięki temu można alternatywnie zarządzać zanikaniem i balansem za pomocą efektów audio na odpowiednich urządzeniach wyjściowych, a nie za pomocą tych interfejsów API.
Wyciszanie tła
Wyciszanie tła następuje, gdy pojazd zmniejsza wzmocnienie jednego strumienia, aby inny strumień odtwarzany jednocześnie był lepiej słyszalny. W AAOS wyciszanie tła jest realizowane przez HAL. Android nie ma kontroli nad dźwiękami poza systemem operacyjnym. W Androidzie 11 główną informacją dostępną dla HAL-u do podejmowania decyzji o przyciszaniu jest to, czy 2 urządzenia wyjściowe mają aktywne strumienie.
Kiedy się schylić
To, jak HAL obsługuje wyciszanie, zależy od producenta OEM, ale zalecamy przestrzeganie tych wytycznych.
Wiele strumieni odtwarzanych na Androidzie występuje zwykle wtedy, gdy 2 aplikacje lub usługi jednocześnie mają fokus audio. Aby dowiedzieć się, kiedy Android może przyznać równoczesne skupienie, zapoznaj się z macierzą interakcji w sekcji Typy ograniczeń. Wraz z wprowadzeniem wtyczki audio w samochodzie zależy to również od zarządzania fokusem audio.
Wszystkie strumienie zmiksowane przez Androida są miksowane przed zastosowaniem jakichkolwiek wzmocnień. Dlatego każdy strumień, który powinien być wyciszany podczas jednoczesnego odtwarzania z innym strumieniem, musi być kierowany do oddzielnych urządzeń wyjściowych, aby HAL mógł zastosować wyciszanie przed zmiksowaniem strumieni.
Zalecane zachowanie podczas duckingu
Poniżej znajdziesz potencjalne interakcje równoczesne, w przypadku których zalecane jest przyciszanie.
| Interakcja | Działanie |
|---|---|
EMERGENCY
| Wycisza wszystko oprócz SAFETY
|
SAFETY |
Wycisza wszystko oprócz EMERGENCY |
NAVIGATION |
Wycisza wszystko oprócz SAFETY i EMERGENCY |
CALL |
Wycisza wszystko oprócz SAFETY, EMERGENCY i NAVIGATION |
VOICE |
Kaczki CALL_RING |
VEHICLE_SOUNDS |
Ty decydujesz o znaczeniu aktywnego dźwięku i o tym, czy ma on przyciszać inne dźwięki. |
MUSIC i ANNOUNCEMENT |
Wszystko go omijało. Wyjątkiem są dźwięki interakcji dotykowych odtwarzane jako
SYSTEM_SOUND.
|
Co wziąć pod uwagę podczas wyciszania
Niektóre aplikacje i usługi, takie jak nawigacja czy asystent, mogą używać wielu odtwarzaczy do wykonywania działań. Unikaj agresywnego wyciszania, gdy strumień danych przestaje przepływać przez urządzenia wyjściowe, aby mieć pewność, że multimedia nie wrócą do pełnej głośności, zanim zostaną wyciszone przed rozpoczęciem odtwarzania z nawigacji lub aplikacji asystenta.
W przypadku pojazdów z kilkoma scenami dźwiękowymi o wystarczającej izolacji możesz kierować dźwięk do różnych obszarów samochodu zamiast go wyciszać. Na przykład instrukcje nawigacji mogą być kierowane do głośników w zagłówku kierowcy, a muzyka może być nadal odtwarzana w całym samochodzie z normalną głośnością.
Dźwięki związane z bezpieczeństwem
W Androidzie 11 wprowadzono interfejsy API HAL do zarządzania aktywnością audio. Warstwa HAL zapewnia, że dźwięki o krytycznym znaczeniu dla bezpieczeństwa mają priorytet przed innymi dźwiękami. Jeśli HAL utrzymuje fokus audio przez USAGE_EMERGENCY, nie ma gwarancji, że aplikacje i usługi z Androida nie będą odtwarzać dźwięków. Warstwa HAL określa, które strumienie z Androida powinny być miksowane lub wyciszane, aby odtwarzać dźwięki o krytycznym znaczeniu dla bezpieczeństwa.
Konfigurowanie interfejsu ustawień głośności
AAOS oddziela interfejs ustawień głośności od konfiguracji grupy głośności. Można je nakładać na siebie w sposób opisany w artykule Konfigurowanie wzmocnienia grupy głośności. Taki podział gwarantuje, że w przypadku zmiany konfiguracji grup woluminów nie trzeba będzie wprowadzać żadnych zmian.
W interfejsie ustawień samochodu element packages/apps/Car/Settings/res/xml/car_volume_items.xml
zawiera elementy interfejsu (tytuł i ikony) powiązane z każdym zdefiniowanym elementem AudioAttributes.USAGE. Ten plik zapewnia rozsądne renderowanie zdefiniowanego znaku VolumeGroups przez użycie zasobów powiązanych z pierwszym rozpoznanym użyciem zawartym w każdym znaku VolumeGroup.
Na przykład poniższy przykład definiuje VolumeGroup jako zawierający
voice_communication i voice_communication_signalling. Domyślna implementacja interfejsu ustawień samochodu renderuje VolumeGroup za pomocą zasobów powiązanych z voice_communication, ponieważ jest to pierwsze dopasowanie w pliku.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
<item car:usage="voice_communication"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="voice_communication_signalling"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="media"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="game"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="alarm"
car:title="@*android:string/volume_alarm"
car:icon="@*android:drawable/ic_audio_alarm"/>
<item car:usage="assistance_navigation_guidance"
car:title="@string/navi_volume_title"
car:icon="@drawable/ic_audio_navi"/>
<item car:usage="notification_ringtone"
car:title="@*android:string/volume_ringtone"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistant"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="notification"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_request"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_instant"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_delayed"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_event"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_accessibility"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_sonification"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="unknown"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>
Atrybuty i wartości użyte w powyższej konfiguracji są zadeklarowane w packages/apps/Car/Settings/res/values/attrs.xml. Interfejs ustawień głośności korzysta z tych interfejsów API CarAudioManager opartych na VolumeGroup:
getVolumeGroupCount(), aby dowiedzieć się, ile elementów sterujących należy narysować.getGroupMinVolume()igetGroupMaxVolume(), aby uzyskać dolną i górną granicę.getGroupVolume(), aby uzyskać bieżącą głośność.registerVolumeChangeObserver(), aby otrzymywać powiadomienia o zmianach głośności.
Zdarzenie dotyczące grupy wolumenu samochodów
Motoryzacyjne przypadki użycia aktualizacji głośności i przełącznika wyciszania mają podstawy kontekstowe, które mogą określać działania niektórych aplikacji, np. ustawienia głośności. Obecne wywołanie zwrotne głośności i wyciszenia z warstwy audio w samochodzie dostarcza ograniczone informacje kontekstowe. Aby lepiej obsługiwać przypadki użycia w motoryzacji i zapewnić przyszłą skalowalność, w Androidzie 14 dodano CarVolumeGroupEvent. Każde zdarzenie zawiera 3 rodzaje kluczowych informacji:
- Lista:
CarVolumeGroupInfo EventTypes(mapa bitowa)- Lista:
ExtraInfos
CarVolumeGroupInfo
Odbiorca wywołania zwrotnego zdarzenia ma łatwy dostęp do listy informacji o grupach głośności w samochodzie, na które to zdarzenie wpłynęło. Oznacza to, że aplikacja nie musi wykonywać żadnych dodatkowych wywołań do platformy audio w samochodzie, aby uzyskać najnowszy stan. Może po prostu użyć otrzymanego CarVolumeGroupInfos do zaktualizowania interfejsu lub wewnętrznych stanów. Aby ułatwić to aplikacjom, aspekty, które uległy zmianie w grupie wolumenu samochodów, są też podawane w ramach EventTypes, jak wyjaśniono poniżej.
EventTypes
Określa, który aspekt CarVolumeGroupInfo uległ zmianie. Aplikacje mogą używać tej funkcji do identyfikowania zmian i podejmowania wymaganych działań. Na przykład EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED oznacza, że odpowiedni indeks maksymalnego wzrostu wolumenu CarVolumeGroups uległ zmianie i można go sprawdzić za pomocą zapytania CarVolumeGroupInfo.getMaxVolumeGainIndex().
W tabeli poniżej przedstawiono zależność między kolumnami EventType i CarVolumeGroupInfo.
| EventType | CarVolumeGroupInfo |
|---|---|
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED |
CarVolumeGroupInfo.getVolumeGainIndex() |
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED |
CarVolumeGroupInfo.getMinVolumeGainIndex() |
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED |
CarVolumeGroupInfo.getMaxVolumeGainIndex() |
EVENT_TYPE_MUTE_CHANGED |
CarVolumeGroupInfo.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED |
CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED |
CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED |
CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
Zawiera dodatkowe informacje o tym, dlaczego CarVolumeGroup uległ zmianie. Aplikacje mogą używać tych informacji, aby zapewnić dodatkowy kontekst, który pozwoli ostrzec użytkownika lub powiadomić go o konieczności podjęcia działania. Na przykład symbol EXTRA_INFO_TRANSIENT_ATTENUATION_THERMALoznacza aktywną przejściową redukcję mocy z powodu przeciążenia termicznego. Aplikacja może poinformować użytkownika, jeśli spróbuje zwiększyć głośność.
Nie stosujemy żadnego procesu w przypadku ExtraInfos. Decyzja o określeniu procesu na podstawie ExtraInfos należy do Ciebie. Jeśli np. tłumienie jest aktywne z powodu EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, możesz też początkowo przyciemnić interfejs paska głośności, aby uniemożliwić użytkownikowi zmianę głośności.
Inni mogą wyświetlać komunikat o aktywnym wyciszaniu i umożliwiać użytkownikowi zmianę głośności.
Platforma audio w samochodzie zależy od interfejsu HAL AudioControl IAudioGainCallback, który zapewnia sugerowane ExtraInfos. Więcej informacji znajdziesz w artykule Audio Gain Callback.
CarVolumeGroupEvent skalowalność, aby sprostać przyszłym potrzebom platformy audio w samochodzie; Nowe funkcje zamierzamy obsługiwać CarVolumeGroupEvent wyłącznie. Zdecydowanie zalecamy, aby deweloperzy aplikacji używali CarVolumeGroupEvent do obsługi zmian głośności grupy i wyciszania.
Wywołanie zwrotne zdarzenia grupy głośności samochodu
Android 14 udostępnia nowe wywołanie zwrotne dla aplikacji uprzywilejowanych i platformowych, które umożliwia rejestrowanie się i otrzymywanie powiadomień o CarVolumeGroupEvents.
Aby zarejestrować się w celu skorzystania z wywołania zwrotnego, użyj
CarAudioManager#registerCarVolumeGroupEventCallback()Aby wyrejestrować wywołanie zwrotne, użyj
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Jeśli aplikacja zarejestruje się w nowym interfejsie CarVolumeGroupEventCallback i starszym interfejsie CarVolumeCallback, zdarzenie CarVolumeGroupEventCallbacks będzie miało wyższy priorytet.
Stos audio w samochodzie nie wywołuje już funkcji CarVolumeCallback. Zapobiega to duplikowaniu wywołań tej samej aplikacji w przypadku tego samego zdarzenia.
Zdecydowanie zalecamy używanie CarVolumeGroupEventCallback do zarządzania głośnością grupy i zmianami wyciszenia.
Wywołanie zwrotne wzmocnienia dźwięku
Od Androida 13 interfejs HAL AudioControl może wywoływać asynchroniczne wywołanie zwrotne w celu zarządzania aktualizacjami poziomu głośności spowodowanymi zmianami w systemie audio samochodu.
HAL API
AudioControl @2.0 AIDL
Wersja 2.0 interfejsu AIDL HAL AudioControl dodaje ten interfejs API:
| Interfejs API | Cel |
|---|---|
IAudioControl#registerGainCallback |
Rejestruje instancję IAudioGainCallback w warstwie HAL AudioControl. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Asynchroniczne wywołanie zwrotne, które powiadamia o zmianach w konfiguracji wzmocnienia dźwięku. |
Wywołanie zwrotne AudioControl HAL zawiera listy przyczyn i odpowiednie AudioGainConfigInfo, które obejmują:
- Identyfikator strefy
- Adres portu urządzenia
- Indeks wolumenu > indeks może być indeksem ograniczonym lub indeksem aktualizacji.
Powody można podzielić na te kategorie:
- Przyczyny ograniczenia Chwilowa zmiana głośności i wyciszenia.
- Przyczyny aktualizacji Trwała zmiana działania głośności.
Typy ograniczeń
Od AudioControl HAL AIDL V3 obsługiwane są te typy ograniczeń:
- Wycisz
- Blokowanie
- Ograniczenie
- Tłumienie
| Aktywne ograniczenie | Zmiana głośności wywołana przez użytkownika | Przełącznik wyciszenia uruchamiany przez użytkownika |
|---|---|---|
| Wycisz | ❌ | ❌ (wycisz) ✔ (wycisz) |
| Blokowanie | ❌ | ✔ |
| Ograniczenie | ❌ (limit przekroczony) ✔ (limit nieprzekroczony) |
✔ |
| Tłumienie | ✔ | ✔ |
Priorytet ograniczeń jest następujący: wyciszenie > blokowanie > ograniczenie > tłumienie.
Ograniczenia dotyczące wyciszania
Ograniczenia dotyczące wyciszania:
Reasons.TCU_MUTEReasons.REMOTE_MUTE
Platforma audio w samochodzie wewnętrznie utrzymuje te 2 stany wyciszenia:
Wyciszenie użytkownika Włączane na podstawie prośby użytkownika, za pomocą
CarAudioManagerlub kluczowych zdarzeń.Wycisz HAL Przełączane na podstawie ograniczeń wyciszenia otrzymanych za pomocą wywołania zwrotnego
AudioGain.
Dla odbiorców, takich jak aplikacja Ustawienia, ogólny stan wyciszenia grupy głośności CarVolumeGroupInfo.isMuted() będzie zależeć od tego, czy włączone jest którekolwiek z powyższych wyciszeń.
Gdy wyciszenie HAL jest włączone, wszystkie przychodzące żądania zmiany głośności i wyłączenia wyciszenia grupy są ignorowane przez cały czas trwania ograniczenia.
Przypadek interakcji: wyciszenie HAL jest aktywne, a użytkownik prosi o przełączenie wyciszenia
Gdy wyciszenie HAL jest włączone, a wyciszenie użytkownika jest wyłączone:
- Ogólny stan wyciszenia grupy głośności został zmieniony na
true. - Prośby użytkownika o włączenie wyciszenia będą przetwarzane.
- Przyczyna: prośby użytkowników o wyciszenie powinny być zawsze uwzględniane, aby chronić ich prywatność.
Gdy wyciszenie HAL jest włączone, a wyciszenie użytkownika jest włączone:
Ogólny stan wyciszenia grupy głośności został zmieniony na
true.Prośby użytkownika o wyłączenie wyciszenia będą
NOTprzetwarzane. Stan wyciszenia użytkownika w pamięci podręcznej pozostaje włączony.Przyczyna: prośby użytkownika o wyłączenie wyciszenia będą uwzględniane tylko wtedy, gdy nie ma aktywnych ograniczeń.
Przyczyna: wyłączenie wyciszenia buforowanego wyciszenia użytkownika może spowodować nieoczekiwany wybuch dźwięku i zagrozić bezpieczeństwu użytkownika. Jest to szczególnie ważne, gdy wyciszenie jest włączone podczas cykli zapłonu, co zmniejsza świadomość użytkowników dotyczącą poziomu dźwięku.
Scenariusz interakcji: wyciszenie HAL włączone i wyłączone, a wyciszenie użytkownika bez zmian
Przełączenie wyciszenia HAL spowoduje zmianę ogólnego stanu wyciszenia grupy głośności. Nie zmienia jednak bezpośrednio stanu wyciszenia użytkownika. Gdy wyciszenie użytkownika jest wyłączone i otrzymano wywołanie zwrotne HAL mute włączające:
- Ogólny stan wyciszenia grupy głośności został zmieniony na
true. Żądania użytkownika dotyczące zmiany głośności będą
NOTprzetwarzane, gdy wyciszenie HAL jest włączone.Przyczyna: użytkownik nie słyszy dźwięku, gdy wyciszenie jest włączone. Zezwolenie na zmianę głośności może spowodować nagły wzrost głośności i zagrozić bezpieczeństwu użytkownika.
Uzasadnienie: aplikacje do obsługi głośności mogą rejestrować wywołania zwrotne i automatycznie wyłączać wyciszenie (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) bez interwencji użytkownika, jeśli jest to oczekiwane zachowanie producenta OEM.
Gdy wyciszenie HAL jest wyłączone, a wyciszenie użytkownika jest wyłączone:
Stan wyciszenia grupy głośności został zmieniony na
false.Przyczyna: utrwalanie stanu wyciszenia i prośba o wyłączenie wyciszenia mogą niepotrzebnie przeszkadzać użytkownikowi, gdy stan wyciszenia jest często przełączany.
Żądania użytkowników dotyczące zmiany głośności będą przetwarzane w zwykły sposób.
Blokowanie
Ograniczenia blokowania to:
Reasons.FORCED_MASTER_MUTEReasons.REMOTE_MUTEReasons.TCU_MUTE.
Gdy ograniczenia blokowania są aktywne, użytkownicy nie mogą:
- Zmiany głośności nie są przetwarzane.
- Włączanie i wyłączanie wyciszenia jest przetwarzane.
Ograniczenie
Ograniczenia dotyczące limitów:
Reasons.THERMAL_LIMITATIONReasons.SUSPEND_EXIT_VOL_LIMITATION
Gdy ograniczenia dotyczące limitów są aktywne, użytkownicy nie mogą:
Zmień głośność:
- W ramach ograniczeń są przetwarzane
- Powyższe ograniczenia nie są przetwarzane.
Włączanie i wyłączanie wyciszenia jest przetwarzane.
Tłumienie
Ograniczenia dotyczące tłumienia:
Reasons.ADAS_DUCKINGReasons.NAV_DUCKINGReasons.PROJECTION_DUCKING
Gdy ograniczenia dotyczące tłumienia są aktywne, prośby użytkowników o:
zmiana głośności, Nowy poziom głośności jest ustawiony na stłumiony poziom głośności (zamiast na poprzedni poziom głośności). Wszelkie przyszłe zmiany głośności będą wprowadzane na tym poziomie.
Włączanie i wyłączanie wyciszenia zostało przetworzone.
Aktualizacja indeksu
Za asynchroniczną aktualizację indeksu wolumenu uznaje się:Reasons.EXTERNAL_AMP_VOL_FEEDBACK
Z tego powodu interfejs HAL AudioControl może zaktualizować bieżący indeks grupy głośności do określonego indeksu. Jest to używane głównie jako informacja zwrotna z systemu audio
w odpowiedzi na prośbę o zmianę głośności z platformy audio w samochodzie. Informacja o aktualizacji indeksu jest też przekazywana do aplikacji w postaci wywołania zwrotnego CarVolumeGroupEvent, aby zsynchronizować indeks.
Przykłady
Przypadek użycia: użytkownik zmienia indeks głośności na 30
Użytkownik używa aplikacji Głośność, aby zmienić indeks głośności na 30.
Ten indeks jest przeliczany na wzmocnienie głośności i wysyłany do HAL dźwięku.
Implementacje dostawców
Audio HALotrzymują nową wartość wzmocnienia i aktualizują system audio (np. wzmacniacz zewnętrzny).System audio odpowiada, że poziom głośności został zaktualizowany tylko do indeksu 15 (z przyczyn nieznanych systemowi Android).
Implementacje aktywatorów
AudioControl HALdostawców:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})Usługa audio w samochodzie korzysta z nowego indeksu z wywołania zwrotnego, który jest używany do utrwalania i wywołań zwrotnych do aplikacji głośności. Indeks żądany przez użytkownika to 30. Jednak asynchroniczne informacje zwrotne z systemu audio aktualizują indeks do wartości 15.
Przypadek użycia: pierwsze odtwarzanie dźwięku po wyjściu z trybu uśpienia
Indeks głośności przed zawieszeniem jest ustawiony na wysoki poziom 95 (zakres: [0–99]).
Android przechodzi w stan zawieszenia.
Gdy Android istnieje, zawieś (np. wznow):
Dostawca
Audio HAL/AudioControl HALstosuje lokalnie bezpieczny indeks 30 do systemu audio.Dostawca
AudioControl HALwywołuje też wywołanie zwrotne dla bezpiecznego indeksu:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})Usługa audio w samochodzie korzysta z nowego indeksu z wywołania zwrotnego, który jest używany do utrwalania i własnych wywołań zwrotnych do aplikacji głośności synchronizującej indeks. Indeks głośności przed zawieszeniem wynosi 95. Po wznowieniu odtwarzania indeks jest jednak ustawiany na bezpieczny poziom głośności 30 przez implementatora
AudioControl HAL.
Konfiguracja woluminu dynamicznego
W przypadku tej funkcji bierzemy pod uwagę te główne przypadki użycia:
Konfiguracja pojazdu na końcu linii produkcyjnej.
Producenci samochodów wolą aktualizować konfiguracje głośności na końcu okresu eksploatacji na podstawie konfiguracji systemu audio w pojeździe. Zwykle jest to instalacja z pominięciem sklepu bez aktualizacji obrazu oprogramowania Androida.
Producenci samochodów mogą potrzebować zaktualizować konfigurację głośności podczas serwisu.
Konfiguracja środowiska wykonawczego Systemy audio w samochodach obsługują konfiguracje wzmacniaczy zewnętrznych, a te jednostki ECU mogą zawierać konfiguracje zakresu głośności, o które systemy te wysyłają zapytania podczas uruchamiania.
Konfiguracja na żądanie Oferowane w odpowiedzi na rosnące zapotrzebowanie na funkcje audio oparte na popycie, w ramach których użytkownicy subskrybują ulepszone przetwarzanie sygnału na określony czas. Nowe konfiguracje zakresu woluminu obowiązują przez cały okres subskrypcji.
Projektowanie
Konfiguracja dynamicznej głośności odbywa się w 3 etapach:
Odkrywanie Implementacja AudioControl HAL dostawcy wykrywa nowe aktualizacje zakresu głośności za pomocą niestandardowego mechanizmu IPC należącego do dostawcy.
Po wykryciu wywoływane jest wywołanie zwrotne za pomocą funkcji
AudioControl::IModuleChangeCallback.Aktualizacja Stos audio w samochodzie aktualizuje stany grup głośności o nowe zakresy głośności.
Staramy się utrzymać ten sam poziom głośności po aktualizacji zakresu głośności. Jeśli jednak indeks wyjdzie poza zakres, bieżący indeks głośności zostanie ustawiony na bezpieczną wartość. Na przykład domyślny poziom podany przez dostawcę podczas wywołania zwrotnego.
Oddzwanianie
Po aktualizacji zakresu grupy głośności stos audio w samochodzie wywołuje wywołanie zwrotne do aplikacji zarejestrowanych za pomocą
CarVolumeGroupEventCallback.CarVolumeGroupEventzawiera zaktualizowaneCarVolumeGroupInfo, typ zdarzenia (co się zmieniło) i dodatkowe informacje (dlaczego się zmieniło).
Rysunek 2. Dynamiczna konfiguracja głośności.
HAL API
AudioControl @ 3.0 AIDL
Wersja 3.0 interfejsu AudioControl AIDL HAL wprowadza te interfejsy API:
| Interfejs API | |
|---|---|
| IAudioControl#setModuleChangeCallback | Ustawia instancję IModuleChangeCallback w przypadku HAL sterowania dźwiękiem. |
| IAudioControl#clearModuleChangeCallback | Usuwa instancję IModuleChangeCallback, która została wcześniej ustawiona za pomocą interfejsu HAL AudioControl. |
| IModuleChangeCallback#onAudioPortsChanged | Wywołanie zwrotne powiadamiające o zmianach w AudioPortach |
Sekwencja
Poniżej znajduje się diagram sekwencji dynamicznej konfiguracji woluminu.
Rysunek 3. Diagram sekwencji dynamicznej konfiguracji woluminu.
Najważniejsze aspekty
Aby zoptymalizować tę funkcję, weź pod uwagę te wskazówki.
Obiekty AudioPort dostarczane w ramach wywołania zwrotnego muszą być zgodne z definicją Automotive BUS:
- Port urządzenia
IN_DEVICE,OUT_DEVICE - Połączenie.
BUS - Adres Zdefiniowane w definicji Audio HAL
- Tryb wzmocnienia.
JOINT
- Port urządzenia
Dostawcy muszą zdefiniować nadzbiór definicji zakresu głośności w zasadach HAL audio i użyć wywołania zwrotnego, aby dostosować go do różnych wersji pojazdu. Więcej informacji znajdziesz w
IModuleChangeCallbacdefinicji AIDL.Jeśli więcej niż 1 ścieżka audio należy do tej samej grupy głośności, każda z nich musi mieć identyczne definicje zakresu głośności. Jeśli tego nie zrobisz, platforma audio w samochodzie odrzuci nową definicję zakresu głośności.