Gestione del volume

La gestione del volume è contenuta in CarAudioService, che utilizza volumi fissi con l'aspettativa che i volumi vengano applicati al di sotto dell'HAL da un amplificatore hardware anziché nel software. CarAudioService organizza i dispositivi di output in gruppi di volumi per applicare gli stessi guadagni a tutti i dispositivi associati a un gruppo di volumi.

Volumi fissi

Le implementazioni di AAOS utilizzano un amplificatore hardware per regolare il volume anziché un mixer software. Per evitare effetti collaterali, imposta il flag config_useFixedVolume su true (sovrapponi come necessario):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

Quando il flag config_useFixedVolume non è impostato (o è impostato su false), le app possono chiamare AudioManager.setStreamVolume() per modificare il volume in base al tipo di stream nel mixer software. Ciò potrebbe non essere sempre auspicabile a causa di potenziali effetti su altre app e del fatto che l'attenuazione del volume nel mixer software può comportare un minor numero di bit significativi disponibili nel segnale quando viene ricevuto dall'amplificatore hardware.

Gruppi di volumi

I gruppi di volumi gestiscono i volumi di una raccolta di dispositivi all'interno di una zona audio. Per ogni gruppo di volume, il volume può essere controllato indipendentemente. I guadagni risultanti vengono configurati sui dispositivi associati per essere applicati dall'amplificatore del veicolo. Le impostazioni del volume vengono mantenute per l'utente e vengono caricate quando l'utente accede.

Definire i gruppi di volumi

CarAudioService utilizza i gruppi di volumi definiti in 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>

Ogni gruppo di volumi deve contenere uno o più dispositivi di output con gli indirizzi associati. Gli indirizzi devono corrispondere ai dispositivi di output definiti in audio_policy_configuration.xml.

Configurare i guadagni del gruppo di volumi

Ogni gruppo di volumi ha valori di guadagno minimo, massimo e predefinito, nonché un valore di passo in base ai valori configurati in audio_policy_configuration.xml per i dispositivi associati al gruppo di volumi.

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

Durante l'inizializzazione, il gruppo di volumi controlla i valori di guadagno dei dispositivi associati e configura il gruppo come segue:

  • Passaggio. Deve essere uguale per tutti i dispositivi controllati dal gruppo di volumi.
  • Guadagno minimo. Guadagno minimo più piccolo tra i dispositivi del gruppo.
  • Guadagno massimo. Il guadagno massimo più elevato tra i dispositivi del gruppo.
  • Guadagno predefinito. Guadagno predefinito più alto tra i dispositivi del gruppo.

Dato il modo in cui sono configurati questi valori, è possibile impostare il guadagno di un gruppo di volume al di fuori dell'intervallo supportato per un dispositivo associato al gruppo di volume. In questo caso, per il dispositivo il guadagno viene impostato sul valore minimo o massimo del guadagno del dispositivo in base al fatto che il valore del gruppo di volumi sia inferiore o superiore all'intervallo.

Identificatori dei gruppi di volumi

I gruppi di volumi vengono identificati in fase di esecuzione nell'ordine definito nel file XML. Gli ID vanno da 0 a N-1 all'interno di una zona audio, dove N è il numero di gruppi di volume nella zona. In questo modo, gli ID gruppo di volumi non sono univoci tra le zone. Questi identificatori vengono utilizzati per le API CarAudioManager associate ai gruppi di volumi. Qualsiasi API che accetta un groupId senza un zoneId viene impostata per impostazione predefinita sulla zona audio principale.

Gestione dei volumi multizona

Ogni zona audio dovrebbe avere uno o più gruppi di volume e ogni gruppo di volume è associato a una sola zona audio. Questa relazione è definita nell'ambito di car_audio_configuration.xml. Per saperne di più, consulta l'esempio riportato sopra in Definire i gruppi di volumi.

I livelli di volume attuali per ogni zona vengono mantenuti per l'utente associato a quella zona. Queste impostazioni sono specifiche per ogni zona, il che significa che se un utente accede a un display associato alla zona principale e in un secondo momento accede a una zona associata a una zona audio secondaria, i livelli di volume caricati e mantenuti per la prima zona sono diversi da quelli per la zona secondaria.

