Gestione dei volumi

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

Volumi fissi

Le implementazioni di AAOS utilizzano un amplificatore hardware per controllare il volume anziché un mixer software. Per evitare effetti collaterali, imposta il flag config_useFixedVolume su true (sovrapponi se 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 flusso nel mixer software. Ciò potrebbe non essere sempre auspicabile a causa dei potenziali effetti su altre app e del fatto che l'attenuazione del volume nel mixer software può comportare un numero inferiore di bit significativi disponibili nel segnale quando viene ricevuto dall'amplificatore hardware.

Gruppi di volumi

I gruppi di volumi gestiscono i volumi per una raccolta di dispositivi all'interno di una zona audio. Per ogni gruppo di volumi, il volume può essere controllato in modo indipendente. 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 caricate quando l'utente esegue l'accesso.

Definisci i gruppi di volumi

CarAudioService utilizza i gruppi di volumi definiti in car_audio_configuration.xml:

<audioZoneConfiguration version="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <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>
              </zoneConfig>
              ...
            </zoneConfigs>
        </zone>
     </zones>
</audioZoneConfiguration>

Ogni gruppo di volumi deve contenere uno o più dispositivi di output con 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é una dimensione del 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 nel seguente modo:

  • Dimensione passo. Deve essere lo stesso per tutti i dispositivi controllati dal gruppo di volumi.
  • Guadagno minimo. Il guadagno minimo più basso tra i dispositivi del gruppo.
  • Guadagno massimo. Il guadagno massimo più alto tra i dispositivi del gruppo.
  • Guadagno predefinito. Il guadagno predefinito più alto tra i dispositivi del gruppo.

Data la modalità di configurazione di questi valori, è possibile impostare il guadagno di un gruppo di volumi al di fuori dell'intervallo supportato per un dispositivo associato al gruppo di volumi. In questo caso, per quel dispositivo il guadagno è impostato sul valore minimo o massimo del guadagno del dispositivo a seconda che il valore del gruppo di volumi sia inferiore o superiore all'intervallo.

Identificatori del gruppo di volumi

I gruppi di volumi vengono identificati in fase di runtime 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 volumi in quella 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 utilizza per impostazione predefinita la zona audio principale.

Gestione del volume multizona

Ogni zona audio deve avere uno o più gruppi di volumi e ogni gruppo di volumi è 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 nella sezione Definisci gruppi di volumi.

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

Volume di attivazione minimo e massimo

Android 15 introduce il controllo degli indici dei gruppi di volumi per una maggiore sicurezza e comfort dell'utente nei sistemi audio per auto. Ciò si ottiene utilizzando volumi di attivazione minimi e massimi, configurati all'interno della configurazione dell'audio dell'auto (vedi Definire i gruppi di volumi). Puoi attivare questa funzionalità impostando audioUseMinMaxActivationVolume su true negli RRO del servizio auto.

Puoi definire più voci activationVolumeConfig in activationVolumeConfigs, ognuna delle quali rappresenta una configurazione di attivazione minima e massima diversa. Ogni activationVolumeConfig:

  • Deve contenere un name univoco nel file di configurazione dell'audio dell'auto, in modo che possa essere fatto riferimento in un secondo momento nel gruppo di volumi (group).
  • Deve contenere un solo elemento activationVolumeConfigEntry.

Ogni activationVolumeConfig contiene i seguenti attributi:

  • minActivationVolumePercentage (numero intero, 0-100, facoltativo, valore predefinito: 0): Specifica il volume di attivazione minimo in percentuale.
  • maxActivationVolumePercentage (numero intero, 0-100, facoltativo, valore predefinito: 100): Specifica il volume di attivazione massimo in percentuale.
  • invocationType (stringa, facoltativa, valore predefinito: onPlaybackChanged): definisce le condizioni in base alle quali viene applicato il volume di attivazione minimo e massimo:

    • onBoot: applicato solo alla prima riproduzione attivata di recente su un gruppo di volumi dopo l'avvio.
    • onSourceChanged: applicato solo a una riproduzione attiva di recente con un'app o un'origine UID modificata in un gruppo di volumi.
    • onPlaybackChanged: Applicato a ogni riproduzione appena attivata in un gruppo di volumi.

CarAudioService gestisce l'attivazione minima e massima monitorando i seguenti sottocomponenti audio attualmente attivi:

  • Tracce di riproduzione attive correnti
  • Stato attuale della chiamata
  • Richiesta di stato attivo audio corrente da Audio Control HAL in cui la richiesta di stato attivo audio da Audio Control HAL segnala che è in corso una riproduzione audio attiva al di fuori di Android

L'immagine seguente mostra una panoramica di alto livello della gestione del volume di attivazione minimo e massimo:

immagine

Figura 1. Gestione dei percorsi audio attivi per il volume di attivazione minimo e massimo.

Con minActivationVolumePercentage, maxActivationVolumePercentage, indice di guadagno di volume minimo e massimo specificati, puoi calcolare l'indice di guadagno di volume di attivazione minimo e massimo per ogni gruppo di volumi. CarAudioService monitora ogni riproduzione appena attivata e applica il volume di attivazione minimo e massimo alle seguenti condizioni:

  • Corrispondenze del tipo di invocazione: il tipo di attivazione della riproduzione (derivato da Audio Manager, Audio Control HAL o Telephony Manager) deve corrispondere a invocationType specificato in activationVolumeConfigEntry associato al gruppo di volume.
  • Indice del volume fuori intervallo: l'indice di guadagno del volume corrente del gruppo di volumi deve rientrare al di fuori dell'intervallo di indice di guadagno del volume di attivazione definito, in particolare, è vera una delle seguenti condizioni:

    • L'indice è inferiore all'indice di guadagno del volume di attivazione minimo calcolato.

      O

    • L'indice è superiore all'indice di aumento del volume di attivazione massimo calcolato.

In caso di corrispondenza dell'attivazione, l'indice di guadagno di volume del gruppo di volumi verrà modificato in uno dei seguenti valori:

  • Indice di guadagno del volume di attivazione minimo se inferiore all'indice di guadagno del volume di attivazione minimo

    O

  • Indice di guadagno del volume di attivazione massimo se superiore all'indice di guadagno del volume di attivazione massimo

Inoltre, viene inviato un evento di gruppo di volumi dell'auto con tipo di evento EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED a tutti i callback degli eventi di gruppo di volumi registrati.

Gestire gli eventi dei tasti del volume

Android definisce diversi keycode per il controllo del volume, tra cui:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Per impostazione predefinita, Android indirizza gli eventi chiave del volume alle app. Le implementazioni per il settore automobilistico 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, gli eventi chiave del volume non consentono di distinguere la zona a cui sono destinati e si presume che siano tutti associati alla zona audio principale. Quando viene ricevuto un evento chiave del volume, CarAudioService determina quale gruppo di volumi regolare recuperando i contesti audio per i player attivi e poi regolando il gruppo di volumi che contiene il dispositivo di output associato al contesto audio con la priorità più alta. La priorità è determinata in base a un ordine fisso definito in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Dissolvenza e bilanciamento

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

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

    • 0.0 è centrato
    • +1.0 è completamente a destra
    • -1.0 è completamente a sinistra
    • Un valore al di fuori dell'intervallo compreso tra -1 e 1 è un errore
  • setFadeTowardFront(float value) sposta il volume dell'altoparlante verso la parte anteriore (+) o posteriore (-) dell'auto.

    • 0.0 è centrato
    • +1.0 è completamente in avanti
    • -1.0 è completamente indietro
    • Un valore al di fuori dell'intervallo compreso tra -1 e 1 è un errore

Decidi come applicare questi valori e come visualizzarli per gli utenti. Possono essere applicati rigorosamente ai contenuti multimediali o in modo generale a tutti i suoni di Android. Android 11 ha introdotto anche il supporto per l'applicazione di effetti audio ai dispositivi di output. In questo modo, è possibile gestire in alternativa dissolvenza e bilanciamento tramite gli effetti audio sui dispositivi di output appropriati anziché tramite queste API.

Attenuazione automatica audio

L'attenuazione automatica si verifica quando il veicolo riduce il guadagno di un flusso in modo che un altro flusso riprodotto contemporaneamente possa essere ascoltato più chiaramente. In AAOS, la riduzione del volume audio viene implementata dall'HAL. Android non ha alcun controllo sui suoni al di fuori del sistema operativo. In Android 11, le informazioni principali disponibili per l'HAL per prendere decisioni di abbassamento sono se due dispositivi di output hanno entrambi stream attivi.

Quando abbassarsi

Sebbene spetti al singolo OEM determinare la gestione dell'abbassamento del volume da parte dell'HAL, consigliamo le seguenti linee guida.

  • La riproduzione di più stream in Android si verifica in genere quando due app o servizi mantengono contemporaneamente lo stato attivo audio. Per scoprire quando Android può concedere lo stato attivo simultaneo, consulta la matrice di interazione in Tipi di limitazione. Con l'introduzione del plug-in audio per auto, dipende anche dalla gestione della messa a fuoco audio.

  • I flussi combinati da Android vengono eseguiti prima dell'applicazione di qualsiasi guadagno. Pertanto, qualsiasi flusso 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 consigliate.

Interazione Azione
EMERGENCY Abbassano o disattivano l'audio di tutto tranne SAFETY
SAFETY Ducks everything except EMERGENCY
NAVIGATION Tutto tranne SAFETY e EMERGENCY
CALL Anatre tutto tranne SAFETY, EMERGENCY, e NAVIGATION
VOICE Anatre CALL_RING
VEHICLE_SOUNDS Sei tu a determinare l'importanza del suono attivo e se deve attenuare altri suoni.
MUSIC e ANNOUNCEMENT Evitato da tutto. Fanno eccezione i toni di interazione touch riprodotti come SYSTEM_SOUND.

Considerazioni sul ducking

Alcuni servizi e app, come la navigazione o un assistente, potrebbero utilizzare più player per eseguire azioni. Evita l'abbassamento aggressivo quando un flusso di dati smette di fluire attraverso i dispositivi di output per assicurarti che i contenuti multimediali non tornino al volume massimo prima di essere abbassati prima della riproduzione successiva dalla navigazione o dall'avvio di un'app assistente.

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

Suoni critici per la sicurezza

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

Configurare l'UI delle impostazioni del volume

AAOS separa l'interfaccia utente delle impostazioni del volume dalla configurazione del gruppo di volumi. Questi possono essere sovrapposti come descritto in Configurare i guadagni del gruppo di volume. Questa separazione garantisce che non siano necessarie modifiche in caso di variazione 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 titolo e icona) associati a ogni AudioAttributes.USAGE definito. Questo file prevede un rendering ragionevole del VolumeGroups definito utilizzando le risorse associate al primo utilizzo riconosciuto contenuto in ogni VolumeGroup.

Ad esempio, il seguente esempio definisce un VolumeGroup come includente 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 conoscere il volume attuale.
  • registerVolumeChangeObserver() per ricevere una notifica delle modifiche al volume.

Evento del gruppo di volume dell'auto

I casi d'uso automobilistici dell'aggiornamento del volume e dell'attivazione/disattivazione della modalità Silenzioso hanno basi contestuali che possono definire le azioni di determinate app, ad esempio le impostazioni del volume. Il volume attuale e il callback di disattivazione dell'audio dallo stack audio dell'auto forniscono informazioni contestuali limitate. Per gestire meglio i casi d'uso automobilistici e la scalabilità futura, CarVolumeGroupEvent viene 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 sui gruppi di volumi delle auto interessate. Ciò significa che l'app non deve effettuare chiamate aggiuntive al framework audio dell'auto per ottenere lo stato più recente. Può semplicemente utilizzare l'CarVolumeGroupInfos ricevuto per aggiornare l'interfaccia utente o gli stati interni. Per semplificare l'utilizzo delle app, gli aspetti modificati in un gruppo di volumi dell'auto vengono forniti anche nell'ambito di EventTypes, come spiegato di seguito.

EventTypes

Definisce quale aspetto di CarVolumeGroupInfo è cambiato. Le app possono utilizzare questo valore per identificare le modifiche e intraprendere le azioni richieste. Ad esempio, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indica che l'indice di CarVolumeGroups guadagno di volume massimo è cambiato e può essere interrogato da 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 per cui CarVolumeGroup è cambiato. Le app possono utilizzare queste informazioni per fornire un contesto aggiuntivo per avvisare l'utente di agire o per inviare una notifica. Ad esempio, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL indica un'attenuazione transitoria attiva dovuta a 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 riduzione è attiva e consentire all'utente di modificare il volume.

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

CarVolumeGroupEvent si adatta per soddisfare le esigenze future del framework audio per auto. Intendiamo supportare nuove funzionalità solo tramite CarVolumeGroupEvent . Consigliamo vivamente agli sviluppatori di app di utilizzare CarVolumeGroupEvent per gestire le modifiche al volume e alla disattivazione dell'audio di gruppo.

Callback dell'evento del gruppo di volumi dell'auto

Android 14 fornisce un nuovo callback per le app privilegiate e della piattaforma per registrarsi e ricevere notifiche di CarVolumeGroupEvents.

  • Per registrarti al richiamo, utilizza CarAudioManager#registerCarVolumeGroupEventCallback()

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

Se un'app si registra con il nuovo CarVolumeGroupEventCallback e il precedente CarVolumeCallback, l'evento CarVolumeGroupEventCallbacks ha la priorità. Lo stack audio dell'auto non attiva più CarVolumeCallback. In questo modo si evitano trigger duplicati per la stessa app per lo stesso evento.

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

Callback del guadagno audio

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

API HAL

AudioControl @2.0 AIDL

La versione 2.0 di AudioControl AIDL HAL 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 AudioControl HAL include elenchi di motivi e i rispettivi AudioGainConfigInfo, che consiste in:

  • ID zona
  • Indirizzo porta del dispositivo
  • Indice del volume > l'indice può essere un indice con limitazioni o un indice di aggiornamento.

I motivi possono essere suddivisi in grandi categorie:

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

Tipi di limitazioni

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

  • 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 audio)

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

