Gestione del volume

La gestione dei volumi è 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 AAOS utilizzano un amplificatore hardware per controllare il volume invece di un mixer del software. Per evitare effetti collaterali, imposta il flag config_useFixedVolume su true (overlay se necessario):

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

Se il flag config_useFixedVolume non è impostato (o è impostato su false), le app possono chiamare AudioManager.setStreamVolume() per modificare il volume per tipo di stream nel software mixer. Ciò potrebbe non essere sempre auspicabile per via dei potenziali effetti su altre app e del fatto che l'attenuazione del volume nel software mixer possa ridurre il numero di bit significativi disponibili nel segnale quando ricevuto dall'amplificatore hardware.

Gruppi di volumi

I gruppi di volumi gestiscono i volumi per un insieme di dispositivi all'interno di una zona audio. Per ogni gruppo di volumi, il volume può essere controllato in modo indipendente. I vantaggi risultanti vengono configurati sui dispositivi associati in modo che vengano applicati dall'amplificatore del veicolo. Le impostazioni del volume sono persistenti per l'utente e vengono caricate quando l'utente accede.

Definisci gruppi di volumi

CarAudioService utilizza 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 indirizzi associati. Gli indirizzi devono corrispondere ai dispositivi di output definiti in audio_policy_configuration.xml.

Configura i guadagni del gruppo di volume

Ogni gruppo di volume ha valori di guadagno minimo, massimo e predefinito, nonché una dimensione del passo basata sui valori configurati in audio_policy_configuration.xml per i dispositivi associati al gruppo di volume.

<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 volume controlla i valori di guadagno dei dispositivi associati e configura il gruppo come segue:

  • Dimensione dei passaggi. Deve essere uguale per tutti i dispositivi controllati dal gruppo di volumi.
  • Guadagno minimo. Guadagno minimo minimo tra i dispositivi del gruppo.
  • Massimo guadagno. Guadagno massimo massimo tra i dispositivi del gruppo.
  • Guadagno predefinito. Guadagno predefinito massimo tra i dispositivi del gruppo.

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

Identificatori di gruppi di volumi

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

Gestione del volume multizona

Ogni zona audio deve avere uno o più gruppi di volume e ogni gruppo di volume è associato a una sola zona audio. Questa relazione è definita come parte di car_audio_configuration.xml. Per ulteriori informazioni, vedi l'esempio precedente in Definire i gruppi di volumi.

I livelli di volume attuali per ciascuna zona sono persistenti per l'utente associato a quella zona. Queste impostazioni sono specifiche per la zona, vale a dire che se un utente accede a un display associato alla zona principale per poi accedere a una zona associata a una zona audio secondaria, i livelli di volume caricati e persistenti per la prima zona sono diversi da quelli della zona secondaria.

Gestire gli eventi dei tasti del volume

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Per impostazione predefinita, Android instrada gli eventi dei tasti del volume alle app. Le implementazioni del settore auto e motori dovrebbero forzare l'elaborazione di questi eventi chiave entro il giorno CarAudioService, che quindi chiama setGroupVolume o setMasterMute, a seconda del caso. 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 possono distinguere la zona a cui sono destinati e si presume siano tutti associati alla zona audio principale. Quando viene ricevuto un evento chiave del volume, CarAudioService stabilisce quale gruppo di volume regolare recuperando i contesti audio per i player attivi e regolando il gruppo di volume contenente il dispositivo di output associato al contesto audio con priorità più elevata. L'assegnazione della priorità è determinata in base a un ordine fisso definito in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Dissolvenza e bilancia

Entrambe le versioni dell'AudioControl HAL includono API per impostare dissolvenza e bilanciamento nel veicolo. Le API di sistema corrispondenti per CarAudioManager passano i valori all'AudioControl HAL. 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 è perfettamente corretta
    • -1,0 è completamente a sinistra
    • Un valore al di fuori dell'intervallo da -1 a 1 è un errore
  • setFadeTowardFront(float value) sposta il volume dello speaker verso la parte anteriore (+) o posteriore (-) dell'auto.

    • 0,0 è centrato
    • +1,0 è completamente 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. Possono essere applicate rigorosamente ai contenuti multimediali o a tutti i suoni 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 il dissolvenza e il bilanciamento attraverso gli effetti audio sui dispositivi di output appropriati, anziché tramite queste API.

Attenuazione automatica audio

Attenuazione automatica audio quando il veicolo riduce il guadagno di uno stream, in modo che un altro stream riprodotto contemporaneamente possa essere udito con maggiore chiarezza. In AAOS, la funzionalità Attenuazione automatica audio è implementata dall'HAL. Android non ha alcun controllo sui suoni oltre il sistema operativo. In Android 11, la principale informazione disponibile per l'HAL per prendere decisioni in merito all'attenuazione automatica è stabilire se due dispositivi di output hanno entrambi stream attivi.

