Gestione dei volumi

AAOS ha una propria gestione del volume all'interno di CarAudioService. Utilizza livelli di volume fissi con l'aspettativa che i livelli di volume debbano essere applicati sotto l'HAL da un amplificatore hardware anziché in software. Inoltre, organizza i dispositivi di output in gruppi di volume per applicare gli stessi guadagni a tutti i dispositivi associati al gruppo di volume.

Utilizzo di volumi fissi

Le implementazioni di AAOS devono controllare il volume utilizzando un amplificatore hardware anziché un mixer software. Per evitare effetti collaterali, imposta il flag config_useFixedVolume su true (sovrapposizione come necessario):

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

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

Gruppi di volume

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

Esempio di implementazione di car_audio_configuration.xml.

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

Configurare i guadagni del gruppo di volumi

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

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

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

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

A causa del modo in cui questi valori sono configurati, è 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 il dispositivo il guadagno verrà impostato sul valore minimo o massimo del guadagno del dispositivo in base al fatto che il valore del gruppo di volumi sia inferiore o superiore all'intervallo.

Identificatori dei gruppi di volumi

I gruppi di volumi vengono identificati in fase di esecuzione in base all'ordine di definizione 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 riceve un groupId senza un zoneId utilizzerà per impostazione predefinita la zona audio principale.

Gestione dei volumi multizona

Ogni zona audio dovrebbe avere uno o più gruppi di volume e ogni gruppo di volume è associato solo a una singola zona audio. Questa relazione è definita nell'ambito di car_audio_configuration.xml. Consulta l'esempio fornito in Definire i gruppi di volumi sopra.

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

Gestione degli eventi dei tasti del volume

Android definisce diversi codici a tasti per il controllo del volume, tra cui KEYCODE_VOLUME_UP, KEYCODE_VOLUME_DOWN e KEYCODE_VOLUME_MUTE. Per impostazione predefinita, Android inoltra gli eventi dei pulsanti del volume alle applicazioni. Le implementazioni per i veicoli devono forzare questi eventi chiave su CarAudioService, che può quindi chiamare setGroupVolume o setMasterMute a seconda dei casi.

Per forzare questo comportamento, imposta il flag config_handleVolumeKeysInWindowManager su true:

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

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

Dissolvenza e bilanciamento

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

Le API AudioControl sono:

  • setBalanceTowardRight(float value). Regola il volume degli altoparlanti verso il lato destro (+) o sinistro (-) dell'auto. 0,0 è al centro, +1,0 è completamente a destra, -1,0 è completamente a sinistra e un valore al di fuori dell'intervallo da -1 a 1 è un errore.
  • setFadeTowardFront(float value): regola il volume degli altoparlanti verso la parte anteriore (+) o posteriore (-) dell'auto. 0,0 è al centro, +1,0 è completamente in avanti, -1,0 è completamente all'indietro e un valore al di fuori dell'intervallo da -1 a 1 è un errore.

Spetta agli OEM decidere come applicare questi valori e come verranno mostrati agli utenti. Potrebbero essere applicati esclusivamente ai contenuti multimediali o a tutti i suoni di Android.

Android 11 ha anche introdotto il supporto per l'applicazione di effetti audio ai dispositivi di output. In questo modo, è possibile gestire in alternativa l'attenuazione e il bilanciamento tramite effetti audio sui dispositivi di output appropriati anziché tramite queste API.

Attenuazione automatica audio

L'attenuazione automatica dell'audio si verifica quando il veicolo riduce il guadagno di uno stream per ascoltare più chiaramente un altro stream riprodotto contemporaneamente. In AAOS, l'attenuazione audio è lasciata all'implementazione dell'HAL in quanto esistono potenzialmente molti suoni al di fuori di Android su cui il sistema operativo non ha alcun controllo. In Android 11, le informazioni principali disponibili per l'HAL per prendere decisioni di attenuazione sono se entrambi i dispositivi di output hanno stream attivi.

Quando abbassarsi

Spetta al singolo OEM determinare in che modo la funzionalità di riduzione del volume verrà gestita dal proprio HAL, ma esistono alcune linee guida generali che consigliamo di seguire. La riproduzione di più stream in Android si verifica più di frequente quando due app/servizi hanno contemporaneamente il controllo audio. Tenendo presente questo, consulta la matrice di interazione per scoprire quando Android può concedere lo stato attivo contemporaneamente e, di conseguenza, quando è possibile riprodurre contemporaneamente due stream diversi.

Tieni presente che tutti gli stream combinati da Android lo saranno prima dell'applicazione degli utili. Di conseguenza, qualsiasi stream che deve essere attenuato quando viene riprodotto contemporaneamente con un altro deve essere indirizzato a dispositivi di output separati in modo che l'HAL possa applicare l'attenuazione prima di mescolare i due stream.

Comportamento consigliato per l'attenuazione

Di seguito sono riportate potenziali interazioni simultanee in cui consigliamo di applicare la funzionalità di attenuazione:

  • EMERGENCY. Riduci l'audio o disattivalo del tutto tranne per SAFETY per assicurarti che il conducente senta l'audio
  • SAFETY. Disattiva tutto tranne EMERGENCY per assicurarti che il conducente senta l'audio
  • NAVIGATION. Evita tutto tranne SAFETY e EMERGENCY
  • CALL. Evita tutto tranne SAFETY, EMERGENCY e NAVIGATION
  • VOICE. Anatra CALL_RING
  • Spetta agli OEM determinare l'importanza dell'VEHICLE_SOUNDS attivo e se devono o meno attenuare altri suoni per assicurarsi che il conducente li senta.
  • MUSIC e ANNOUNCEMENT devono essere ignorati da tutto. L'eccezione principale sono i suoni di interazione tocco che attualmente vengono riprodotti come SYSTEM_SOUND

Altre considerazioni per l'uso della funzionalità Bassi attenuati

Alcune app/servizi, come la navigazione o l'assistente, potrebbero utilizzare più giocatori per completare le loro azioni. Gli OEM devono evitare di annullare l'attenuazione troppo aggressivamente in base al momento in cui i dati dello stream non vengono più inviati tramite questi dispositivi di output per assicurarsi che i contenuti multimediali non tornino temporaneamente al volume massimo prima di essere nuovamente attenuati all'inizio della riproduzione successiva dall'app di navigazione o dall'assistente.

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

Suoni di sicurezza critici

Sebbene Android 11 abbia introdotto API HAL per l'attenzione audio, è ancora compito dell'HAL garantire che i suoni critici per la sicurezza abbiano la priorità rispetto agli altri. Anche se l'HAL detiene l'attenzione audio per USAGE_EMERGENCY, non garantisce che le app e i servizi in Android non riprodurranno suoni. Spetta all'HAL determinare quali stream di Android devono essere miscelati o disattivati durante la riproduzione di suoni critici per la sicurezza.

Configurazione dell'interfaccia utente delle impostazioni del volume

AAOS disaccoppia l'interfaccia utente delle impostazioni del volume dalla configurazione del gruppo di volumi (che può essere sovrapposta come descritto in Configurazione dei gruppi di volumi). Questa separazione garantisce che non siano necessarie modifiche se la configurazione dei gruppi di volumi cambia in futuro.

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

Ad esempio, l'esempio seguente definisce un gruppo di volumi che include sia voice_communication che 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 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 devono essere disegnati.
  • getGroupMinVolume() e getGroupMaxVolume() per ottenere i limiti inferiore e superiore.
  • getGroupVolume() per ottenere il volume attuale.
  • registerVolumeChangeObserver() per ricevere una notifica in caso di variazioni del volume.