Gestire gli eventi dei tasti del volume

Android definisce diversi codici a tasti per il controllo del volume, tra cui:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Per impostazione predefinita, Android inoltra gli eventi chiave del volume alle app. Le implementazioni nel settore auto e motori devono forzare l'elaborazione di questi eventi chiave da parte di CarAudioService, che a sua volta chiama setGroupVolume o setMasterMute, a seconda dei casi. Per forzare questo comportamento, imposta il flag config_handleVolumeKeysInWindowManager su true:

<resources>
    <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>

Al momento, non è possibile distinguere per quale zona sono destinati gli eventi chiave relativi al volume e si presume che siano tutti associati alla zona audio principale. Quando viene ricevuto un evento del tasto del volume, CarAudioService determina il gruppo di volume da regolare recuperando i contesti audio per i player attivi e poi regolando il gruppo di volume contenente il dispositivo di output associato al contesto audio con la priorità più alta. La priorità viene determinata in base a un ordinamento fisso definito in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Dissolvenza e bilanciamento

Entrambe le versioni dell'HAL AudioControl includono API per l'impostazione di fade e bilanciamento nel veicolo. Le API di sistema corrispondenti per CarAudioManager trasmettono i valori all'HAL AudioControl. Queste API richiedono android.car.permission.CAR_CONTROL_AUDIO_VOLUME. Le API AudioControl sono:

  • setBalanceTowardRight(float value) regola il volume dell'altoparlante verso il lato destro (+) o sinistro (-) dell'auto.

    • 0,0 è al centro
    • +1.0 è completamente a destra
    • -1.0 è completamente a sinistra
    • Un valore al di fuori dell'intervallo da -1 a 1 è un errore
  • setFadeTowardFront(float value) regola il volume dell'altoparlante verso la parte anteriore (+) o posteriore (-) dell'auto.

    • 0,0 è al centro
    • +1.0 è completamente in avanti
    • -1.0 è completamente all'indietro
    • Un valore al di fuori dell'intervallo da -1 a 1 è un errore

Sei tu a decidere come applicare questi valori e come mostrarli agli utenti. Potrebbero essere applicati esclusivamente ai contenuti multimediali o a tutti i suoni di Android. Android 11 ha anche introdotto il supporto per l'applicazione di effetti audio ai dispositivi di output. In questo modo, è possibile gestire in modo alternativo l'attenuazione e il bilanciamento tramite effetti audio sui dispositivi di output appropriati anziché tramite queste API.

Attenuazione automatica audio

L'attenuazione audio si verifica quando il veicolo riduce il guadagno di uno stream in modo che un altro stream riprodotto contemporaneamente possa essere ascoltato più chiaramente. In AAOS, la funzionalità di attenuazione audio viene implementata dall'HAL. Android non ha alcun controllo sui suoni oltre il sistema operativo. In Android 11, le informazioni principali disponibili per l'HAL per prendere decisioni relative al ducking sono se due dispositivi di output hanno o meno stream attivi.

Quando abbassarsi

Spetta al singolo OEM stabilire come viene gestito il silenziamento dall'HAL, ma consigliamo le seguenti linee guida.

  • La riproduzione di più stream su Android si verifica comunemente quando due app o servizi monopolizzano contemporaneamente l'audio. Per scoprire quando Android potrebbe concedere il controllo contemporaneamente, consulta la matrice di interazione in Tipi di restrizioni. Con l'introduzione del plug-in per l'audio dell'auto, questo dipende anche dalla gestione di AudioFocus.

  • Eventuali stream combinati da Android vengono combinati prima dell'applicazione di eventuali guadagni. Di conseguenza, qualsiasi stream che deve essere attenuato quando viene riprodotto contemporaneamente con un altro deve essere indirizzato a dispositivi di output separati in modo che l'HAL possa applicare l'attenuazione prima di mixarli.

Di seguito sono riportate le potenziali interazioni simultanee per le quali è consigliato l'uso del ducking.