Quando anatra

Anche se spetta al singolo OEM stabilire la modalità di gestione dell'attenuazione automatica da parte dell'HAL, consigliamo di seguire le linee guida riportate di seguito.

  • Stream multipli in riproduzione su Android di solito si verificano quando due app o servizi contemporaneamente mantengono lo stato attivo dell'audio. Per sapere quando Android può concedere la messa a fuoco simultanea, consulta la matrice di interazione in Tipi di limitazioni. Con l'introduzione del plug-in per l'audio dell'auto, questo dipende anche dalla gestione di AudioFocus.

  • Tutti gli stream combinati da Android vengono effettuati prima dell'applicazione di eventuali guadagni. Pertanto, tutti gli stream che dovrebbero essere sottoposti a attenuazione automatica quando riprodotti contemporaneamente ad altri devono essere indirizzati a dispositivi di output separati, in modo che l'HAL possa applicare l'attenuazione automatica prima di mixarli.

Di seguito sono riportate le potenziali interazioni simultanee che si consiglia di ignorare.

Interazione Azione
EMERGENCY Attenua o disattiva l'audio di tutti i contenuti tranne di SAFETY
SAFETY Attenua tutto tranne EMERGENCY
NAVIGATION Annulla tutti i dati tranne SAFETY e EMERGENCY
CALL Annulla tutti i dati tranne SAFETY, EMERGENCY e NAVIGATION
VOICE Anatre CALL_RING
VEHICLE_SOUNDS Sei tu a determinare l'importanza del suono attivo e se attenua o meno gli altri suoni.
MUSIC e ANNOUNCEMENT Faccina oscurata da tutto. Le eccezioni sono i toni dell'interazione al tocco riprodotti come SYSTEM_SOUND.

Considerazioni sull'attenuazione automatica

Alcuni servizi e app, come la navigazione o un assistente, potrebbero utilizzare più player per eseguire azioni. Evita di annullare in modo aggressivo il flusso di dati quando un flusso di dati interrompe il flusso attraverso i dispositivi di output, per assicurarti che i contenuti multimediali non tornino al volume massimo prima di essere attenuati prima3 della riproduzione successiva dalla navigazione o all'avvio di un'app di assistente.

Per i veicoli con più palcoscenici e un isolamento sufficiente, puoi indirizzare l'audio a diverse aree dell'auto anziché ridurre il rumore. Ad esempio, le istruzioni di navigazione possono essere indirizzate agli altoparlanti del poggiatesta del conducente mentre ascoltare musica per l'intera cabina a un volume normale.

Suoni critici per la sicurezza

Android 11 ha introdotto le API HAL audio focus. L'HAL garantisce che i suoni critici per la sicurezza abbiano la priorità rispetto ad altri. Se l'HAL mantiene lo stato attivo dell'audio per USAGE_EMERGENCY, non è garantito che le app e i servizi di Android non riproducono i suoni. L'HAL determina quali stream da Android devono essere mixati o disattivati per riprodurre suoni critici per la sicurezza.

Configura 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 guadagni del gruppo di volume. Questa separazione garantisce che non siano necessarie modifiche in caso di variazione della configurazione dei gruppi di volume.

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

Ad esempio, nell'esempio seguente viene definito VolumeGroup che include voice_communication e voice_communication_signalling. L'implementazione predefinita della UI delle impostazioni dell'auto esegue il rendering di VolumeGroup tramite le risorse associate a voice_communication, che è il primo matc del 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. La UI delle impostazioni del volume utilizza le seguenti API CarAudioManager basate su VolumeGroup:

  • getVolumeGroupCount() per scoprire quanti controlli devono essere tracciati.
  • getGroupMinVolume() e getGroupMaxVolume() per ottenere i limiti inferiore e superiore.
  • getGroupVolume() per regolare il volume attuale.
  • registerVolumeChangeObserver() per ricevere notifiche sulle variazioni di volume.

Evento gruppo volume auto

I casi d'uso relativi ad auto e motori di aggiornamento del volume e attivazione/disattivazione della disattivazione dell'audio hanno elementi di base contestuali che possono definire le azioni di determinate app, ad esempio le impostazioni del volume. Il volume attuale e il callback di disattivazione audio dello stack audio dell'auto forniscono informazioni contestuali limitate. Ad Android 14 viene aggiunto CarVolumeGroupEvent, per rispondere meglio ai casi d'uso del settore auto e motori e Ogni evento comporta tre tipi critici di informazioni:

  • Elenco di CarVolumeGroupInfo
  • EventTypes (mappata a bit)
  • Elenco di ExtraInfos

Info gruppo volume auto

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

EventType

