Gestione del volume

AAOS gestisce i volumi all'interno di CarAudioService. Utilizza i valori fissi volumi con l'aspettativa che i volumi vengano applicati al di sotto dell'HAL da un piuttosto che nel software. Inoltre, organizza 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 devono controllare il volume utilizzando un amplificatore hardware anziché il software mixer. 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 applicazioni possono chiamare AudioManager.setStreamVolume() e modificare volume per tipo di stream nel mixer del software. Ciò potrebbe essere indesiderato a causa l'effetto potenziale su altre applicazioni e il fatto che l'attenuazione del volume il mixer software riduce il numero di bit significativi disponibili nel segnale quando ricevuto dall'amplificatore hardware.

Gruppi di volumi

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

Definizione dei 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>

Esempio di implementazione di car_audio_configuration.xml.

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

Configurazione dei guadagni del gruppo di volume

Ogni gruppo di volumi ha valori di guadagno minimo, massimo e predefiniti, nonché dimensione del passo. Vengono determinati in base ai valori configurati in audio_policy_configuration.xml per i dispositivi associati con il 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 componenti associati dispositivi e configura il gruppo nel seguente modo:

  • 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

A causa del modo in cui questi valori sono configurati, è possibile impostare il guadagno di un un gruppo di volume al di fuori dell'intervallo supportato per un dispositivo associato al gruppo di volume. In questo caso, per quel dispositivo il guadagno verrà impostato al valore minimo o massimo del dispositivo. il valore di guadagno in base al fatto che il valore del gruppo di volume sia inferiore o superiore all'intervallo.

Identificatori di gruppi di volumi

I gruppi di volumi sono identificati in fase di runtime in base al loro ordine di definizione 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 volumi in quella zona. In questo modo, gli ID gruppo di volume non sono univoci tra le zone. Questi identificatori vengono utilizzate per le API CarAudioManager associate ai gruppi di volume. Qualsiasi API che accetta un groupId senza un zoneId verrà utilizzato per impostazione predefinita il nella 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 car_audio_configuration.xml. Vedi l'esempio fornito in Definizione dei gruppi di volumi qui sopra.

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

Gestione degli eventi chiave del volume

Android definisce diversi codici chiave per il controllo del volume, tra cui: KEYCODE_VOLUME_UP, KEYCODE_VOLUME_DOWN e KEYCODE_VOLUME_MUTE. Per impostazione predefinita, Android instrada il tasto del volume e i relativi eventi alle applicazioni. Le implementazioni automobilistiche dovrebbero forzare questi eventi chiave a CarAudioService, che potrà quindi chiamare setGroupVolume o setMasterMute a seconda dei casi.

Per forzare questo comportamento, imposta config_handleVolumeKeysInWindowManager flag per true:

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

Al momento, gli eventi chiave del volume non sono in grado di distinguere la zona in cui si trovano che, in quanto tale, sono tutti associati alla zona audio principale. Quando viene ricevuto un evento tasto del volume, CarAudioService determina quale volume per regolare il gruppo recuperando i contesti audio per i giocatori attivi e poi modificando il gruppo di volumi che contiene il dispositivo di output associato con la priorità più alta contesto audio. L'assegnazione delle 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 in entrata del veicolo. Esistono API di sistema corrispondenti per CarAudioManager che trasmettono valori fino 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 sul lato destro (+) o sinistro (-) dell'auto. 0,0 è centrato, +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): sposta il volume dell'altoparlante verso la parte anteriore (+) o posteriore (-) dell'auto. 0,0 è centrato, +1,0 è completamente 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 in che modo verranno mostrate agli utenti. Potrebbero essere applicate rigorosamente ai media o in tutta la per tutti i suoni Android.

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

Attenuazione automatica audio

La attenuazione automatica audio si verifica quando il veicolo riduce il guadagno per uno stream in modo che si possa sentire più chiaramente un altro stream riprodotto contemporaneamente. In AAOS, l'attenuazione automatica audio viene lasciata all'HAL da implementare, in quanto potenzialmente ci sono molti suoni al di fuori di Android, su cui il sistema operativo non ha alcun controllo. In Android 11, le informazioni principali disponibile per l'HAL per prendere decisioni in merito al attenuazione automatica, è se due dispositivi di output devono di stream attivi.