✔ (entro il limite)
Attenuazione

La priorità tra le limitazioni è Silenziamento > Blocco > Limitazione > Attenuazione.

Limitazioni relative alla disattivazione audio

Le limitazioni per la disattivazione dell'audio sono:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

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

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

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

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

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

Scenario di interazione: la disattivazione dell'audio di HAL è attiva e l'utente richiede l'attivazione/disattivazione dell'audio

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

  • Lo stato di disattivazione dell'audio complessivo del gruppo di volumi è cambiato in true.
  • Le richieste di attivazione della disattivazione dell'audio da parte dell'utente verranno elaborate.
    • Motivo: le richieste di disattivazione dell'audio degli utenti devono essere sempre rispettate per tutelare la privacy degli utenti.

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

  • Lo stato di disattivazione dell'audio complessivo del gruppo di volumi è cambiato in true.

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

    • Motivo: le richieste di riattivazione dell'audio dell'utente verranno accettate solo se non sono presenti limitazioni attive.

    • Motivo: la riattivazione dell'audio dell'utente memorizzato nella cache potrebbe causare un'esplosione sonora involontaria e mettere a rischio la sicurezza dell'utente. Ciò è particolarmente vero se lo stato di disattivazione dell'audio è abilitato durante i cicli di accensione, il che riduce la consapevolezza degli utenti della percezione del livello sonoro.

