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 tranneSAFETY
per assicurati che il conducente senta il suonoSAFETY
. Annulla tutto tranneEMERGENCY
per assicurarti il conducente sente il suonoNAVIGATION
. Nascondi tutti gli elementi tranneSAFETY
eEMERGENCY
CALL
. Nascondi tutto tranneSAFETY
,EMERGENCY
eNAVIGATION
VOICE
. AnatraCALL_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
eANNOUNCEMENT
dovrebbero essere nascosti da tutto. L'eccezione principale sono i toni di interazione tocco, che al momento vengono riprodotti comeSYSTEM_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()
egetGroupMaxVolume()
per ottenere i limiti inferiore e superiore.getGroupVolume()
per regolare il volume attuale.registerVolumeChangeObserver()
per ricevere notifiche sulle variazioni di volume.