Gestione del volume,Gestione del volume

La gestione del volume è contenuta in CarAudioService , che utilizza volumi fissi con la previsione 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 software. Per evitare effetti collaterali, imposta il flag config_useFixedVolume su true (sovrapponilo 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 minor numero di bit significativi disponibili nel segnale quando viene 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 ciascun gruppo di volume, 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 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>

Ciascun gruppo di volumi dovrebbe 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 volumi 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 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:

  • Dimensione del passo. Deve essere lo stesso per tutti i dispositivi controllati dal gruppo di volumi.
  • Guadagno minimo. Guadagno minimo più piccolo tra i dispositivi del gruppo.
  • Guadagno massimo. Guadagno massimo più alto 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 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 di guadagno minimo o massimo del dispositivo a seconda che il valore del gruppo di volume 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 volume in quella zona. In questo modo, gli ID dei gruppi 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 zoneId utilizza per impostazione predefinita la zona audio primaria.

Gestione del volume multizona

Si prevede che ciascuna zona audio disponga di uno o più gruppi di volume e ciascun gruppo di volume è associato solo a una singola zona audio. Questa relazione è definita come parte di car_audio_configuration.xml . Per ulteriori informazioni, vedere l'esempio sopra in Definire gruppi di volumi .

I livelli di volume correnti per ciascuna zona vengono mantenuti per l'utente associato a quella zona. Queste impostazioni sono specifiche della zona, ovvero se un utente accede su un display associato alla zona primaria e successivamente accede a una zona associata a una zona audio secondaria, i livelli di volume caricati e persistenti per la prima zona differiscono da quelli per la zona secondaria.

Gestire gli eventi relativi ai 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 indirizza gli eventi dei tasti del volume alle app. Le implementazioni automobilistiche dovrebbero forzare l'elaborazione di questi eventi chiave da parte di CarAudioService , che quindi 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>

Gli eventi relativi ai tasti del volume attualmente non hanno modo di distinguere a quale zona sono destinati e si presuppone che siano tutti associati alla zona audio primaria. Quando viene ricevuto un evento relativo al tasto del volume, CarAudioService determina quale gruppo di volume regolare recuperando i contesti audio per i lettori attivi e quindi regolando il gruppo di volume che contiene il dispositivo di output associato al contesto audio con la priorità più alta. La priorità è determinata in base a un ordinamento fisso definito in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY .

Dissolvenza ed equilibrio

Entrambe le versioni di AudioControl HAL includono API per impostare la dissolvenza e il 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 è pienamente corretto
    • -1.0 è completamente a sinistra
    • Un valore fuori dall'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 fuori dall'intervallo compreso tra -1 e 1 è un errore

Sei tu a decidere come applicare questi valori e come visualizzarli agli utenti. Potrebbero essere applicati rigorosamente ai media o in generale 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 la dissolvenza e il bilanciamento tramite effetti audio sui dispositivi di output appropriati anziché tramite queste API.

Ducking dell'audio

Il ducking audio 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, il ducking audio è implementato dall'HAL. Android non ha alcun controllo sui suoni al di fuori del sistema operativo. In Android 11, l'informazione principale a disposizione dell'HAL per prendere decisioni di ducking è se due dispositivi di output hanno entrambi flussi attivi o meno.

Quando abbassarsi

Anche se spetta al singolo OEM determinare la modalità di gestione del ducking da parte dell'HAL, si consigliano le seguenti linee guida.

  • Più flussi riprodotti in Android si verificano comunemente quando due app o servizi mantengono contemporaneamente il focus audio. Per sapere quando Android può concedere il focus simultaneo, consulta la matrice di interazione in Tipi di restrizione . Con l'introduzione del plug-in audio per auto, ciò dipende anche dalla tua gestione AudioFocus.

  • Tutti i flussi mescolati insieme da Android vengono eseguiti prima dell'applicazione di eventuali guadagni. Pertanto, qualsiasi flusso che deve essere sottoposto al ducking quando riprodotto contemporaneamente a un altro deve essere instradato a dispositivi di output separati in modo che l'HAL possa applicare il ducking prima di mixarli.

Di seguito sono riportate le potenziali interazioni simultanee. Si consiglia il ducking.

Interazione Azione
EMERGENCY Abbassa o silenzia tutto tranne SAFETY
SAFETY Evita tutto tranne EMERGENCY
NAVIGATION Evita tutto tranne SAFETY ed EMERGENCY
CALL Evita tutto tranne SAFETY , EMERGENCY e NAVIGATION
VOICE Anatre CALL_RING
VEHICLE_SOUNDS Sei tu a determinare l'importanza del suono attivo e se elimina o meno altri suoni.
MUSIC e ANNOUNCEMENT Schiacciato da tutto. Le eccezioni sono i toni di interazione touch riprodotti come SYSTEM_SOUND .

Considerazioni sul ducking

Alcuni app e servizi, come la navigazione o un assistente, potrebbero utilizzare più lettori per eseguire azioni. Evita lo sgancio aggressivo quando un flusso di dati smette di fluire attraverso i dispositivi di output per garantire che i contenuti multimediali non ritornino al volume massimo prima di essere abbassati prima3 dell'avvio della riproduzione successiva dalla navigazione o da un'app di assistenza.

Per i veicoli con più livelli sonori con un isolamento sufficientemente buono, puoi instradare l'audio in diverse aree dell'auto invece di abbassarlo. Ad esempio, le istruzioni di navigazione possono essere indirizzate agli altoparlanti sul poggiatesta del conducente continuando a riprodurre la musica a volume normale in tutto l'abitacolo.

Suoni critici per la sicurezza

Android 11 ha introdotto le API di messa a fuoco audio HAL . L'HAL garantisce che i suoni critici per la sicurezza abbiano la priorità rispetto agli altri suoni. Se l'HAL mantiene il focus audio per USAGE_EMERGENCY , non è garantito che le app e i servizi di Android non riproducano suoni. L'HAL determina quali flussi provenienti 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 Configurazione dei guadagni del gruppo di volumi . Questa separazione garantisce che non siano necessarie modifiche nel caso in cui dovesse cambiare la 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 titolo e icona) associati a ciascun AudioAttributes.USAGE definito. Questo file fornisce una resa ragionevole dei VolumeGroups definiti utilizzando le risorse associate al primo utilizzo riconosciuto contenuto in ciascun VolumeGroup .

Ad esempio, l'esempio seguente definisce un VolumeGroup come comprendente 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 poiché questo è il primo matc 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 sapere quanti controlli dovrebbero essere disegnati.
  • getGroupMinVolume() e getGroupMaxVolume() per ottenere i limiti inferiore e superiore.
  • getGroupVolume() per ottenere il volume corrente.
  • registerVolumeChangeObserver() per ricevere una notifica delle modifiche al volume.

Evento del gruppo di volumi dell'auto

I casi d'uso automobilistici dell'aggiornamento del volume e dell'attivazione/disattivazione dell'audio hanno basi contestuali che possono definire le azioni di determinate app, come le impostazioni del volume. Il volume corrente e la richiamata disattivata dallo stack audio dell'auto forniscono informazioni contestuali limitate. Per servire meglio i casi d'uso automobilistici e la scalabilità futura, CarVolumeGroupEvent viene aggiunto ad Android 14. Ogni evento trasporta tre tipi critici di informazioni:

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

CarVolumeGroupInfo

Il destinatario della richiamata dell'evento ha accesso immediato all'elenco delle informazioni sui gruppi di volumi dell'auto interessati. Ciò significa che l'app non ha bisogno di effettuare ulteriori chiamate al framework Car audio per ottenere lo stato più recente. Può semplicemente utilizzare le CarVolumeGroupInfos ricevute to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of EventTypes`, come spiegato di seguito.

Tipi di eventi

Definisce quale aspetto di CarVolumeGroupInfo è cambiato. Le app possono utilizzarlo per identificare le modifiche e intraprendere le azioni richieste. Ad esempio, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED indica che l' CarVolumeGroups' maximum volume gain index has changed and can be queried by CarVolumeGroupInfo.getMaxVolumeGainIndex()`.

La tabella seguente mostra la relazione tra EventType e CarVolumeGroupInfo .

Tipo di evento 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.isAttenuato()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

Informazioni extra

Fornisce informazioni aggiuntive sul motivo per cui CarVolumeGroup è cambiato. Le app possono usare queste informazioni per fornire 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 alcun processo per ExtraInfos . È a tua discrezione determinare il processo in base a 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 possono scegliere di mostrare un brindisi che indica che il ducking è attivo e consentire all'utente di modificare il volume.

La struttura dell'audio dell'auto dipende dall'HAL AudioControl IAudioGainCallback per fornire le ExtraInfos suggerite. Per ulteriori informazioni, consulta Richiamata guadagno audio .

CarVolumeGroupEvent è scalabile per soddisfare le esigenze future del framework audio per 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 le modifiche.

Richiamata evento gruppo volume auto

Android 14 fornisce una nuova richiamata per le app privilegiate e della piattaforma per registrarsi ed essere informati di CarVolumeGroupEvents .

  • Per registrarsi per la richiamata, utilizzare CarAudioManager#registerCarVolumeGroupEventCallback()

  • Per annullare la registrazione della richiamata, utilizzare CarAudioManager#unregisterCarVolumeGroupEventCallback()

Se un'app si registra con il nuovo CarVolumeGroupEventCallback e il CarVolumeCallback legacy, viene data la priorità all'evento CarVolumeGroupEventCallbacks . Lo stack audio dell'auto non attiva più CarVolumeCallback . Ciò impedisce attivazioni duplicate sulla stessa app per lo stesso evento.

Ti consigliamo vivamente di utilizzare CarVolumeGroupEventCallback per gestire il volume del gruppo e disattivare le modifiche.

Richiamata del guadagno audio

A partire da Android 13, AudioControl HAL può attivare una richiamata asincrona per gestire gli aggiornamenti del livello del volume dovuti a modifiche al sistema audio dell'auto.

API HAL

Controllo audio @2.0 AIDL

La versione 2.0 di AudioControl AIDL HAL aggiunge la seguente API:

API Scopo
IAudioControl#registerGainCallback Registra un'istanza di IAudioGainCallback con l'HAL AudioControl.
IAudioGainCallback#onAudioDeviceGainsChanged Richiamata asincrona per notificare le modifiche alla configurazione del guadagno audio.

La richiamata HAL AudioControl include elenchi di motivi e il rispettivo AudioGainConfigInfo , che consiste in:

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

Le ragioni possono essere classificate a grandi linee come:

  • Motivi di restrizione. Modifica temporanea del volume e del comportamento silenzioso.
  • Aggiorna motivi. Modifica permanente del comportamento del volume.

Tipi di restrizione

A partire da AudioControl HAL AIDL V3 , i seguenti sono i tipi di restrizioni supportate:

  • Muto
  • Blocco
  • Limitazione
  • Attenuazione
Restrizione attiva Modifica del volume attivata dall'utente Attiva/disattiva l'audio attivato dall'utente
Muto ❌ (attiva l'audio)

✔ (muto)
Blocco
Limitazione ❌ (oltre il limite)

✔ (sotto il limite)
Attenuazione

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

Restrizioni silenziose

Le restrizioni sulla disattivazione dell'audio sono:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

La struttura audio dell'auto mantiene internamente questi due stati muti:

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

  • HAL disattivato. Attivato/disattivato in base alle restrizioni di disattivazione ricevute tramite la richiamata AudioGain .

Per gli ascoltatori come l'app Impostazioni, lo stato di disattivazione generale del gruppo di volumi ( CarVolumeGroupInfo.isMuted() ) si baserà sul fatto che una delle disattivazioni di cui sopra sia abilitata.

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

Caso di interazione: la disattivazione dell'HAL è attiva e le richieste dell'utente per la disattivazione vengono attivate/disattivate

Quando la disattivazione dell'audio dell'HAL è abilitata e la disattivazione dell'audio dell'utente è disabilitata:

  • Lo stato di silenziamento generale del gruppo di volumi viene modificato in true .
  • Le richieste dell'utente per abilitare la disattivazione verranno elaborate.
    • Motivo: le richieste di disattivazione dell'utente devono essere rispettate in ogni momento per preservare la privacy degli utenti.

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

  • Lo stato di silenziamento generale del gruppo di volumi viene modificato in true .

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

    • Motivo: le richieste di attivazione dell'audio dell'utente verranno soddisfatte solo se non sono attive restrizioni.

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

Caso di interazione: HAL Mute è abilitato e disabilitato mentre il mute dell'utente non presenta modifiche

La disattivazione dell'audio dell'HAL modificherà lo stato di disattivazione generale del gruppo di volumi. Tuttavia, non aggiorna direttamente lo stato di disattivazione dell'utente. Quando la disattivazione dell'audio dell'utente è disabilitata e viene ricevuta la richiamata della disattivazione dell'audio dell'HAL per l'attivazione:

  • Lo stato di silenziamento generale del gruppo di volumi viene modificato in true .
  • Le richieste da parte dell'utente di modificare il volume NOT verranno elaborate mentre è abilitata la disattivazione dell'HAL.

    • Motivo: l'utente non può percepire il suono mentre la disattivazione dell'audio è attivata. Consentire la modifica del volume può provocare un'esplosione sonora e mettere in pericolo la sicurezza dell'utente.

    • Motivo: le app del volume possono registrarsi per le richiamate e attivare automaticamente l'attivazione dell'audio (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) senza l'intervento dell'utente, se questo è il comportamento previsto dall'OEM.

Quando l'audio HAL è disabilitato mentre l'audio utente è disabilitato:

  • Lo stato di disattivazione dell'audio del gruppo di volumi viene modificato in false .

    Motivo: rendere permanente lo stato di disattivazione e richiedere all'utente di riattivare l'audio potrebbe interrompere inutilmente l'utente quando gli stati di disattivazione si alternano frequentemente.

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

Blocco

Le restrizioni di blocco sono:

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

Quando le restrizioni di blocco sono attive, le richieste degli utenti a:

  • Il volume delle modifiche non verrà elaborato.
  • L'attivazione/disattivazione dell'audio viene elaborata.

Limitazione

Le restrizioni di limitazione sono:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Quando le restrizioni di limitazione sono attive, le richieste degli utenti a:

  • Modifica volume:

    • Entro i limiti vengono elaborati
    • Oltre i limiti non vengono elaborati
  • L'attivazione/disattivazione dell'audio viene elaborata.

Attenuazione

Le restrizioni sull'attenuazione sono:

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

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

  • Il volume delle modifiche viene elaborato. Il nuovo livello di volume attuale viene impostato sul volume attenuato (invece che sul volume precedente). Le future modifiche al volume verranno apportate da questo livello.

  • L'attivazione/disattivazione dell'audio viene elaborata.

Aggiorna all'indice

Quanto segue è considerato come aggiornamento dell'indice del volume asincrono: Reasons.EXTERNAL_AMP_VOL_FEEDBACK .

Per 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 alle 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 modificare l'indice del volume su 30.

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

  • Le implementazioni del fornitore di Audio 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 del fornitore dei trigger AudioControl HAL :

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Il servizio audio per auto utilizza il nuovo indice dalla richiamata utilizzata per la persistenza e le richiamate all'app del volume. L'indice richiesto dall'utente è 30. Tuttavia, il feedback asincrono 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 alto pari a 95 (intervallo: [0-99]).

  • Android entra in sospensione.

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

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

    • AudioControl HAL del fornitore attiva anche la richiamata 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 propri callback all'app del 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 del volume dinamico

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

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

    • Le case automobilistiche preferiscono aggiornare le configurazioni del volume all'EOL in base alla configurazione del sistema 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 servizio.

  2. Configurazione in fase di esecuzione. I sistemi audio automobilistici supportano configurazioni di amplificatori esterni e queste ECU possono ospitare le configurazioni della gamma di volume richieste durante la fase di avvio.

  3. Configurazione su richiesta. Offerto per supportare la crescente necessità di funzionalità audio basate sulla domanda in cui gli utenti si abbonano all'elaborazione avanzata del segnale per un periodo di tempo. Le nuove configurazioni dell'intervallo di volume sono valide per tutta la durata dell'abbonamento.

Progetto

La configurazione dinamica del volume si ottiene 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 scoperto, viene generato un callback tramite AudioControl::IModuleChangeCallback .

  • Aggiornamento. Lo stack audio dell'auto aggiorna gli stati dei gruppi 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 supera i limiti, l'indice del volume corrente viene impostato su un valore sicuro. Ad esempio, il livello predefinito fornito dal fornitore durante la richiamata.

  • Richiamare.

    • Dopo gli aggiornamenti dell'intervallo del gruppo di volume, lo stack audio dell'auto attiva una richiamata alle app registrate tramite CarVolumeGroupEventCallback .

    • CarVolumeGroupEvent contiene CarVolumeGroupInfo aggiornato, tipo di evento (cosa è cambiato) e informazioni extra (perché è cambiato).

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
IAudioControl#setModuleChangeCallback Imposta un'istanza di IModuleChangeCallback con AudioControl HAL.
IAudioControl#clearModuleChangeCallback Cancella l'istanza di IModuleChangeCallback precedentemente impostata con l'HAL AudioControl.
IModuleChangeCallback#onAudioPortsChanged Richiamata per notificare le modifiche a AudioPorts

Sequenza

Di seguito viene visualizzato 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à, considerare quanto segue.

  • Le porte audio fornite come parte della richiamata devono corrispondere alla definizione del BUS automobilistico:

    • 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 di intervallo di volume nella policy HAL audio e utilizzare il callback per personalizzarlo per le varianti del veicolo. Per ulteriori informazioni, vedere la definizione AIDL IModuleChangeCallbac .

  • Quando più di un BUS audio appartiene allo stesso gruppo di volumi, ciascuno deve avere definizioni di range di volume identiche. In caso contrario, la struttura dell'audio dell'auto rifiuta la nuova definizione della gamma di volume.