Scenario di interazione: HAL Mute attivato e disattivato mentre User mute non subisce modifiche

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

  • Lo stato di disattivazione dell'audio complessivo del gruppo di volumi è cambiato in true.
  • Le richieste dell'utente di modificare il volume NOT verranno elaborate mentre il silenziamento HAL è attivo.

    • Motivo: l'utente non riesce a percepire il suono quando la disattivazione dell'audio è attiva. Consentire la modifica del volume può causare un'esplosione sonora e mettere in pericolo la sicurezza dell'utente.

    • Motivo: le app di volume possono registrarsi per i callback e attivare la riattivazione dell'audio (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automaticamente senza l'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 dell'audio del gruppo di volumi è cambiato in false.

    Motivo: rendere permanente lo stato di disattivazione dell'audio e richiedere all'utente di riattivarlo potrebbe interrompere inutilmente l'utente quando gli stati di disattivazione dell'audio cambiano frequentemente.

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

Blocco

Le limitazioni al blocco sono:

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

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

  • La modifica del volume non viene elaborata.
  • L'attivazione/disattivazione dell'audio viene elaborata.

Limitazione

Le limitazioni sono le seguenti:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

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

  • Modificare il volume:

    • Vengono elaborati entro i limiti
    • La limitazione precedente non viene elaborata
  • L'attivazione/disattivazione dell'audio viene elaborata.

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:

  • Le modifiche al volume vengono elaborate. Il nuovo livello di volume attuale è impostato sul volume attenuato (anziché sul volume precedente). Le modifiche future del volume vengono apportate da questo livello.

  • L'attivazione/disattivazione dell'audio è in corso di elaborazione.

