AAOS ma własne funkcje zarządzania woluminami w usłudze CarAudioService
. Wykorzystuje metody stałe
woluminy z założeniami, że woluminy powinny być stosowane poniżej HAL przez sprzęt
we wzmacniaczu, a nie w oprogramowaniu. Łączy też urządzenia wyjściowe w grupy woluminów
aby zastosować te same wzmocnienia na wszystkich urządzeniach powiązanych z grupą głośności.
Korzystanie ze stałych woluminów
Implementacje AAOS powinny sterować głośnością za pomocą wzmacniacza sprzętowego zamiast
mikser oprogramowania. Aby uniknąć efektów ubocznych, ustaw flagę config_useFixedVolume
na wartość true (w razie potrzeby nakładki):
<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 „fałsz”),
aplikacje mogą wywoływać metodę AudioManager.setStreamVolume()
i zmieniać
według typu strumienia w mikserze oprogramowania. Może to być niepożądane z powodu
potencjalny wpływ na inne aplikacje oraz fakt, że tłumienie głośności
mikser oprogramowania generuje mniej znaczących bitów dostępnych w sygnale, gdy
odbierany przez wzmacniacz sprzętowy.
Grupy woluminów
Grupy głośności zarządzają poziomami głośności grupy urządzeń w strefie audio. W każdej grupie głośności można ją niezależnie regulować. są skonfigurowane na powiązanych urządzeniach, aby były stosowane przez wzmacniacz pojazdu. Ustawienia woluminu są zachowywane dla użytkownika i wczytywane, gdy użytkownik się zaloguje.
Definiowanie grup woluminów
CarAudioService używa grup głośności zdefiniowanych w car_audio_configuration.xml
:
<audioZoneConfiguration version="2.0"> <zones> <zone name="primary zone" isPrimary="true"> <volumeGroups> <group> <device address="bus0_media_out"> <context context="music"/> </device> </group> <group> <device address="bus1_navigation_out"> <context context="navigation"/> </device> <device address="bus2_voice_command_out"> <context context="voice_command"/> </device> </group> ... </volumeGroups> </zone> </zones> </audioZoneConfiguration>
Przykładowa implementacja car_audio_configuration.xml
.
Każda grupa woluminów powinna zawierać co najmniej 1 urządzenie wyjściowe z powiązanymi adresami.
Te adresy powinny odpowiadać urządzeniom wyjściowym zdefiniowanym w
audio_policy_configuration.xml
Konfigurowanie wzmocnienia grupy woluminów
Każda grupa głośności ma minimalne, maksymalne i domyślne wartości wzmocnienia oraz
rozmiaru kroku. Są one określane na podstawie wartości skonfigurowanych w
audio_policy_configuration.xml
dla powiązanych urządzeń
grupę głośności.
<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort>
Podczas inicjowania grupa woluminów sprawdzi wartości wzmocnienia powiązanych i skonfiguruj grupę w następujący sposób:
- Rozmiar kroku. Musi być taka sama w przypadku wszystkich urządzeń sterowanych przez grupę głośności
- Minimalny zysk. Najmniejsze minimalne wzmocnienie wśród urządzeń w grupie
- Maksymalny zysk. Najwyższe maksymalne wzmocnienie wśród urządzeń w grupie
- Wzmocnienie domyślne. Najwyższe wzmocnienie domyślne wśród urządzeń w grupie
Ze względu na sposób konfiguracji tych wartości możliwe jest ustawienie wzmocnienia grupę głośności spoza zakresu obsługiwanego w przypadku urządzenia powiązanego z tą grupą. W takim przypadku wzmocnienie będzie ustawione na wartość minimalną lub maksymalną. w zależności od tego, czy wartość grupy głośności jest poniżej czy powyżej zakresu.
Identyfikatory grup woluminów
Grupy woluminów są identyfikowane w czasie działania według kolejności definicji w pliku XML.
Identyfikatory mają zakres 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 woluminów nie są unikalne w różnych strefach. Te identyfikatory
są używane w przypadku CarAudioManager
interfejsów API powiązanych z grupami woluminów. Dowolny interfejs API
przyjmujący groupId
bez zoneId
, domyślnie przyjmuje
głównej strefy dźwięku.
Wielostrefowe zarządzanie woluminem
Każda strefa audio powinna mieć co najmniej 1 grupę głośności
jest powiązana tylko z jedną strefą audio. Ta relacja została zdefiniowana jako część
car_audio_configuration.xml
Zapoznaj się z przykładem podanym tutaj:
Definiowanie grup woluminów powyżej.
Bieżące poziomy głośności w każdej strefie zostaną zachowane dla użytkownika powiązanego z w tej strefie. Te ustawienia dotyczą poszczególnych stref, co oznacza, że użytkownik zaloguje się na wyświetlaczu ze strefą główną, a później po zalogowaniu się w strefie powiązanej z w dodatkowej strefie audio, poziomy głośności zostaną wczytane i utrwalone w pierwszej strefie różnią się od tych dla strefy dodatkowej.
Obsługa kluczowych zdarzeń dotyczących woluminów
Android definiuje kilka kodów klawiszy do sterowania głośnością, w tym
KEYCODE_VOLUME_UP
, KEYCODE_VOLUME_DOWN
i
KEYCODE_VOLUME_MUTE
Domyślnie Android przekierowuje klawisz głośności
zdarzeń do aplikacji. Implementacje w branży motoryzacyjnej powinny wymuszać te kluczowe zdarzenia
CarAudioService
, który może następnie wywołać funkcję setGroupVolume
lub
setMasterMute
.
Aby wymusić takie działanie, ustaw config_handleVolumeKeysInWindowManager
flaga do true
:
<resources> <bool name="config_handleVolumeKeysInWindowManager">true</bool> </resources>
Obecnie kluczowe zdarzenia dotyczące głośności nie mogą w ten sposób rozróżnić strefy, w której są
i w związku z tym zakłada się, że wszystkie są powiązane z główną strefą audio.
Po odebraniu kluczowego zdarzenia dotyczącego głośności CarAudioService
określa głośność
aby dostosować grupę, pobierając konteksty dźwiękowe aktywnych odtwarzaczy, a następnie dostosowując
grupę głośności zawierającą urządzenie wyjściowe powiązane z najwyższym priorytetem
kontekstu audio. Priorytety są ustalane na podstawie ustalonej kolejności zdefiniowanej w
CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
Zanikanie i balans
Obie wersje HAL AudioControl zawierają interfejsy API do ustawiania zanikania i balansu
w pojeździe. Istnieją odpowiednie systemowe interfejsy API dla CarAudioManager, które przekazują wartości
do poziomu HAL AudioControl. Te interfejsy API wymagają
android.car.permission.CAR_CONTROL_AUDIO_VOLUME
Interfejsy API AudioControl to:
setBalanceTowardRight(float value)
Przesuwa głośność głośnika w stronę prawej (+) lub lewej (-) strony samochodu. 0,0 jest wyśrodkowane, +1,0 to całkowita poprawka, -1,0 to cała reszta, a wartość spoza zakresu od -1 do 1 jest błędem.setFadeTowardFront(float value)
– zmienia głośność głośnika w kierunku przedniej (+) lub tylnej strony samochodu (–). 0,0 jest wyśrodkowane, +1,0 jest całkowicie do przodu, -1,0 jest całkowicie wsteczne, a wartość spoza zakresu od -1 do 1 jest błędem.
To producent OEM decyduje, jak stosować te wartości i w jaki sposób będą wyświetlane użytkownikom. Mogą być stosowane bezpośrednio w mediach lub wszystkie dźwięki Androida.
W Androidzie 11 wprowadzono też obsługę stosowania efektów audio na urządzeniach wyjściowych. Dzięki temu można za pomocą efektów dźwiękowych zarządzać stopniowym rozjaśnięciem i balansem na odpowiednich urządzeniach wyjściowych, a nie za pomocą tych interfejsów API.
Wyciszanie tła
Wyciszanie tła ma miejsce, gdy pojazd zmniejsza wzmocnienie podczas 1 transmisji. aby można było usłyszeć wyraźniejszy dźwięk z innej transmisji w tym samym czasie. W systemie AAOS wyciszanie wyciszania dźwięku jest pozostawiane zespołowi HAL do wdrożenia, ponieważ może tam być poza Androidem, na które system operacyjny nie ma kontroli. W Androidzie 11 główne informacje dostępne dla HAL do podejmowania decyzji o wyciszaniu, jest to, czy dwa urządzenia wyjściowe mają strumienie aktywne.
Kiedy udawać
To pojedynczy OEM, w jaki sposób posługuje się ukryciem obrazu w HAL, decyduje o tym, skorzystaj z kilku ogólnych wskazówek. Odtwarzanie wielu strumieni na urządzeniu z Androidem najczęściej występuje, gdy 2 aplikacje lub usługi są skupione jednocześnie na dźwięku. Mając to na uwadze, Więcej informacji: Tablica interakcji aby dowiedzieć się, w których przypadkach Android może równolegle skupić się na jednym urządzeniu, a tym samym, gdy dwie możliwości różne strumienie do odtwarzania równocześnie.
Pamiętaj, że wszystkie transmisje na żywo z Androida zostaną przeprowadzone przed ewentualnymi korzyściami. obecnie stosowane. W związku z tym każdy strumień, który powinien zostać wyciszony podczas odtwarzania inny powinien zostać przekierowany na oddzielne urządzenia wyjściowe, aby HAL mógł zastosować wyciszanie tła, zanim mieszając je ze sobą.
Zalecane zachowanie wyciszania tła
Oto potencjalne równoczesne interakcje, w przypadku których zalecamy wycofanie do zastosowania:
EMERGENCY
Wycisz lub wycisz wszystko opróczSAFETY
w Upewnij się, że kierowca słyszy dźwiękSAFETY
Ukryj wszystko opróczEMERGENCY
, aby się upewnić kierowca słyszy dźwiękNAVIGATION
Ukryj wszystko opróczSAFETY
iEMERGENCY
CALL
Dukuj wszystko opróczSAFETY
,EMERGENCY
iNAVIGATION
VOICE
KaczkaCALL_RING
- To producenci OEM określają znaczenie aktywnych urządzeń
VEHICLE_SOUNDS
. i możliwość wyciszania innych dźwięków, aby kierowca je usłyszał. - Elementy
MUSIC
iANNOUNCEMENT
powinny być ukryte przed wszystkim. Głównym wyjątkiem są dźwięki interakcji dotykiem, które obecnie są odtwarzane jakoSYSTEM_SOUND
Inne rzeczy, które warto wziąć pod uwagę podczas wyciszania tła
Niektóre aplikacje/usługi, takie jak nawigacja czy asystent, mogą korzystać z kilku odtwarzaczy swoich działań. OEM nie powinni podejmować zbyt agresywnego działania w zależności od tego, kiedy transmisja danych zatrzymuje się przechodzących przez te urządzenia wyjściowe, aby użytkownik nie mógł na chwilę wrócić do multimediów do pełnej głośności, a potem zostanie cofnięty podczas następnego odtwarzania w obszarze nawigacji lub uruchomi się aplikacja Asystent.
W przypadku pojazdów z kilkoma scenami dźwiękowymi i odpowiednią izolacją aby kierować dźwięk do różnych obszarów samochodu, zamiast wyciszać się. Na przykład nawigacja instrukcje mogą być przekierowywane na głośniki zagłówka kierowcy, gdy muzyka wciąż będzie odtwarzać się w całym domu z normalną głośnością.
Dźwięki zagrażające bezpieczeństwu
Chociaż Android 11 wprowadził
interfejsy API HAL Audiofokus,
do HAL należy priorytetowe traktowanie dźwięków o znaczeniu bezpieczeństwa,
reszta. Nawet jeśli HAL utrzymuje aktywność audio na urządzeniu USAGE_EMERGENCY
,
zagwarantowanie, że aplikacje i usługi na Androidzie nie będą odtwarzać dźwięków. Zależy od HAL
określać, które strumienie z Androida należy mieszać, a które wyciszać (dźwięki o znaczeniu krytycznym dla bezpieczeństwa).
odtworzonej przez grę.
Konfigurowanie interfejsu ustawień głośności
AAOS oddziela interfejs ustawień głośności od konfiguracji grupy głośności (którą można nałożone zgodnie z opisem w sekcji Konfigurowanie grup woluminów. Taki podział zapewnia, zmiany będą wymagane, jeśli w przyszłości konfiguracja grup woluminów ulegnie zmianie.
W interfejsie ustawień samochodu ikona packages/apps/Car/Settings/res/xml/car_volume_items.xml
zawiera elementy UI (zasoby tytułu i ikon) powiązane z każdym zdefiniowanym
AudioAttributes.USAGE
Zapewnia on uzasadnione renderowanie
zdefiniowaną VolumeGroups
przy użyciu zasobów powiązanych z pierwszym
rozpoznawane zastosowania w każdej grupie woluminów.
W tym przykładzie definicja grupy woluminów obejmuje obie
voice_communication
i voice_communication_signalling
. Domyślny
implementacja interfejsu ustawień samochodu renderuje grupę VolumeGroup przy użyciu powiązanych zasobów
z elementem voice_communication
jako pierwszą w pliku.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto"> <item car:usage="voice_communication" car:title="@*android:string/volume_call" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="voice_communication_signalling" car:title="@*android:string/volume_call" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="media" car:title="@*android:string/volume_music" car:icon="@*android:drawable/ic_audio_media"/> <item car:usage="game" car:title="@*android:string/volume_music" car:icon="@*android:drawable/ic_audio_media"/> <item car:usage="alarm" car:title="@*android:string/volume_alarm" car:icon="@*android:drawable/ic_audio_alarm"/> <item car:usage="assistance_navigation_guidance" car:title="@string/navi_volume_title" car:icon="@drawable/ic_audio_navi"/> <item car:usage="notification_ringtone" car:title="@*android:string/volume_ringtone" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistant" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> <item car:usage="notification" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_request" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_instant" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_communication_delayed" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="notification_event" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistance_accessibility" car:title="@*android:string/volume_notification" car:icon="@*android:drawable/ic_audio_ring_notif"/> <item car:usage="assistance_sonification" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> <item car:usage="unknown" car:title="@*android:string/volume_unknown" car:icon="@*android:drawable/ic_audio_vol"/> </carVolumeItems>
Atrybuty i wartości używane w powyższej konfiguracji są zadeklarowane w
packages/apps/Car/Settings/res/values/attrs.xml
Ustawienia głośności
Interfejs użytkownika korzysta z tych interfejsów API CarAudioManager opartych na VolumeGroup:
getVolumeGroupCount()
, aby dowiedzieć się, ile elementów sterujących ma zostać narysowanych.getGroupMinVolume()
igetGroupMaxVolume()
, aby uzyskać dolną i górną granicę.getGroupVolume()
, by otrzymać aktualny poziom głośności.registerVolumeChangeObserver()
, aby otrzymywać powiadomienia o zmianach głośności.