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.
Zalecane zachowanie podczas opuszczania
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. |
MUSIC i ANNOUNCEMENT |
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.xml
znajdują 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_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 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()
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 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 EventType
a 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ł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ą
NOT
przetwarzane, 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:
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.
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.
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ściCarVolumeGroupInfo
, typ zdarzenia (co się zmieniło) i informacje dodatkowe (dlaczego nastąpiła zmiana).
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.
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
- Port urządzenia.
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.