Aggiorna indice

Il seguente è considerato l'aggiornamento asincrono dell'indice dei volumi: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

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

Esempi

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

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

  • Questo indice viene convertito in guadagno di volume e inviato ad Audio HAL.

  • Le implementazioni del fornitore diAudio HAL ricevono il nuovo guadagno di 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 dei trigger AudioControl HAL dei fornitori:

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

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

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

  • Android entra in modalità di sospensione.

  • Una volta che Android esiste, sospendi (ad esempio, riprendi):

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

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

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

Configurazione dinamica del volume

Per questa funzionalità, prendiamo in considerazione i seguenti casi d'uso principali:

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

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

    • Le case automobilistiche potrebbero dover aggiornare la configurazione del volume durante un programma di manutenzione.

  2. Configurazione di runtime. Gli impianti audio per auto supportano configurazioni di amplificatori esterni e queste ECU possono ospitare le configurazioni dell'intervallo di volume che vengono interrogate durante l'avvio.

  3. Configurazione on demand. Offerta per soddisfare la crescente necessità di funzionalità audio basate sulla domanda in cui gli utenti si abbonano all'elaborazione avanzata del segnale per un determinato periodo di tempo. Le nuove configurazioni dell'intervallo di volume sono valide per la durata di un abbonamento.

Design