Interazione Azione
EMERGENCY Mette in sottofondo o disattiva l'audio di tutti i contenuti tranne SAFETY
SAFETY Mette in sottofondo tutto tranne EMERGENCY
NAVIGATION Mette in sospensione tutto tranne SAFETY e EMERGENCY
CALL Anatra tutto tranne SAFETY, EMERGENCY e NAVIGATION
VOICE Anatre CALL_RING
VEHICLE_SOUNDS Puoi determinare l'importanza del suono attivo e se deve o meno attenuare gli altri suoni.
MUSIC e ANNOUNCEMENT Ho evitato tutto. Fanno eccezione i suoni di interazione tocco riprodotti come SYSTEM_SOUND.

Considerazioni sul ducking

Alcune app e alcuni servizi, come la navigazione o un assistente, potrebbero utilizzare più lettori per eseguire azioni. Evita un'attenuazione aggressiva quando uno stream di dati si interrompe durante il flusso attraverso i dispositivi di output per assicurarti che i contenuti multimediali non tornino al volume pieno prima di essere attenuati prima dell'avvio della riproduzione successiva dalla navigazione o di un'app di assistenza.

Per i veicoli con più stadi sonori con un isolamento sufficiente, puoi indirizzare l'audio in aree diverse dell'auto anziché attenuarlo. Ad esempio, le istruzioni di navigazione possono essere inviate agli altoparlanti del poggiatesta del conducente mentre la musica continua a essere riprodotta nell'abitacolo a un volume normale.

Suoni di sicurezza critici

Android 11 ha introdotto le API HAL per l'attenzione audio. L'HAL garantisce che i suoni critici per la sicurezza abbiano la priorità rispetto ad altri suoni. Se l'HAL mantiene l'audio in primo piano per USAGE_EMERGENCY, non è garantito che le app e i servizi di Android non riproducano suoni. L'HAL determina quali stream di Android devono essere miscelati o disattivati per riprodurre suoni di sicurezza critici.

Configurare l'interfaccia utente delle impostazioni del volume

AAOS disaccoppia l'interfaccia utente delle impostazioni del volume dalla configurazione del gruppo di volumi. Questi possono essere sovrapposti come descritto in Configurare i profitti dei gruppi di volumi. Questa separazione garantisce che non siano necessarie modifiche in caso di modifica della configurazione dei gruppi di volumi.

Nell'interfaccia utente delle impostazioni dell'auto, packages/apps/Car/Settings/res/xml/car_volume_items.xml contiene gli elementi dell'interfaccia utente (risorse di titoli e icone) associati a ogni AudioAttributes.USAGE definito. Questo file consente un rendering ragionevole del VolumeGroups definito utilizzando le risorse associate al primo utilizzo riconosciuto contenuto in ogni VolumeGroup.

Ad esempio, l'esempio seguente definisce un VolumeGroup come contenente voice_communication e voice_communication_signalling. L'implementazione predefinita dell'interfaccia utente delle impostazioni dell'auto esegue il rendering di VolumeGroup utilizzando le risorse associate a voice_communication, in quanto è la prima corrispondenza nel file.

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

Gli attributi e i valori utilizzati nella configurazione precedente sono dichiarati in packages/apps/Car/Settings/res/values/attrs.xml. L'interfaccia utente delle impostazioni del volume utilizza le seguenti API CarAudioManager basate su VolumeGroup:

  • getVolumeGroupCount() per scoprire quanti controlli devono essere disegnati.
  • getGroupMinVolume() e getGroupMaxVolume() per ottenere i limiti inferiore e superiore.
  • getGroupVolume() per ottenere il volume attuale.
  • registerVolumeChangeObserver() per ricevere una notifica delle modifiche al volume.

Evento gruppo di volumi di auto

I casi d'uso relativi all'aggiornamento del volume e all'opzione di disattivazione dell'audio per i veicoli hanno basi contestuali che possono definire le azioni di determinate app, come le impostazioni del volume. Il callback corrente per il volume e la disattivazione dell'audio dallo stack audio dell'auto fornisce informazioni contestuali limitate. Per supportare meglio i casi d'uso nel settore auto e motori e la scalabilità futura, CarVolumeGroupEvent è stato aggiunto ad Android 14. Ogni evento contiene tre tipi di informazioni fondamentali:

  • Elenco di CarVolumeGroupInfo
  • EventTypes (bitmap)
  • Elenco di ExtraInfos

