Zarządzanie głośnością

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.

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() i getGroupMaxVolume() , 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:

  1. 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.

  2. 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.

  3. 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 zaktualizowane CarVolumeGroupInfo , typ zdarzenia (co się zmieniło) i dodatkowe informacje (dlaczego się zmieniło).

obraz

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.

obraz

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
  • 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.