La configurazione dinamica dei volumi viene eseguita in tre fasi:

  • Scoperta. L'implementazione di AudioControl HAL del fornitore rileva i nuovi aggiornamenti dell'intervallo di volume tramite un meccanismo IPC personalizzato di proprietà del fornitore.

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

  • Aggiornamento. Lo stack audio dell'auto aggiorna gli stati del gruppo di volume con i nuovi intervalli di volume.

    Vengono compiuti sforzi per mantenere lo stesso livello di volume dopo l'aggiornamento dell'intervallo di volume. Tuttavia, se l'indice non rientra nei limiti, l'indice del volume corrente viene impostato su un valore sicuro. Ad esempio, il livello predefinito fornito dal fornitore durante il callback.

  • Richiamata.

    • Dopo 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, Event-type (what changed) e Extra-info (why it changed).

immagine

Figura 2. Configurazione dinamica del volume.

API HAL

AudioControl @ 3.0 AIDL

La versione 3.0 di AudioControl AIDL HAL introduce le seguenti API:

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

Sequenza

Di seguito è riportato il diagramma di sequenza della configurazione dinamica dei volumi.

immagine

Figura 3. Diagramma di sequenza per la configurazione dinamica dei volumi.

Aspetti chiave

Per ottimizzare questa funzionalità, tieni presente quanto segue.

  • Gli AudioPort forniti nell'ambito del callback devono corrispondere alla definizione di Automotive BUS:

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

  • Quando più BUS audio appartengono allo stesso gruppo di volumi, ognuno deve avere definizioni di intervallo di volume identiche. In caso contrario, il framework audio dell'auto rifiuterà la nuova definizione dell'intervallo di volume.