Quando anatra

Sebbene sia compito del singolo OEM stabilire come verrà gestito l'attenuazione automatica da parte dell'HAL, puoi seguire alcune linee guida generali. Più stream riprodotti in Android si verifica più comunemente quando due app/servizi contengono l'audio attivo contemporaneamente. Di conseguenza, consulta Matrice di interazione per sapere quando Android può concedere lo stato attivo in contemporanea e, quindi, quando è possibile diversi stream da riprodurre contemporaneamente.

Ricorda che gli stream combinati da Android verranno effettuati prima di eventuali guadagni. in fase di applicazione. Pertanto, tutti gli stream che devono essere oscurati quando riprodotti contemporaneamente un'altra deve essere indirizzata a dispositivi di uscita separati affinché l'HAL possa applicare l'attenuazione automatica prima del a mescolarli.

Comportamento consigliato per diminuire il tasso di attenuazione

Di seguito sono riportate le potenziali interazioni simultanee per le quali consigliamo l'attenuazione automatica da applicare:

  • EMERGENCY. Annulla o disattiva l'audio di tutti i contenuti tranne SAFETY per assicurati che il conducente senta il suono
  • SAFETY. Annulla tutto tranne EMERGENCY per assicurarti il conducente sente il suono
  • NAVIGATION. Nascondi tutti gli elementi tranne SAFETY e EMERGENCY
  • CALL. Nascondi tutto tranne SAFETY, EMERGENCY e NAVIGATION
  • VOICE. Anatra CALL_RING
  • Spetta agli OEM stabilire l'importanza di un VEHICLE_SOUNDS attivo e se devono attenuare gli altri suoni per assicurarsi che il conducente li senta.
  • MUSIC e ANNOUNCEMENT dovrebbero essere nascosti da tutto. L'eccezione principale sono i toni di interazione tocco, che al momento vengono riprodotti come SYSTEM_SOUND

Altre considerazioni relative all'attenuazione automatica

Per il completamento di alcuni servizi/app, come la navigazione o l'assistente, potrebbero essere utilizzati più giocatori le loro azioni. Gli OEM dovrebbero evitare di rimuovere la base in modo troppo aggressivo in base al momento in cui i dati dello stream vengono interrotti provenienti da questi dispositivi di output per garantire che l'utente non riceva per un momento al volume massimo prima di essere abbassato di nuovo alla riproduzione successiva dalla navigazione o viene avviata l'app dell'assistente.

Per i veicoli con più palcoscenici e un buon isolamento, c'è anche la possibilità per indirizzare l'audio a diverse aree dell'auto anziché ridurre il rumore di fondo. Ad esempio, la navigazione le istruzioni possono essere indirizzate agli altoparlanti del poggiatesta del conducente mentre la musica continua riproduci per tutta l'abitacolo a un volume normale.

Suoni critici per la sicurezza

Mentre Android 11 ha introdotto API HAL audio focus, spetta ancora all'HAL garantire che i suoni critici per la sicurezza abbiano la priorità rispetto altri. Anche se l'HAL contiene il focus audio per USAGE_EMERGENCY, ciò non garantire che le app e i servizi in Android non riproducono suoni. L'HAL spetta all'HAL Determina quali stream da Android devono essere mixati o disattivati perché i suoni critici per la sicurezza riprodotto.

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ò sovrapposto come descritto in Configurazione dei gruppi di volumi). Questa separazione garantisce che sono necessarie modifiche se la configurazione dei gruppi di volume cambia in futuro.

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 ciascuno AudioAttributes.USAGE. Questo file consente un rendering ragionevole VolumeGroups definito utilizzando le risorse associate al primo utilizzo riconosciuto contenuto in ogni VolumeGroup.

Ad esempio, l'esempio seguente definisce un VolumeGroup che include entrambi voice_communication e voice_communication_signalling. Il valore predefinito dell'implementazione della UI delle impostazioni dell'auto, il VolumeGroup viene visualizzato utilizzando le risorse con voice_communication, che è il primo 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. Le impostazioni del volume La UI utilizza le seguenti API CarAudioManager basate su VolumeGroup:

  • getVolumeGroupCount() per sapere 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.