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 warstwy 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 woluminów
Grupy głośności zarządzają głośnością kolekcji urządzeń 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 oraz 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:
- Wielkość kroku Musi być taka sama na wszystkich urządzeniach sterowanych 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 spoś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 grupą głośności. W takim przypadku wzmocnienie tego urządzenia 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 mieć 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 z główną strefą, 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 dla strefy dodatkowej.
Minimalna i maksymalna objętość 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ę minimalnej i maksymalnej aktywacji. Każdy activationVolumeConfig
:
- Musi zawierać unikalny element
name
w 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ą głośność aktywacji jako wartość procentową.maxActivationVolumePercentage
(liczba całkowita, 0–100, opcjonalnie, domyślnie: 100): określa maksymalną głośność aktywacji jako wartość procentową.invocationType
(string, opcjonalny, domyślnie:onPlaybackChanged
): określa warunki, w których stosowana jest minimalna i maksymalna objętość aktywacji:onBoot
: stosowane tylko do 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 aktywne ścieżki odtwarzania
- Bieżący stan połączenia
- Aktualne żądanie fokusu dźwięku z warstwy HAL sterowania dźwiękiem, w którym żądanie fokusu dźwięku z tej warstwy sygnalizuje, że aktywne odtwarzanie dźwięku odbywa się poza Androidem.
Na poniższym obrazie przedstawiono 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 minimalnego i maksymalnego indeksu wzrostu wolumenu minActivationVolumePercentage
, maxActivationVolumePercentage
możesz obliczyć minimalny i maksymalny indeks wzrostu wolumenu aktywacji dla każdej grupy wolumenu. CarAudioService
monitoruje każde nowo aktywne odtwarzanie i stosuje minimalną i maksymalną głośność aktywacji w następujących warunkach:
- Typ wywołania musi być zgodny: 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ą
invocationType
określoną wactivationVolumeConfigEntry
powią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 wolumenu zostanie dostosowany do jednej z tych wartości:
Minimalny indeks wzrostu objętości aktywacji, jeśli jest niższy niż minimalny indeks wzrostu objętoś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ń klawisza głośności
Android definiuje kilka kodów klawiszy do sterowania głośnością, m.in.:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Domyślnie Android kieruje zdarzenia klawiszy 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 kluczowych zdarzeń dotyczących głośności nie ma obecnie możliwości rozróżnienia, do której strefy są przeznaczone. 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 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ą określane 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ść w stronę prawej (+) lub lewej (-) strony 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 lepiej słyszeć inny strumień odtwarzany jednocześnie. 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 funkcja wyciszania jest obsługiwana przez HAL, 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ć jednoczesne 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, powinien być kierowany do oddzielnych urządzeń wyjściowych, aby HAL mógł zastosować wyciszanie przed zmiksowaniem strumieni.
Zalecane zachowanie podczas przyciszania
W przypadku tych potencjalnych interakcji równoczesnych 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 |
Zmniejsza głośność wszystkich elementów 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 |
Uniknął wszystkiego. Wyjątkiem są dźwięki interakcji dotykowej odtwarzane jako
SYSTEM_SOUND .
|
Uwagi dotyczące przykucania
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 aplikacji nawigacyjnej lub asystenta.
W przypadku pojazdów z kilkoma strefami 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 nawigacyjne mogą być kierowane do głośników w zagłówku kierowcy, a muzyka może być nadal odtwarzana w całym pojeździe z normalną głośnością.
Dźwięki związane z bezpieczeństwem
W Androidzie 11 wprowadziliśmy interfejsy API HAL do zarządzania fokusem dźwięku. 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 nałożyć 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 packages/apps/Car/Settings/res/xml/car_volume_items.xml
zawiera elementy interfejsu (tytuł i ikony) powiązane z każdym zdefiniowanym AudioAttributes.USAGE
. Ten plik zapewnia rozsądne renderowanie zdefiniowanego elementu VolumeGroups
przez użycie zasobów powiązanych z pierwszym rozpoznanym użyciem zawartym w każdym elemencie 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 sprawdzić bieżący poziom głośności.registerVolumeChangeObserver()
, aby otrzymywać powiadomienia o zmianach głośności.
Zdarzenie dotyczące grupy liczby 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. Obecny wolumin i wywołanie zwrotne wyciszenia ze stosu audio w samochodzie dostarczają 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 głośności w samochodzie, są też podawane w ramach EventTypes
, jak wyjaśniono poniżej.
EventTypes
Określa, który aspekt CarVolumeGroupInfo
uległ zmianie. Aplikacje mogą używać tego parametru 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 wyszukać za pomocą 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_THERMAL
oznacza aktywną przejściową redukcję głośności 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 na przykład 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 korzysta z interfejsu HAL AudioControlIAudioGainCallback
, aby udostępniać sugerowane ExtraInfos
. Więcej informacji znajdziesz w artykule Audio Gain Callback.
CarVolumeGroupEvent
skaluje się, 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 i wyciszania grup.
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 wynikającymi ze zmian 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 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, które składają się z:AudioGainConfigInfo
- 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.
- Zaktualizuj powody. 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_MUTE
Reasons.REMOTE_MUTE
Platforma audio w samochodzie wewnętrznie utrzymuje te 2 stany wyciszenia:
Wyciszenie użytkownika Przełączane na podstawie prośby użytkownika, za pomocą
CarAudioManager
lub kluczowych zdarzeń.Wyciszenie 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 którekolwiek z powyższych wyciszeń są włączone.
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 i 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
NOT
będą przetwarzane. 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 stan wyciszenia jest włączony w różnych cyklach zapłonu, co zmniejsza świadomość użytkowników dotyczącą poziomu dźwięku.
Przypadek interakcji: wyciszanie HAL włączane i wyłączane, a wyciszanie użytkownika pozostaje bez zmian
Przełączenie wyciszenia HAL spowoduje zmianę ogólnego stanu wyciszenia grupy głośności. Nie aktualizuje jednak bezpośrednio stanu wyciszenia użytkownika. Gdy wyciszenie użytkownika jest wyłączone i otrzymano wywołanie zwrotne wyciszenia HAL włączające wyciszenie:
- 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ą
NOT
przetwarzane, 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 wywoływać wyciszanie (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 normalny sposób.
Blokowanie
Ograniczenia blokowania:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.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_LIMITATION
Reasons.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 to:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Gdy ograniczenia dotyczące osłabienia są aktywne, użytkownicy nie mogą:
zmiana głośności, Nowy bieżący poziom głośności jest ustawiany 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 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 ramy 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 warstwy HAL dźwięku.
Implementacje dostawców
Audio HAL
otrzymują nową wartość wzmocnienia głośności 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 HAL
dostawcó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. Asynchroniczne informacje zwrotne z systemu audio aktualizują jednak indeks do wartości 15.
Przypadek użycia: pierwsze odtwarzanie dźwięku po wyjściu z trybu zawieszenia
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. wznów):
Dostawca
Audio HAL/AudioControl HAL
stosuje lokalnie bezpieczny indeks o wartości 30 do systemu audio.Dostawca
AudioControl HAL
wywoł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. Jednak po wznowieniu odtwarzania ten indeks jest ustawiany na bezpieczny poziom głośności 30 przez
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 przeglądu.
Konfiguracja środowiska wykonawczego Samochodowe systemy audio obsługują konfiguracje wzmacniaczy zewnętrznych, a te ECU mogą zawierać konfiguracje zakresu głośności, o które system pyta podczas uruchamiania.
Konfiguracja na żądanie Oferowana w odpowiedzi na rosnące zapotrzebowanie na funkcje audio oparte na popycie, w których użytkownicy subskrybują ulepszone przetwarzanie sygnału na określony czas. Nowe konfiguracje zakresu woluminów są ważne przez cały okres subskrypcji.
Projektowanie
Dynamiczna konfiguracja 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 wykracza poza zakres, bieżący indeks głośności jest ustawiany 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
.CarVolumeGroupEvent
zawiera zaktualizowaneCarVolumeGroupInfo
, Event-type (co się zmieniło) i Extra-info (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 z interfejsem HAL AudioControl. |
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 konfiguracji woluminu dynamicznego.
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 Audio HAL i użyć wywołania zwrotnego, aby dostosować go do wariantów pojazdu. Więcej informacji znajdziesz w definicji AIDL
IModuleChangeCallbac
.Jeśli do tej samej grupy głośności należy więcej niż 1 szyna audio, 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.