Definisce quale aspetto di CarVolumeGroupInfo è stato modificato. Le app possono usarlo per identificare le modifiche e intraprendere le azioni necessarie. Ad esempio, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indica che il rispettivo indice di guadagno del volume massimo CarVolumeGroups è cambiato e può essere interrogato da CarVolumeGroupInfo.getMaxVolumeGainIndex().

La seguente tabella mostra la relazione tra EventType e CarVolumeGroupInfo.

Tipo di evento Info gruppo volume auto
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.isSilentd()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlock()
EVENT_TYPE_ATTENUATION_CHANGED InfoGruppoCarVolume.èAttenuato()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

Ulteriori informazioni

Fornisce ulteriori informazioni sul motivo per cui CarVolumeGroup è cambiato. Le app possono utilizzare queste informazioni per fornire ulteriore contesto per avvisare l'utente di agire o di inviare una notifica. Ad esempio, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL indica un'attenuazione attiva dei transienti dovuta a un sovraccarico termico. L'app può informare l'utente se tenta di aumentare il volume.

Non applichiamo alcuna procedura per ExtraInfos. La procedura viene determinata a tua discrezione in base al criterio ExtraInfos. Ad esempio, se l'attenuazione è attiva a causa di EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, puoi anche scegliere di sbiadire inizialmente l'interfaccia utente della barra del volume per impedire all'utente di modificare il volume. Altri potrebbero scegliere di mostrare un toast che indica che l'attenuazione automatica è attiva e consente all'utente di regolare il volume.

Il framework dell'audio dell'auto dipende dall'AudioControl IAudioGainCallback dell'HAL per fornire il ExtraInfos suggerito. Per scoprire di più, consulta la pagina Callback guadagno audio.

CarVolumeGroupEvent si adatta alle esigenze future del framework audio dell'auto. Intendiamo supportare le nuove funzionalità solo tramite CarVolumeGroupEvent. Consigliamo vivamente agli sviluppatori di app di utilizzare CarVolumeGroupEvent per gestire il volume del gruppo e disattivare l'audio delle modifiche.

Callback dell'evento del gruppo del volume dell'auto

Android 14 fornisce un nuovo callback per le app della piattaforma e con privilegi per registrarsi e ricevere notifiche su CarVolumeGroupEvents.

  • Per registrarti al callback, usa CarAudioManager#registerCarVolumeGroupEventCallback()

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

Se un'app viene registrata con la nuova versione CarVolumeGroupEventCallback e la precedente CarVolumeCallback, gli eventi CarVolumeGroupEventCallbacks hanno la priorità. Lo stack dell'audio dell'auto non attiva più CarVolumeCallback. In questo modo si evitano trigger duplicati nella stessa app per lo stesso evento.

Ti consigliamo vivamente di usare CarVolumeGroupEventCallback per gestire il volume del gruppo e disattivare l'audio delle modifiche.

Callback guadagno audio

A partire da Android 13, AudioControl HAL può attivare un callback asincrono per gestire gli aggiornamenti del livello di 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 AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged Callback asincrono per notificare le modifiche alla configurazione del guadagno audio.

Il callback AudioControl HAL include elenchi di motivi e il rispettivo AudioGainConfigInfo, che comprende:

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

I motivi possono essere a grandi linee:

  • Motivi delle limitazioni. Modifica temporanea del comportamento del volume e dell'audio disattivato.
  • Motivi dell'aggiornamento. Modifica permanente del comportamento del volume.

Tipi di restrizioni

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

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

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

✔ (sotto il limite)
Attenuazione

La priorità tra le restrizioni è Disattiva audio > Blocco > Limitazione > Attenuazione.

Limitazioni per la disattivazione dell'audio

Le limitazioni per la disattivazione dell'audio sono:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

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

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

  • Disattiva audio HAL. Opzione attivata in base alle limitazioni di disattivazione dell'audio ricevute tramite il callback AudioGain.

Per gli ascoltatori come l'app Impostazioni, lo stato generale di disattivazione dell'audio del gruppo di volume (CarVolumeGroupInfo.isMuted()) si baserà sull'attivazione o meno di una delle disattivazioni sopra indicate.

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

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

Quando è attiva la disattivazione dell'audio dell'HAL e quella dell'utente è disattivata:

  • Lo stato di disattivazione generale del gruppo di volume è stato impostato su true.
  • Le richieste dell'utente per l'attivazione dell'audio verranno elaborate.
    • Motivo: le richieste di disattivazione dell'audio degli utenti devono essere sempre rispettate per tutelare la loro privacy.

Quando è attiva la disattivazione dell'audio dell'HAL e quella dell'utente è attivata:

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

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

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

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

