Gestione del volume,Gestione del volume

AAOS dispone di una propria gestione del volume all'interno di CarAudioService . Utilizza volumi fissi con la previsione che i volumi vengano applicati al di sotto dell'HAL da un amplificatore hardware anziché dal software. Organizza inoltre i dispositivi di output in gruppi di volumi per applicare gli stessi guadagni a tutti i dispositivi associati al gruppo di volumi.

Utilizzo di volumi fissi

Le implementazioni AAOS dovrebbero controllare il volume utilizzando un amplificatore hardware anziché 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 applicazioni possono chiamare AudioManager.setStreamVolume() e modificare il volume in base al tipo di flusso nel mixer software. Ciò potrebbe essere indesiderabile a causa del potenziale effetto su altre applicazioni e del fatto che l'attenuazione del volume nel mixer software risulta in 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 e i guadagni risultanti sono 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.

Definizione dei 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 car_audio_configuration.xml .

Ciascun gruppo di volumi dovrebbe contenere uno o più dispositivi di output con indirizzi associati. Questi indirizzi dovrebbero corrispondere ai dispositivi di output definiti in audio_policy_configuration.xml .

Configurazione dei guadagni del gruppo di volumi

Ogni gruppo di volume ha valori di guadagno minimo, massimo e predefinito, nonché una dimensione del passo. 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 controllerà i valori di guadagno dei dispositivi associati e configurerà 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

A causa del 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 verrà 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 in base al loro 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 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 un zoneId verrà impostata automaticamente sulla 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 . Consultate l'esempio fornito in Definizione dei gruppi di volumi sopra.

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 a 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 saranno diversi da quelli quelli per la zona secondaria.

Gestione degli eventi relativi ai tasti del volume

Android definisce diversi codici chiave per il controllo del volume, inclusi KEYCODE_VOLUME_UP , KEYCODE_VOLUME_DOWN e KEYCODE_VOLUME_MUTE . Per impostazione predefinita, Android indirizza gli eventi dei tasti del volume alle applicazioni. Le implementazioni automobilistiche dovrebbero forzare questi eventi chiave a 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>

Gli eventi relativi ai tasti del volume attualmente non hanno modo di distinguere a quale zona sono destinati e come tali 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. Esistono API di sistema corrispondenti per CarAudioManager che trasmettono 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 e un valore esterno all'intervallo da -1 a 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 all'indietro e un valore esterno all'intervallo da -1 a 1 è un errore.

Spetta agli OEM decidere come applicare questi valori e come verranno presentati 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 sia possibile ascoltare più chiaramente un altro flusso riprodotto contemporaneamente. In AAOS, l'implementazione dell'audio ducking è lasciata all'HAL poiché potenzialmente sono presenti molti suoni al di fuori di Android su cui il sistema operativo non ha alcun controllo. In Android 11, l'informazione principale a disposizione dell'HAL per prendere decisioni di ducking è se due dispositivi di output hanno entrambi flussi attivi.

Quando abbassarsi

Sebbene spetti al singolo OEM determinare come verrà gestito il ducking dal proprio HAL, esistono alcune linee guida generali che consigliamo. Più flussi riprodotti in Android si verificano più comunemente quando due app/servizi mantengono contemporaneamente il focus audio. Tenendo questo in mente, vedi Matrice di interazione per sapere quando Android può garantire il focus simultaneo e, pertanto, quando è possibile riprodurre contemporaneamente due flussi diversi.

Tieni presente che tutti gli stream mescolati insieme da Android verranno 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 mescolarli insieme.

Comportamento di ducking consigliato

Di seguito sono riportate le potenziali interazioni simultanee in cui consigliamo di applicare il ducking:

  • EMERGENCY . Abbassa o silenzia tutto tranne SAFETY per assicurarti che il conducente senta il suono
  • SAFETY . Abbassa tutto tranne EMERGENCY per assicurarti che l'autista senta il suono
  • NAVIGATION . Abbassa tutto tranne SAFETY ed EMERGENCY
  • CALL . Abbassa tutto tranne SAFETY , EMERGENCY e NAVIGATION
  • VOICE . Anatra CALL_RING
  • Spetta agli OEM determinare l'importanza dei VEHICLE_SOUNDS attivi e se debbano o meno evitare altri suoni per assicurarsi che il conducente li senta.
  • MUSIC e ANNOUNCEMENT dovrebbero essere evitati da tutto. La principale eccezione a ciò sono i toni di interazione touch che attualmente vengono riprodotti come SYSTEM_SOUND

Altre considerazioni quando ci si abbassa

Alcune app/servizi come la navigazione o l'assistente potrebbero utilizzare più lettori per completare le proprie azioni. Gli OEM dovrebbero evitare di eseguire l'unducking in modo troppo aggressivo in base a quando i dati del flusso smettono di passare attraverso questi dispositivi di output per garantire che l'utente non ritorni momentaneamente il contenuto multimediale al volume massimo prima di essere abbassato nuovamente all'inizio della riproduzione successiva dall'app di navigazione o dall'assistente.

Per i veicoli con più palcoscenici sonori con un isolamento sufficientemente buono, c'è anche la possibilità di instradare l'audio in diverse aree dell'auto anziché abbassarsi. Ad esempio, le istruzioni di navigazione potrebbero essere indirizzate agli altoparlanti sul poggiatesta del conducente mentre la musica continua ad essere riprodotta in tutto l'abitacolo a un volume normale.

Suoni critici per la sicurezza

Anche se Android 11 ha introdotto le API HAL per la messa a fuoco audio , spetta ancora all'HAL garantire che i suoni critici per la sicurezza abbiano la priorità rispetto ad altri. Anche se l'HAL mantiene il focus audio per USAGE_EMERGENCY , ciò non garantisce che le app e i servizi in Android non riproducano suoni. Spetta all'HAL determinare quali flussi da Android devono essere mixati o disattivati ​​mentre vengono riprodotti 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 dell'auto, il file packages/apps/Car/Settings/res/xml/car_volume_items.xml contiene 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 sia voice_communication che voice_communication_signalling . L'implementazione predefinita dell'interfaccia utente delle impostazioni dell'auto esegue il rendering del VolumeGroup utilizzando le risorse associate a voice_communication poiché è 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 dovrebbero essere disegnati.
  • getGroupMinVolume() e getGroupMaxVolume() per ottenere i limiti inferiore e superiore.
  • getGroupVolume() per ottenere il volume corrente.
  • registerVolumeChangeObserver() per ricevere notifiche sulle modifiche del volume.