Zarządzanie głośnością odbywa się w CarAudioService
, która wykorzystuje stałą głośność przy założeniu, że głośność będzie stosowana poniżej HAL przez wzmacniacz sprzętowy, a nie przez oprogramowanie. CarAudioService
organizuje urządzenia wyjściowe w grupy woluminów, aby zastosować te same wzmocnienia do wszystkich urządzeń powiązanych z grupą woluminów.
Stałe woluminy
Implementacje AAOS wykorzystują wzmacniacz sprzętowy do kontrolowania głośności zamiast miksera programowego. Aby uniknąć skutków ubocznych, ustaw flagę config_useFixedVolume
na true
(w razie potrzeby nałóż):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
Jeśli flaga config_useFixedVolume
nie jest ustawiona (lub ma wartość false
), aplikacje mogą wywołać AudioManager.setStreamVolume()
, aby zmienić głośność według typu strumienia w mikserze programowym. Nie zawsze może to być 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 sygnale odbieranym przez wzmacniacz sprzętowy.
Grupy woluminów
Grupy woluminów zarządzają głośnością zbioru urządzeń w strefie audio. Dla każdej grupy woluminów głośność można regulować niezależnie. Uzyskane wzmocnienia są konfigurowane na powiązanych urządzeniach, które mają być stosowane przez wzmacniacz pojazdu. Ustawienia głośności są zachowywane dla użytkownika i ładowane, gdy użytkownik się zaloguje.
Zdefiniuj grupy woluminów
CarAudioService korzysta z grup woluminów 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 woluminów powinna zawierać jedno lub więcej urządzeń wyjściowych z powiązanymi adresami. Adresy powinny odpowiadać urządzeniom wyjściowym zdefiniowanym w audio_policy_configuration.xml
.
Skonfiguruj wzmocnienia grup woluminów
Każda grupa woluminów ma minimalne, maksymalne i domyślne wartości wzmocnienia, a także wielkość kroku na podstawie wartości skonfigurowanych w audio_policy_configuration.xml
dla urządzeń powiązanych z grupą woluminów.
<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 woluminów sprawdza wartości wzmocnienia powiązanych urządzeń i konfiguruje grupę w następujący sposób:
- Rozmiar kroku. Musi być taki sam dla wszystkich urządzeń kontrolowanych przez grupę woluminów.
- Minimalny zysk. Najmniejsze minimalne wzmocnienie wśród urządzeń w grupie.
- Maksymalny zysk. Największe maksymalne wzmocnienie wśród urządzeń w grupie.
- Domyślne wzmocnienie. Największe domyślne wzmocnienie wśród urządzeń w grupie.
Biorąc pod uwagę sposób skonfigurowania tych wartości, możliwe jest ustawienie wzmocnienia grupy woluminów poza zakresem obsługiwanym przez urządzenie powiązane z tą grupą woluminów. W tym przypadku dla tego urządzenia wzmocnienie jest ustawiane na minimalną lub maksymalną wartość wzmocnienia urządzenia w zależności od tego, czy wartość grupy woluminów znajduje się poniżej, czy powyżej zakresu.
Identyfikatory grup woluminów
Grupy woluminów są identyfikowane w czasie wykonywania w kolejności określonej 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. Dzięki temu identyfikatory grup woluminów nie są unikalne w poszczególnych strefach. Identyfikatory te są używane w interfejsach API CarAudioManager
powiązanych z grupami woluminów. Każdy interfejs API pobierający groupId
bez zoneId
domyślnie wybiera podstawową strefę audio.
Zarządzanie głośnością w wielu strefach
Oczekuje się, że każda strefa audio będzie mieć jedną lub więcej grup głośności, a każda grupa głośności będzie powiązana tylko z jedną strefą audio. Ta relacja jest zdefiniowana jako część pliku car_audio_configuration.xml
. Aby dowiedzieć się więcej, zobacz powyższy przykład w sekcji Definiowanie grup woluminów .
Bieżące poziomy głośności dla każdej strefy są zachowywane dla użytkownika powiązanego z tą strefą. Ustawienia te są specyficzne dla strefy, co oznacza, że jeśli użytkownik zaloguje się na wyświetlaczu powiązanym ze strefą podstawową, a następnie zaloguje się do strefy powiązanej z dodatkową strefą audio, poziomy głośności załadowane i zachowane dla pierwszej strefy będą się różnić od tych dla strefa wtórna.
Obsługuj zdarzenia związane z klawiszami głośności
Android definiuje kilka kodów klawiszy do regulacji głośności, w tym:
-
KEYCODE_VOLUME_UP
-
KEYCODE_VOLUME_DOWN
-
KEYCODE_VOLUME_MUTE
Domyślnie system Android kieruje zdarzenia związane z klawiszami głośności do aplikacji. Implementacje motoryzacyjne powinny wymusić przetworzenie tych kluczowych zdarzeń przez CarAudioService
, która następnie wywołuje odpowiednio setGroupVolume
lub setMasterMute
. Aby wymusić to zachowanie, ustaw flagę config_handleVolumeKeysInWindowManager
na true
:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Zdarzenia związane z klawiszami głośności obecnie nie pozwalają na rozróżnienie, dla której strefy są przeznaczone i zakłada się, że wszystkie są powiązane z główną strefą audio. Po odebraniu zdarzenia związanego z kluczem głośności CarAudioService
określa, którą grupę głośności należy 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 ustalane są na podstawie ustalonej kolejności określonej w CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Zanik i równowaga
Obie wersje AudioControl HAL zawierają interfejsy API do ustawiania zanikania i balansu w pojeździe. Odpowiednie interfejsy API systemu dla CarAudioManager przekazują wartości do warstwy 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 prawą (+) lub lewą (-) stronę samochodu.- 0,0 jest wyśrodkowane
- +1,0 jest w pełni słuszne
- -1,0 zostało całkowicie
- Wartość spoza zakresu od -1 do 1 jest błędem
setFadeTowardFront(float value)
przesuwa głośność głośnika w stronę przodu (+) lub tyłu (-) samochodu.- 0,0 jest wyśrodkowane
- +1,0 jest całkowicie do przodu
- -1.0 jest całkowicie do tyłu
- Wartość spoza zakresu od -1 do 1 jest błędem
Ty decydujesz, w jaki sposób te wartości mają być stosowane i jak wyświetlać je użytkownikom. Można je zastosować wyłącznie do multimediów lub ogólnie do wszystkich dźwięków Androida. W Androidzie 11 wprowadzono także obsługę stosowania efektów dźwiękowych do urządzeń wyjściowych. Dzięki temu możliwe jest alternatywne zarządzanie zanikaniem i balansem za pomocą efektów dźwiękowych na odpowiednich urządzeniach wyjściowych, a nie za pośrednictwem tych interfejsów API.
Wyciszanie dźwięku
Wyciszanie dźwięku ma miejsce, gdy pojazd zmniejsza wzmocnienie jednego strumienia, dzięki czemu inny strumień odtwarzany jednocześnie jest wyraźniej słyszalny. W AAOS wyciszanie dźwięku jest realizowane przez warstwę HAL. Android nie ma kontroli nad dźwiękami poza systemem operacyjnym. W systemie Android 11 główną informacją dostępną dla warstwy HAL przy podejmowaniu decyzji o wycięciu jest to, czy oba urządzenia wyjściowe mają aktywne strumienie.
Kiedy się schować
Chociaż określenie sposobu obsługi tłumienia przez warstwę HAL zależy od konkretnego producenta OEM, zalecamy poniższe wytyczne.
Wiele strumieni odtwarzanych w systemie Android często występuje, gdy dwie aplikacje lub usługi jednocześnie obsługują dźwięk. Aby dowiedzieć się, kiedy system Android może przyznać współbieżny fokus, zobacz macierz interakcji w sekcji Typy ograniczeń . Wraz z wprowadzeniem wtyczki car audio zależy to również od zarządzania AudioFocus.
Wszelkie strumienie zmieszane razem przez Androida są wykonywane przed zastosowaniem jakichkolwiek zysków. W związku z tym każdy strumień, który powinien zostać wyciszony podczas odtwarzania jednocześnie z innym, powinien zostać skierowany do oddzielnych urządzeń wyjściowych, aby warstwa HAL mogła zastosować wyciszenie przed ich zmiksowaniem.
Zalecane zachowanie przy uniku
Poniżej przedstawiono potencjalne równoczesne interakcje. Zalecane jest wycofywanie się.
Interakcja | Działanie |
---|---|
EMERGENCY | Ucisza lub wycisza wszystko z wyjątkiem SAFETY |
SAFETY | Unika wszystkiego z wyjątkiem EMERGENCY |
NAVIGATION | Unika wszystkiego oprócz SAFETY i EMERGENCY |
CALL | Unika wszystkiego z wyjątkiem SAFETY , EMERGENCY i NAVIGATION |
VOICE | Kaczki CALL_RING |
VEHICLE_SOUNDS | Ty określasz znaczenie aktywnego dźwięku i to, czy wycisza inne dźwięki. |
MUSIC i ANNOUNCEMENT | Unikany przez wszystko. Wyjątkiem są dźwięki interakcji dotykowej odtwarzane jako SYSTEM_SOUND . |
O czym należy pamiętać podczas schylania się
Niektóre aplikacje i usługi, takie jak nawigacja lub asystent, mogą korzystać z wielu odtwarzaczy do wykonywania czynności. Unikaj agresywnego wyciszania, gdy strumień danych przestaje przepływać przez urządzenia wyjściowe, aby mieć pewność, że multimedia nie powrócą do pełnej głośności przed wyciszeniem3 przed rozpoczęciem następnego odtwarzania z poziomu nawigacji lub aplikacji asystenta.
W przypadku pojazdów z wieloma scenami dźwiękowymi i wystarczająco dobrą izolacją, można skierować 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, jednocześnie odtwarzając muzykę w całej kabinie przy normalnej głośności.
Dźwięki krytyczne dla bezpieczeństwa
W systemie Android 11 wprowadzono interfejsy API skupiające dźwięk HAL . HAL gwarantuje, że dźwięki krytyczne dla bezpieczeństwa mają pierwszeństwo przed innymi dźwiękami. Jeśli warstwa HAL utrzymuje fokus audio przez USAGE_EMERGENCY
, nie ma gwarancji, że aplikacje i usługi na Androida nie będą odtwarzać dźwięków. HAL określa, które strumienie z Androida powinny zostać zmiksowane lub wyciszone, aby odtwarzać dźwięki krytyczne dla bezpieczeństwa.
Skonfiguruj interfejs użytkownika ustawień głośności
AAOS oddziela interfejs użytkownika ustawień woluminów od konfiguracji grupy woluminów. Można je nakładać zgodnie z opisem w sekcji Konfigurowanie wzmocnień grupy woluminów . Dzięki takiemu oddzieleniu nie są wymagane żadne zmiany w przypadku zmiany konfiguracji grup woluminów.
W interfejsie użytkownika ustawień samochodu, packages/apps/Car/Settings/res/xml/car_volume_items.xml
zawiera elementy interfejsu użytkownika (zasoby tytułu i ikon) powiązane z każdym zdefiniowanym AudioAttributes.USAGE
. Ten plik zapewnia rozsądne renderowanie zdefiniowanych VolumeGroups
przy użyciu zasobów powiązanych z pierwszym rozpoznanym użyciem zawartym w każdej VolumeGroup
.
Na przykład poniższy przykład definiuje VolumeGroup
jako obejmującą voice_communication
i voice_communication_signalling
. Domyślna implementacja interfejsu użytkownika ustawień samochodu renderuje VolumeGroup
przy użyciu zasobów powiązanych z voice_communication
, ponieważ jest to pierwszy element matc 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 następujących interfejsów API CarAudioManager opartych na VolumeGroup
:
-
getVolumeGroupCount()
, aby dowiedzieć się, ile kontrolek należy narysować. -
getGroupMinVolume()
igetGroupMaxVolume()
, aby uzyskać dolną i górną granicę. -
getGroupVolume()
, aby uzyskać bieżący wolumin. -
registerVolumeChangeObserver()
, aby otrzymywać powiadomienia o zmianach wolumenu.
Wydarzenie grupy ilości samochodów
Przypadki samochodowego użycia aktualizacji głośności i przełącznika wyciszenia mają podstawy kontekstowe, które mogą definiować działania niektórych aplikacji, takie jak ustawienia głośności. Bieżące wywołanie zwrotne dotyczące głośności i wyciszenia ze stosu car audio zapewnia ograniczone informacje kontekstowe. Aby lepiej obsługiwać zastosowania w motoryzacji i przyszłą skalowalność, do Androida 14 dodano CarVolumeGroupEvent. Każde zdarzenie zawiera trzy najważniejsze typy informacji:
- Lista
CarVolumeGroupInfo
-
EventTypes
(mapowane bitowo) - Lista
ExtraInfos
Informacje o grupie woluminów samochodów
Odbiorca wywołania zwrotnego zdarzenia ma łatwy dostęp do listy informacji o grupach woluminów samochodów, których to dotyczy. Oznacza to, że aplikacja nie musi wykonywać żadnych dodatkowych wywołań do platformy Car audio, aby uzyskać najnowszy stan. Może po prostu użyć otrzymanych CarVolumeGroupInfos
to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of
EventTypes, jak wyjaśniono poniżej.
Typy zdarzeń
Określa, który aspekt CarVolumeGroupInfo uległ zmianie. Aplikacje mogą to wykorzystać do identyfikowania zmian i podejmowania wymaganych działań. Na przykład EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
wskazuje, że CarVolumeGroups' maximum volume gain index has changed and can be queried by
CarVolumeGroupInfo.getMaxVolumeGainIndex()`.
W poniższej tabeli przedstawiono relację między EventType
i CarVolumeGroupInfo
.
Typ wydarzenia | Informacje o grupie woluminów samochodów |
---|---|
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() |
Dodatkowe informacje
Zawiera dodatkowe informacje o przyczynach zmiany CarVolumeGroup
. Aplikacje mogą wykorzystywać te informacje, aby zapewnić dodatkowy kontekst w celu ostrzeżenia użytkownika o konieczności działania lub powiadomienia. Na przykład EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
wskazuje aktywne tłumienie stanów przejściowych z powodu przeciążenia termicznego. Aplikacja może poinformować użytkownika, jeśli spróbuje zwiększyć głośność.
Nie wymuszamy żadnego procesu w przypadku ExtraInfos
. Decyzję o procesie w oparciu o ExtraInfos
pozostawiamy Państwu według własnego uznania. Na przykład, jeśli tłumienie jest aktywne z powodu EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
, możesz także początkowo zdecydować się na wyciszenie interfejsu paska głośności, aby uniemożliwić użytkownikowi zmianę głośności. Inni mogą zdecydować się na pokazanie toastu, że wyciszanie jest aktywne i pozwolić użytkownikowi na zmianę głośności.
Struktura car audio zależy od AudioControl HAL IAudioGainCallback
w celu zapewnienia sugerowanych ExtraInfos
. Aby dowiedzieć się więcej, zobacz Oddzwanianie zwrotne dotyczące wzmocnienia dźwięku .
CarVolumeGroupEvent
skaluje się, aby sprostać przyszłym potrzebom platformy car audio. Zamierzamy obsługiwać nowe funkcje wyłącznie za pośrednictwem CarVolumeGroupEvent
. Zdecydowanie zalecamy, aby twórcy aplikacji używali CarVolumeGroupEvent
do obsługi zmian głośności i wyciszenia grupy.
Wywołanie zwrotne zdarzenia grupy wolumenu samochodu
Android 14 zapewnia nowe wywołanie zwrotne dla aplikacji uprzywilejowanych i platformowych umożliwiające rejestrację i otrzymywanie powiadomień o CarVolumeGroupEvents
.
Aby zarejestrować się w celu oddzwonienia, użyj
CarAudioManager#registerCarVolumeGroupEventCallback()
Aby wyrejestrować wywołanie zwrotne, użyj
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Jeśli aplikacja zarejestruje się przy użyciu nowego CarVolumeGroupEventCallback
i starszego CarVolumeCallback
, priorytet będą miały zdarzenia CarVolumeGroupEventCallbacks
. Stos car audio nie wyzwala już CarVolumeCallback
. Zapobiega to zduplikowaniu wyzwalaczy tej samej aplikacji dla tego samego zdarzenia.
Zdecydowanie zalecamy użycie CarVolumeGroupEventCallback
do zarządzania zmianami głośności grupy i wyciszenia.
Oddzwanianie dotyczące wzmocnienia dźwięku
Od wersji Androida 13 AudioControl HAL może wyzwalać asynchroniczne wywołanie zwrotne w celu zarządzania aktualizacjami poziomu głośności w przypadku zmian w samochodowym systemie audio.
API HAL
Sterowanie dźwiękiem @2.0 AIDL
Wersja 2.0 AudioControl AIDL HAL dodaje następujący interfejs API:
API | Zamiar |
---|---|
IAudioControl#registerGainCallback | Rejestruje instancję IAudioGainCallback w warstwie HAL AudioControl. |
IAudioGainCallback#onAudioDeviceGainsChanged | Asynchroniczne wywołanie zwrotne powiadamiające o zmianach w konfiguracji wzmocnienia dźwięku. |
Wywołanie zwrotne AudioControl HAL zawiera listę przyczyn i odpowiednią AudioGainConfigInfo
, na którą składają się:
- Identyfikator strefy
- Adres portu urządzenia
- Indeks woluminu > indeks może być indeksem ograniczonym lub indeksem aktualizacji.
Przyczyny można ogólnie podzielić na:
- Powody ograniczeń. Tymczasowa zmiana głośności i zachowanie wyciszenia.
- Zaktualizuj powody. Trwała zmiana zachowania głośności.
Typy ograniczeń
Począwszy od AudioControl
HAL AIDL
V3
, obsługiwane są następujące typy ograniczeń:
- Niemy
- Bloking
- Ograniczenie
- Osłabienie
Aktywne ograniczenie | Zmiana głośności inicjowana przez użytkownika | Włączany przez użytkownika przełącznik wyciszenia |
---|---|---|
Niemy | ❌ | ❌ (wyłącz wyciszenie) ✔ (wyciszenie) |
Bloking | ❌ | ✔ |
Ograniczenie | ❌ (przekroczenie limitu) ✔ (poniżej limitu) | ✔ |
Osłabienie | ✔ | ✔ |
Priorytet pomiędzy ograniczeniami to Wyciszenie > Blokowanie > Ograniczenie > Tłumienie.
Wycisz ograniczenia
Ograniczenia wyciszenia to:
-
Reasons.TCU_MUTE
-
Reasons.REMOTE_MUTE
Struktura car audio wewnętrznie utrzymuje te dwa stany wyciszenia:
Wyciszenie użytkownika. Przełączane na żądanie użytkownika za pośrednictwem
CarAudioManager
lub kluczowych zdarzeń.Wyciszenie HAL-a. Przełączane w oparciu o ograniczenia wyciszenia otrzymane poprzez wywołanie zwrotne
AudioGain
.
Dla słuchaczy takich jak aplikacja Ustawienia ogólny stan wyciszenia grupy głośności ( CarVolumeGroupInfo.isMuted()
) będzie zależny od tego, czy któreś z powyższych wyciszeń jest włączone.
Gdy włączone jest wyciszenie HAL, wszystkie przychodzące żądania zmiany głośności i wyłączenia wyciszenia grupy są ignorowane przez czas obowiązywania ograniczenia.
Przypadek interakcji: wyciszenie HAL jest aktywne i żądania użytkownika dotyczące przełączenia wyciszenia
Gdy wyciszenie HAL jest włączone i wyciszenie użytkownika jest wyłączone:
- Ogólny stan wyciszenia grupy woluminów został zmieniony na
true
. - Żądania od Użytkownika dotyczące włączenia wyciszenia zostaną przetworzone.
- Powód: prośby o wyciszenie użytkownika powinny być zawsze honorowane, aby chronić prywatność użytkowników.
Gdy włączone jest wyciszenie HAL i włączone jest wyciszenie użytkownika:
Ogólny stan wyciszenia grupy woluminów został zmieniony na
true
.Żądania Użytkownika dotyczące wyłączenia wyciszenia
NOT
będą przetwarzane. Stan wyciszenia użytkownika w pamięci podręcznej pozostaje włączony.Powód: Żądania wyłączenia wyciszenia użytkownika będą honorowane tylko wtedy, gdy nie ma aktywnych ograniczeń.
Powód: Wyłączenie wyciszenia z pamięci podręcznej Wyciszenie użytkownika może spowodować niezamierzoną eksplozję dźwięku i zagrozić bezpieczeństwu użytkownika. Jest to szczególnie prawdziwe, jeśli stan wyciszenia jest włączony w trakcie cykli zapłonu, co zmniejsza świadomość użytkownika w zakresie postrzegania poziomu dźwięku.
Przypadek interakcji: Wyciszenie HAL włączone i wyłączone, podczas gdy wyciszenie użytkownika nie uległo zmianie
Włączenie wyciszenia HAL zmieni ogólny stan wyciszenia grupy głośności. Nie aktualizuje to jednak bezpośrednio stanu wyciszenia użytkownika. Gdy wyciszenie użytkownika jest wyłączone i odebrane zostanie wywołanie zwrotne wyciszenia HAL:
- Ogólny stan wyciszenia grupy woluminów został zmieniony na
true
. Żądania użytkownika dotyczące zmiany głośności
NOT
będą przetwarzane, gdy włączone jest wyciszenie HAL.Powód: Użytkownik nie może słyszeć dźwięku, gdy włączone jest wyciszenie. Zezwolenie na zmianę głośności może spowodować eksplozję dźwięku i zagrozić bezpieczeństwu użytkownika.
Powód: aplikacje woluminowe mogą rejestrować się w celu wywołań zwrotnych i wyzwalać wyłączenie wyciszenia (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automatycznie 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
.Powód: Utrwalenie stanu wyciszenia i zażądanie od Użytkownika wyłączenia wyciszenia może niepotrzebnie przeszkadzać Użytkownikowi, gdy stany wyciszenia są często przełączane.
Żądania użytkowników dotyczące zmiany głośności będą przetwarzane normalnie.
Bloking
Ograniczenia blokowania to:
-
Reasons.FORCED_MASTER_MUTE
-
Reasons.REMOTE_MUTE
-
Reasons.TCU_MUTE
.
Gdy ograniczenia blokowania są aktywne, użytkownicy żądają:
- Zmiana woluminu nie jest przetwarzana.
- Przełącz wyciszenie są przetwarzane.
Ograniczenie
Ograniczenia to:
-
Reasons.THERMAL_LIMITATION
-
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Gdy ograniczenia ograniczeń są aktywne, żądania użytkowników dotyczące:
Zmień głośność:
- W ramach Ograniczenia przetwarzane są
- Powyższe Ograniczenia nie są przetwarzane
Przełącz wyciszenie są przetwarzane.
Osłabienie
Ograniczenia tłumienia to:
-
Reasons.ADAS_DUCKING
-
Reasons.NAV_DUCKING
-
Reasons.PROJECTION_DUCKING
Gdy ograniczenia tłumienia są aktywne, żądania użytkowników dotyczące:
Zmiana woluminu jest przetwarzana. Nowy bieżący poziom głośności zostanie ustawiony na głośność wyciszoną (zamiast na poprzednią głośność). Z tego poziomu dokonywane są przyszłe zmiany głośności.
Przełącz wyciszenie jest przetwarzane.
Aktualizacja do indeksu
Za asynchroniczną aktualizację indeksu woluminu uważa się: Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Z tego powodu AudioControl HAL może zaktualizować bieżący indeks grupy woluminów do określonego indeksu. Jest to wykorzystywane głównie jako informacja zwrotna z systemu audio w przypadku żądania zmiany głośności z platformy Car Audio. Aktualizacja indeksu jest również przekazywana aplikacjom w formie wywołania zwrotnego CarVolumeGroupEvent
w celu synchronizacji indeksu.
Przykłady
Przypadek użycia: użytkownik aktualizuje indeks woluminu do 30
Użytkownik używa aplikacji Głośność, aby zmienić indeks woluminu na 30.
Indeks ten jest konwertowany na wzmocnienie głośności i wysyłany do Audio HAL.
Implementacje
Audio HAL
od dostawców uzyskują nowe wzmocnienie głośności i aktualizują system audio (np. Zewnętrzny wzmacniacz).System audio odpowiada, że poziom głośności jest aktualizowany tylko do indeksu 15 (z przyczyn nieznanych Androidowi).
Implementacje wyzwalaczy
AudioControl HAL
przez dostawców:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Usługa car audio zużywa nowy indeks z wywołania zwrotnego, który jest używany do trwałości i wywołań zwrotnych do aplikacji głośności. Indeks żądany przez użytkownika to 30. Jednakże asynchroniczne sprzężenie zwrotne systemu audio aktualizuje indeks do 15.
Przykład użycia: pierwsze odtwarzanie dźwięku po wyjściu z trybu wstrzymania
Wskaźnik głośności przed zawieszeniem jest ustawiony na wysoki poziom 95 (zakres: [0-99]).
Android przechodzi w stan zawieszenia.
Gdy Android już istnieje, zawieś (na przykład wznów):
Vendor
Audio HAL/AudioControl HAL
stosuje lokalnie bezpieczny indeks 30 dla systemu audio.Vendor
AudioControl HAL
wyzwala również wywołanie zwrotne dla bezpiecznego indeksu:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
Usługa car audio wykorzystuje nowy indeks z wywołania zwrotnego, który jest używany do trwałości, oraz własne wywołania zwrotne do aplikacji woluminu synchronizującej indeks. Indeks głośności przed zawieszeniem wynosi 95. Jednak po wznowieniu indeks ten jest ustawiany na bezpieczny poziom głośności 30 przez implementator
AudioControl HAL
.
Dynamiczna konfiguracja głośności
W przypadku tej funkcji bierzemy pod uwagę następujące podstawowe przypadki użycia:
Konfiguracja końca linii pojazdu (EOL).
Producenci samochodów wolą aktualizować konfiguracje głośności w EOL w oparciu o konfigurację systemu audio pojazdu. Zazwyczaj jest to ładowanie boczne bez aktualizacji obrazu oprogramowania systemu Android.
Producenci samochodów mogą wymagać aktualizacji konfiguracji głośności w ramach harmonogramu serwisowania.
Konfiguracja środowiska wykonawczego. Samochodowe systemy audio obsługują konfiguracje wzmacniaczy zewnętrznych, a te ECU mogą obsługiwać konfiguracje zakresu głośności, które są sprawdzane podczas uruchamiania.
Konfiguracja na żądanie. Oferowane w celu zaspokojenia rosnącego zapotrzebowania na funkcje audio oparte na zapotrzebowaniu, w ramach których użytkownicy subskrybują ulepszone przetwarzanie sygnału na określony czas. Nowe konfiguracje zakresu woluminów obowiązują przez cały okres subskrypcji.
Projekt
Dynamiczną konfigurację głośności przeprowadza się w trzech etapach:
Odkrycie. Implementacja HAL firmy AudioControl wykrywa nowe aktualizacje zakresu głośności za pośrednictwem niestandardowego mechanizmu IPC należącego do dostawcy.
Po wykryciu wywołanie zwrotne jest generowane przez
AudioControl::IModuleChangeCallback
.Aktualizacja. Stos car audio aktualizuje stany grup głośności o nowe zakresy głośności.
Dokładamy wszelkich starań, aby 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 wolumenu zostanie ustawiony na bezpieczną wartość. Na przykład domyślny poziom podany przez dostawcę podczas wywołania zwrotnego.
Oddzwonić.
Po aktualizacji zakresu grup woluminów stos samochodowy audio wyzwala wywołanie zwrotne do aplikacji zarejestrowanych za pośrednictwem
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
zawiera zaktualizowaneCarVolumeGroupInfo
, typ zdarzenia (co się zmieniło) i dodatkowe informacje (dlaczego się zmieniło).
Rysunek 1. Konfiguracja woluminu dynamicznego.
API HAL
Sterowanie dźwiękiem @ 3.0 AIDL
Wersja 3.0 AudioControl AIDL HAL wprowadza następujące interfejsy API:
API | |
---|---|
IAudioControl#setModuleChangeCallback | Ustawia instancję IModuleChangeCallback z AudioControl HAL. |
IAudioControl#clearModuleChangeWywołanie zwrotne | Czyści instancję IModuleChangeCallback ustawioną wcześniej za pomocą warstwy HAL AudioControl. |
IModuleChangeCallback#onAudioPortsZmieniono | Oddzwonienie w celu powiadomienia o zmianach w AudioPorts |
Sekwencja
Poniżej przedstawiono diagram sekwencji konfiguracji woluminu dynamicznego.
Rysunek 2. Diagram sekwencji konfiguracji woluminu dynamicznego.
Kluczowe aspekty
Aby zoptymalizować tę funkcję, rozważ następujące kwestie.
AudioPorty dostarczone w ramach wywołania zwrotnego muszą odpowiadać definicji Automotive BUS:
- Port urządzenia.
IN_DEVICE
,OUT_DEVICE
- Połączenie.
BUS
- Adres. Zdefiniowane w definicji Audio HAL
- Tryb wzmocnienia.
JOINT
- Port urządzenia.
Sprzedawcy muszą zdefiniować nadzbiór definicji zakresów głośności w zasadach Audio HAL i skorzystać z wywołania zwrotnego, aby dostosować je do wariantów pojazdu. Aby uzyskać więcej informacji, zobacz definicję AIDL
IModuleChangeCallbac
.Jeśli do tej samej grupy głośności należy więcej niż jedna szyna audio, każda z nich musi mieć identyczne definicje zakresu głośności. Niespełnienie tego warunku powoduje odrzucenie nowej definicji zakresu głośności w samochodowym systemie audio.