Caso di interazione: la disattivazione dell'audio dell'HAL è attivata e disattivata mentre la disattivazione dell'audio dell'utente non ha modifiche

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

  • Lo stato di disattivazione generale del gruppo di volume è stato impostato su true.
  • Le richieste dell'utente di modificare il volume verranno NOT elaborate mentre è attiva la disattivazione dell'audio dell'HAL.

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

    • Motivo: le app con volume possono registrarsi per i callback e attivare un avviso di riattivazione (CarAudioManager.setVolumeGroupSilent(...,/* mute=*/ true,..)) automaticamente senza l'intervento dell'utente, se questo è il comportamento previsto dall'OEM.

Quando l'audio dell'HAL è disattivato e l'audio dell'utente è disattivato:

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

    Motivo: impostare lo stato di disattivazione dell'audio in modo permanente e richiedere all'utente di riattivarlo potrebbero interrompere inutilmente l'utente quando gli stati di disattivazione dell'audio sono frequenti.

  • Le richieste di modifica del volume degli utenti 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 a:

  • Le variazioni di volume non vengono elaborate.
  • L'opzione Attiva/disattiva audio viene elaborata.

Limitazione

I limiti alle limitazioni sono:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Quando le limitazioni delle limitazioni sono attive, le richieste degli utenti a:

  • Per regolare il volume:

    • Entro la limitazione vengono elaborati
    • Oltre i limiti non vengono elaborati
  • L'opzione Attiva/disattiva audio viene elaborata.

Attenuazione

I limiti di attenuazione sono:

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

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

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

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

Aggiorna all'indice

Il seguente è considerato come aggiornamento asincrono dell'indice del volume: Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

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

Esempi

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

  • L'utente usa 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 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 da parte dei fornitori degli attivatori AudioControl HAL:

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

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

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

  • Android entra in modalità di sospensione.

  • Dopo l'esistenza della sospensione di Android (ad esempio, ripristina):

    • Il fornitore Audio HAL/AudioControl HAL applica un indice di sicurezza pari a 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 usato per la persistenza e i suoi callback all'app di volume che sincronizza l'indice. L'indice del volume prima della sospensione è 95. Tuttavia, dopo la ripresa, questo indice viene impostato su un livello di volume sicuro pari a 30 dall'implementatore AudioControl HAL.

Configurazione volume dinamico

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

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

    • Le case automobilistiche preferiscono aggiornare le configurazioni del volume alla fine del ciclo di vita in base alla configurazione del sistema audio del veicolo. In genere, si tratta di un sideload che non aggiorna l'immagine SW di Android.

    • I produttori di automobili potrebbero dover aggiornare la configurazione del volume durante una pianificazione del servizio.

  2. Configurazione di runtime. I sistemi audio automobilistici supportano configurazioni di amplificatori esterni e queste ECU possono ospitare le configurazioni dell'intervallo del volume che vengono interrogate durante l'avvio.

  3. Configurazione on demand. Offerta per sostenere la crescente necessità di funzionalità audio basate su domanda in cui gli utenti si abbonano a un'elaborazione avanzata dei segnali per un determinato periodo di tempo. Le nuove configurazioni dell'intervallo di volume sono valide per la durata di un abbonamento.

Design

La configurazione del volume dinamico viene eseguita in tre fasi:

  • Scoperta. L'implementazione dell'HAL AudioControl del fornitore rileva 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.

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

    Facciamo il possibile per mantenere lo stesso livello di volume dopo l'aggiornamento dell'intervallo di volume. Tuttavia, se l'indice supera i limiti, l'indice del volume attuale viene impostato su un valore sicuro. Ad esempio, il livello predefinito fornito dal fornitore durante il callback.

  • Richiama.

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

    • CarVolumeGroupEvent contiene i valori CarVolumeGroupInfo, Event-type (cosa è cambiato) ed Extra-info (perché è cambiato) aggiornati.

immagine

Figura 1. Configurazione del volume dinamico.

API HAL

AudioControl 3.0 AIDL

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

API
ControlloIAudio#setModuleChangeCallback Imposta un'istanza di IModuleChangeCallback con AudioControl HAL.
Controllo IAudio#clearModuleChangeCallback Cancella l'istanza di IModuleChangeCallback precedentemente impostata con l'AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Callback per notifica delle modifiche a 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 principali

Per ottimizzare questa funzionalità, considera quanto segue.

  • Le porte audio fornite come parte del callback devono corrispondere alla definizione di Automotive BUS:

    • Porta del dispositivo. IN_DEVICE e OUT_DEVICE
    • Connessione. BUS
    • Indirizzo. Definite nella definizione di Audio HAL
    • Modalità Guadagno. JOINT
  • I fornitori devono definire un soprainsieme di definizioni degli intervalli di volume nel criterio Audio HAL e utilizzare il callback per personalizzarlo per le varianti del veicolo. Per ulteriori informazioni, consulta la definizione di AIDL IModuleChangeCallbac.

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