CarVolumeGroupInfo

Il destinatario del callback dell'evento ha accesso immediato all'elenco delle informazioni sul gruppo di volume delle auto interessate. Ciò significa che l'app non deve effettuare chiamate aggiuntive al framework audio per auto per ottenere lo stato più recente. Può semplicemente utilizzare il CarVolumeGroupInfos ricevuto per aggiornare l'interfaccia utente o gli stati interni. Per semplificare le cose per le app, gli aspetti che sono cambiati in un gruppo di volume delle auto vengono forniti anche all'interno di EventTypes, come spiegato di seguito.

EventTypes

Definisce quale aspetto di CarVolumeGroupInfo è cambiato. Le app possono utilizzarlo per identificare le modifiche e intraprendere le azioni necessarie. Ad esempio, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indica che il rispettivo CarVolumeGroups indice di aumento del volume massimo è cambiato e può essere sottoposto a query tramite CarVolumeGroupInfo.getMaxVolumeGainIndex().

La seguente tabella mostra la relazione tra EventType e 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

Fornisce ulteriori informazioni sul motivo della modifica del CarVolumeGroup. Le app possono utilizzare queste informazioni per fornire un contesto aggiuntivo per avvisare l'utente di intervenire o per inviare una notifica. Ad esempio, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL indica un'attenuazione transitoria attiva a causa di un sovraccarico termico. L'app può informare l'utente se tenta di aumentare il volume.

Non applichiamo alcuna procedura per ExtraInfos. È a tua discrezione determinare la procedura in base a ExtraInfos. Ad esempio, se l'attenuazione è attiva a causa di EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, puoi anche scegliere di attenuare inizialmente l'interfaccia utente della barra del volume per impedire all'utente di modificare il volume. Altri potrebbero scegliere di mostrare un messaggio che indica che la funzionalità è attiva e consentire all'utente di regolare il volume.

Il framework audio per auto dipende dall'HAL AudioControl IAudioGainCallback per fornire il ExtraInfos suggerito. Per saperne di più, consulta Audio Gain Callback.

CarVolumeGroupEvent si adatta alle esigenze future del framework audio per auto. Abbiamo intenzione di supportare le nuove funzionalità solo tramite CarVolumeGroupEvent . Ti consigliamo vivamente di utilizzare CarVolumeGroupEvent per gestire le modifiche al volume e alla disattivazione dell'audio del gruppo.

Richiamo evento gruppo di volumi dell'auto

Android 14 fornisce un nuovo callback per le app privilegiate e della piattaforma per registrarsi ed essere avvisate di CarVolumeGroupEvents.

  • Per registrarti per la chiamata di ritorno, utilizza CarAudioManager#registerCarVolumeGroupEventCallback()

  • Per annullare la registrazione del callback, utilizza CarAudioManager#unregisterCarVolumeGroupEventCallback()

Se un'app si registra con il nuovo CarVolumeGroupEventCallback e con il precedente CarVolumeCallback, viene data la priorità all'evento CarVolumeGroupEventCallbacks. La pila audio dell'auto non attiva più CarVolumeCallback. In questo modo si evitano attivatori duplicati per la stessa app per lo stesso evento.

Ti consigliamo vivamente di utilizzare CarVolumeGroupEventCallback per gestire il volume del gruppo e le modifiche alla disattivazione dell'audio.

Callback per il guadagno audio

A partire da Android 13, l'HAL AudioControl può attivare un callback asincrono per gestire gli aggiornamenti del livello del volume a causa di modifiche all'impianto audio dell'auto.

API HAL

AudioControl @2.0 AIDL

La versione 2.0 dell'HAL AIDL AudioControl aggiunge la seguente API:

API Finalità
IAudioControl#registerGainCallback Registra un'istanza di IAudioGainCallback con l'HAL AudioControl.
IAudioGainCallback#onAudioDeviceGainsChanged Callback asincrono per notificare le modifiche alla configurazione del guadagno audio.

Il callback HAL AudioControl include elenchi di motivi e il rispettivo AudioGainConfigInfo, composto da:

  • ID zona
  • Indirizzo porta del dispositivo
  • L'indice del volume > indice può essere un indice limitato o un indice di aggiornamento.

I motivi possono essere classificati in modo generico come:

  • Motivi della limitazione. Modifica transitoria del comportamento del volume e della disattivazione audio.
  • Motivi dell'aggiornamento. Modifica permanente del comportamento del volume.

Tipi di restrizioni

A partire dal giorno AudioControl HAL AIDL V3, i tipi di limitazioni supportati sono i seguenti:

  • Disattiva audio
  • Blocco
  • Limitazione
  • Attenuazione
Limitazione attiva Modifica del volume attivata dall'utente Pulsante di attivazione/disattivazione dell'audio attivato dall'utente
Disattiva audio ❌ (riattiva l'audio)

✔ (disattiva l'audio)
Blocco
Limitazione ❌ (oltre il limite)

✔ (sotto il limite)
Attenuazione

La priorità tra le limitazioni è Disattivazione audio > Blocco > Limitazione > Atenuazione.

Limitazioni di disattivazione audio

Le limitazioni relative al silenziamento sono:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Il framework audio per auto gestisce internamente questi due stati di disattivazione dell'audio:

  • Disattivazione audio dell'utente. Attivato/disattivato in base alla richiesta dell'utente tramite CarAudioManager o eventi chiave.

  • HAL, disattiva l'audio. Attivato/disattivato in base alle limitazioni di disattivazione dell'audio ricevute tramite il AudioGain callback.

Per gli ascoltatori come l'app Impostazioni, lo stato di disattivazione audio complessiva del gruppo di volumi (CarVolumeGroupInfo.isMuted()) si baserà sull'attivazione di una delle disattivazione audio sopra indicate.

Quando la disattivazione dell'audio HAL è attiva, tutte le richieste in arrivo di modifica del volume e di attivazione dell'audio del gruppo vengono ignorate per la durata della limitazione.

Caso d'interazione: il silenziamento HAL è attivo e l'utente richiede l'opzione di attivazione/disattivazione del silenziamento

Quando la disattivazione audio HAL è attivata e la disattivazione audio utente è disattivata:

  • Lo stato di disattivazione del volume complessivo del gruppo è impostato su true.
  • Le richieste dell'utente di attivare la disattivazione dell'audio verranno elaborate.
    • Motivo: le richieste di disattivazione dell'audio degli utenti devono essere rispettate in ogni momento per tutelare la loro privacy.

Quando la disattivazione audio HAL è attiva e la disattivazione audio utente è attiva:

  • Lo stato di disattivazione del volume complessivo del gruppo è impostato su true.

  • Le richieste dell'utente di disattivare l'audio verranno NOT elaborate. Lo stato di disattivazione dell'audio dell'utente memorizzato nella cache rimane attivo.

    • Motivo: le richieste di attivazione dell'audio degli utenti verranno soddisfatte solo se non sono presenti limitazioni attive.

    • Motivo: la disattivazione dell'audio dell'utente memorizzato nella cache potrebbe causare un aumento improvviso del volume e mettere a rischio la sicurezza dell'utente. Questo è particolarmente vero se lo stato di disattivazione dell'audio è attivo tra i cicli di accensione, il che riduce la consapevolezza degli utenti sulla percezione del livello di suono.

Caso d'uso: disattivazione e attivazione della disattivazione audio HAL mentre la disattivazione audio utente non subisce modifiche

L'attivazione/disattivazione della disattivazione audio HAL modifica lo stato di disattivazione audio complessivo del gruppo di volumi. Tuttavia, non aggiorna direttamente lo stato di disattivazione audio dell'utente. Quando la disattivazione audio dell'utente è disattivata e viene ricevuto il callback di disattivazione audio HAL per l'abilitazione:

  • Lo stato di disattivazione del volume complessivo del gruppo è impostato su true.
  • Le richieste dell'utente di modificare il volume NOT verranno elaborate quando l'opzione di disattivazione audio HAL è attivata.

    • Motivo: l'utente non riesce a percepire l'audio quando la disattivazione dell'audio è attiva. Consentire la variazione del volume può causare un'esplosione di suoni e mettere in pericolo la sicurezza degli utenti.

    • Motivo: le app di controllo del volume possono registrarsi per i callback e attivare lo sblocco del volume (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automaticamente senza intervento dell'utente, se questo è il comportamento previsto dall'OEM.

Quando la disattivazione audio HAL è disattivata mentre la disattivazione audio utente è disattivata:

  • Lo stato di disattivazione del volume del gruppo è impostato su false.

    Motivo: l'impostazione dello stato di disattivazione dell'audio come permanente e la richiesta all'utente di riattivare l'audio possono interrompere inutilmente l'utente quando gli stati di disattivazione dell'audio vengono attivati e disattivati di frequente.

  • Le richieste degli utenti di modificare il volume verranno elaborate normalmente.

Blocco

Le limitazioni di blocco sono:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE.

Quando le limitazioni di blocco sono attive, le richieste degli utenti di:

  • Le modifiche al volume non vengono elaborate.
  • Le richieste di attivazione/disattivazione dell'audio vengono elaborate.

Limitazione

Le limitazioni sono:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Quando le limitazioni sono attive, le richieste degli utenti di:

  • Regolare il volume:

    • Entro il limite vengono elaborati
    • I dati che superano il limite non vengono elaborati
  • Le richieste di attivazione/disattivazione dell'audio vengono elaborate.

Attenuazione

Le limitazioni di attenuazione sono:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

Quando le limitazioni di attenuazione sono attive, le richieste degli utenti di:

  • Regolare il volume. Il nuovo livello di volume corrente viene impostato sul volume attenuato (anziché sul volume precedente). Le modifiche future al volume vengono apportate da questo livello.

  • L'opzione Attiva/disattiva audio è stata elaborata.

Aggiornamento dell'indice

Di seguito è riportato l'aggiornamento dell'indice dei volumi asincroni: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Per questo motivo, l'HAL AudioControl può aggiornare l'indice corrente del gruppo di volumi all'indice specificato. Viene utilizzato principalmente come feedback del sistema audio per la richiesta di modifica del volume dal framework audio dell'auto. L'aggiornamento dell'indice viene comunicato anche ad App come callback CarVolumeGroupEvent per sincronizzare l'indice.

Esempi

Caso d'uso: l'utente aggiorna l'indice del volume su 30

  • L'utente utilizza l'app Volume per impostare l'indice del volume su 30.

  • Questo indice viene convertito in guadagno del volume e inviato all'HAL audio.

  • Le implementazioni dei fornitori di Audio HAL ricevono il nuovo guadagno del volume e aggiornano il sistema audio (come l'amplificatore esterno).

  • Il sistema audio risponde che il livello del volume viene aggiornato solo all'indice 15 (per motivi sconosciuti ad Android).

  • Implementazioni degli attivatoriAudioControl HAL da parte dei fornitori:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Il servizio audio per auto utilizza il nuovo indice dal callback utilizzato per la persistenza e i callback all'app di controllo del volume. L'indice richiesto dall'utente è 30. Tuttavia, il feedback asincrono del sistema audio aggiorna l'indice su 15.

Caso d'uso: prima riproduzione audio dopo l'uscita dalla sospensione

  • L'indice di volume prima della sospensione è impostato su un livello elevato di 95 (intervallo: [0-99]).

  • Android entra in modalità sospensione.

  • Una volta che Android è in stato di sospensione (ad esempio, ripresa):

    • Il fornitore Audio HAL/AudioControl HAL applica un indice di sicurezza di 30 al sistema audio a livello locale.

    • Il fornitore AudioControl HAL attiva anche il callback per l'indice sicuro:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Il servizio audio per auto utilizza il nuovo indice dal callback utilizzato per la persistenza e i suoi callback all'app di gestione del volume che sincronizza l'indice. L'indice del volume prima della sospensione è 95. Tuttavia, al riavvio, questo indice viene impostato su un livello di volume sicuro di 30 dall'implementatore di AudioControl HAL.

Configurazione del volume dinamico

Per questa funzionalità, consideriamo i seguenti casi d'uso principali:

  1. Configurazione del veicolo di fine serie (EOL).

    • I produttori di auto preferiscono aggiornare le configurazioni del volume a fine vita in base alla configurazione dell'impianto audio del veicolo. In genere, si tratta di un sideload senza aggiornare l'immagine del software Android.

    • I produttori di auto potrebbero dover aggiornare la configurazione del volume durante una programmazione del servizio.

  2. Configurazione di runtime. I sistemi audio per auto supportano configurazioni di amplificatori esterni e queste ECU possono ospitare le configurazioni dell'intervallo di volume a cui viene eseguita la query durante l'avvio.

  3. Configurazione on demand. Offerto per supportare la crescente necessità di funzionalità audio basate sulla domanda in cui gli utenti si abbonano all'elaborazione avanzata dei segnali per un determinato periodo di tempo. Le nuove configurazioni dell'intervallo di volumi sono valide per la durata di un abbonamento.

Design

La configurazione dei volumi dinamici avviene in tre fasi:

  • Discovery. L'implementazione HAL AudioControl del fornitore rileva i nuovi aggiornamenti della gamma di volume tramite un meccanismo IPC personalizzato di proprietà del fornitore.

    Una volta rilevato, viene generato un callback tramite AudioControl::IModuleChangeCallback.

  • Aggiorna. La pila audio dell'auto aggiorna gli stati del gruppo di volume con i nuovi intervalli di volume.

    Ci impegniamo a mantenere lo stesso livello di volume dopo l'aggiornamento dell'intervallo di volume. Tuttavia, se l'indice non è compreso nell'intervallo consentito, l'indice del volume corrente viene impostato su un valore sicuro. Ad esempio, il livello predefinito fornito dal fornitore durante il callback.

  • Richiamata.

    • Dopo aver pubblicato gli aggiornamenti dell'intervallo del gruppo di volumi, lo stack audio dell'auto attiva un callback per le app registrate tramite CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent contiene CarVolumeGroupInfo aggiornato, Tipo-evento (che cosa è cambiato) e Informazioni-extra (perché è cambiato).

immagine

Figura 1. Configurazione del volume dinamico.

API HAL

AudioControl @ 3.0 AIDL

La versione 3.0 dell'HAL AIDL AudioControl introduce le seguenti API:

API
IAudioControl#setModuleChangeCallback Imposta un'istanza di IModuleChangeCallback con l'HAL AudioControl.
IAudioControl#clearModuleChangeCallback Cancella l'istanza di IModuleChangeCallback impostata in precedenza con l'HAL AudioControl.
IModuleChangeCallback#onAudioPortsChanged Callback per notificare le modifiche ad AudioPorts

Sequenza

Di seguito è riportato il diagramma di sequenza della configurazione del volume dinamico.

immagine

Figura 2. Diagramma di sequenza per la configurazione del volume dinamico.

Aspetti chiave

Per ottimizzare questa funzionalità, tieni presente quanto segue.

  • Le AudioPort fornite nell'ambito del callout devono corrispondere alla definizione di AutomotiveBUS:

    • Porta del dispositivo. IN_DEVICE, OUT_DEVICE
    • Connessione.BUS
    • Indirizzo. Definito nella definizione dell'HAL audio
    • Modalità guadagno.JOINT
  • I fornitori devono definire un superset di definizioni di intervalli di volume nel criterio HAL audio e utilizzare il callback per personalizzarlo in base alle varianti del veicolo. Per ulteriori informazioni, consulta la definizione di AIDL di IModuleChangeCallbac.

  • Quando più di un bus audio appartiene allo stesso gruppo di volumi, ogni bus deve avere definizioni di intervallo di volume identiche. In caso contrario, il framework audio dell'auto rifiuterà la definizione del nuovo intervallo di volume.