La gestione dei volumi è contenuta in CarAudioService
, che utilizza volumi fissi
con l'aspettativa 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 del software. 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 app possono chiamare AudioManager.setStreamVolume()
per modificare il volume per tipo di
stream nel software mixer. Ciò potrebbe non essere sempre auspicabile per via dei potenziali effetti su altre app e del fatto che l'attenuazione del volume nel software mixer possa ridurre il numero di bit significativi disponibili nel segnale quando 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 ogni gruppo di volumi, il volume può essere controllato in modo indipendente. I vantaggi risultanti vengono configurati sui dispositivi associati in modo che vengano applicati dall'amplificatore del veicolo. Le impostazioni del volume sono persistenti per l'utente e vengono caricate quando l'utente accede.
Definisci 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>
Ogni gruppo di volumi deve 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 volume 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 volume.
<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 volume controlla i valori di guadagno dei dispositivi associati e configura il gruppo come segue:
- 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.
Dato il modo in cui questi valori sono configurati, è possibile impostare il guadagno di un gruppo di volume al di fuori dell'intervallo supportato per un dispositivo associato al gruppo di volumi. In questo caso, per quel dispositivo il guadagno viene 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 di gruppi di volumi
I gruppi di volumi vengono identificati in fase di runtime nell'ordine definito 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 volume in quella zona. In questo modo, gli ID gruppo di volume non sono
univoci nelle varie zone. Questi identificatori vengono utilizzati per le API CarAudioManager
associate ai gruppi di volume. Qualsiasi API che accetta un groupId
senza zoneId
viene impostata sulla 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 di car_audio_configuration.xml
. Per ulteriori informazioni, vedi l'esempio precedente in Definire i gruppi di volumi.
I livelli di volume attuali per ciascuna zona sono persistenti per l'utente associato a quella zona. Queste impostazioni sono specifiche per la zona, vale a dire che se un utente accede a un display associato alla zona principale per poi accedere a una zona associata a una zona audio secondaria, i livelli di volume caricati e persistenti per la prima zona sono diversi da quelli della zona secondaria.
Gestire gli eventi dei 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 instrada gli eventi dei tasti del volume alle app. Le implementazioni
del settore auto e motori dovrebbero forzare l'elaborazione di questi eventi chiave entro il giorno
CarAudioService
, che quindi chiama setGroupVolume
o setMasterMute
, a seconda
del caso. Per forzare questo comportamento, imposta il flag
config_handleVolumeKeysInWindowManager
su true
:
<resources>
<bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>
Al momento, gli eventi chiave del volume non possono distinguere la zona a cui sono destinati e si presume siano tutti associati alla zona audio principale. Quando viene ricevuto un evento chiave del volume, CarAudioService
stabilisce quale gruppo di volume regolare recuperando i contesti audio per i player attivi e regolando il gruppo di volume contenente il dispositivo di output associato al contesto audio con priorità più elevata. L'assegnazione della 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 nel veicolo. Le API di sistema corrispondenti per CarAudioManager passano
i valori 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 il lato destro (+) o sinistro (-) dell'auto.- 0,0 è centrato
- +1,0 è perfettamente corretta
- -1,0 è completamente a sinistra
- Un valore al di fuori dell'intervallo da -1 a 1 è un errore
setFadeTowardFront(float value)
sposta il volume dello speaker verso la parte anteriore (+) o posteriore (-) dell'auto.- 0,0 è centrato
- +1,0 è completamente avanti
- -1,0 è completamente all'indietro
- Un valore al di fuori dell'intervallo da -1 a 1 è un errore
Sei tu a decidere come applicare questi valori e come mostrarli agli utenti. Possono essere applicate rigorosamente ai contenuti multimediali o 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 il dissolvenza e il bilanciamento attraverso gli effetti audio sui dispositivi di output appropriati, anziché tramite queste API.
Attenuazione automatica audio
Attenuazione automatica audio quando il veicolo riduce il guadagno di uno stream, in modo che un altro stream riprodotto contemporaneamente possa essere udito con maggiore chiarezza. In AAOS, la funzionalità Attenuazione automatica audio è implementata dall'HAL. Android non ha alcun controllo sui suoni oltre il sistema operativo. In Android 11, la principale informazione disponibile per l'HAL per prendere decisioni in merito all'attenuazione automatica è stabilire se due dispositivi di output hanno entrambi stream attivi.
Quando anatra
Anche se spetta al singolo OEM stabilire la modalità di gestione dell'attenuazione automatica da parte dell'HAL, consigliamo di seguire le linee guida riportate di seguito.
Stream multipli in riproduzione su Android di solito si verificano quando due app o servizi contemporaneamente mantengono lo stato attivo dell'audio. Per sapere quando Android può concedere la messa a fuoco simultanea, consulta la matrice di interazione in Tipi di limitazioni. Con l'introduzione del plug-in per l'audio dell'auto, questo dipende anche dalla gestione di AudioFocus.
Tutti gli stream combinati da Android vengono effettuati prima dell'applicazione di eventuali guadagni. Pertanto, tutti gli stream che dovrebbero essere sottoposti a attenuazione automatica quando riprodotti contemporaneamente ad altri devono essere indirizzati a dispositivi di output separati, in modo che l'HAL possa applicare l'attenuazione automatica prima di mixarli.
Comportamento consigliato per diminuire il tasso di attenuazione
Di seguito sono riportate le potenziali interazioni simultanee che si consiglia di ignorare.
Interazione | Azione |
---|---|
EMERGENCY
| Attenua o disattiva l'audio di tutti i contenuti tranne di SAFETY
|
SAFETY |
Attenua tutto tranne EMERGENCY |
NAVIGATION |
Annulla tutti i dati tranne SAFETY e EMERGENCY |
CALL |
Annulla tutti i dati tranne SAFETY , EMERGENCY
e NAVIGATION |
VOICE |
Anatre CALL_RING |
VEHICLE_SOUNDS |
Sei tu a determinare l'importanza del suono attivo e se attenua o meno gli altri suoni. |
MUSIC e ANNOUNCEMENT |
Faccina oscurata da tutto. Le eccezioni sono i toni dell'interazione al tocco riprodotti come SYSTEM_SOUND .
|
Considerazioni sull'attenuazione automatica
Alcuni servizi e app, come la navigazione o un assistente, potrebbero utilizzare più player per eseguire azioni. Evita di annullare in modo aggressivo il flusso di dati quando un flusso di dati interrompe il flusso attraverso i dispositivi di output, per assicurarti che i contenuti multimediali non tornino al volume massimo prima di essere attenuati prima3 della riproduzione successiva dalla navigazione o all'avvio di un'app di assistente.
Per i veicoli con più palcoscenici e un isolamento sufficiente, puoi indirizzare l'audio a diverse aree dell'auto anziché ridurre il rumore. Ad esempio, le istruzioni di navigazione possono essere indirizzate agli altoparlanti del poggiatesta del conducente mentre ascoltare musica per l'intera cabina a un volume normale.
Suoni critici per la sicurezza
Android 11 ha introdotto
le API HAL audio focus. L'HAL garantisce che i suoni critici per la sicurezza abbiano la priorità rispetto ad altri. Se l'HAL mantiene lo stato attivo dell'audio per USAGE_EMERGENCY
, non è garantito che le app e i servizi di Android non riproducono i suoni. L'HAL determina quali stream 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 Configurare i guadagni del gruppo di volume. Questa separazione garantisce che non siano necessarie modifiche in caso di variazione della configurazione dei gruppi di volume.
Nella UI delle impostazioni dell'auto, packages/apps/Car/Settings/res/xml/car_volume_items.xml
contiene gli elementi UI (risorse del titolo e delle icone) associati a ogni
elemento AudioAttributes.USAGE
definito. Questo file fornisce un rendering ragionevole
dell'elemento VolumeGroups
definito utilizzando le risorse associate al primo
utilizzo riconosciuto contenuto in ogni VolumeGroup
.
Ad esempio, nell'esempio seguente viene definito VolumeGroup
che include voice_communication
e voice_communication_signalling
. L'implementazione
predefinita della UI delle impostazioni dell'auto esegue il rendering di VolumeGroup
tramite
le risorse associate a voice_communication
, che è il primo
matc del 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
. La UI delle impostazioni del volume utilizza
le seguenti API CarAudioManager basate su VolumeGroup
:
getVolumeGroupCount()
per scoprire 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.
Evento gruppo volume auto
I casi d'uso relativi ad auto e motori di aggiornamento del volume e attivazione/disattivazione della disattivazione dell'audio hanno elementi di base contestuali che possono definire le azioni di determinate app, ad esempio le impostazioni del volume. Il volume attuale e il callback di disattivazione audio dello stack audio dell'auto forniscono informazioni contestuali limitate. Ad Android 14 viene aggiunto CarVolumeGroupEvent, per rispondere meglio ai casi d'uso del settore auto e motori e Ogni evento comporta tre tipi critici di informazioni:
- Elenco di
CarVolumeGroupInfo
EventTypes
(mappata a bit)- Elenco di
ExtraInfos
Info gruppo volume auto
Il destinatario del callback dell'evento ha accesso immediato all'elenco di informazioni sul gruppo di volume dell'auto interessate. Ciò significa che l'app non deve effettuare
chiamate aggiuntive al framework dell'audio dell'auto per ottenere lo stato più recente. Può
semplicemente utilizzare l'oggetto CarVolumeGroupInfos
ricevuto per aggiornare l'interfaccia utente o
gli stati interni. Per semplificare le app, gli aspetti che sono cambiati in un gruppo di volumi dell'auto
vengono forniti anche in EventTypes
, come spiegato di seguito.
EventType
Definisce quale aspetto di CarVolumeGroupInfo
è stato modificato. Le app possono usarlo per
identificare le modifiche e intraprendere le azioni necessarie. Ad esempio, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
indica che il rispettivo indice di guadagno del volume massimo CarVolumeGroups
è cambiato e può essere interrogato da CarVolumeGroupInfo.getMaxVolumeGainIndex()
.
La seguente tabella mostra la relazione tra EventType
e
CarVolumeGroupInfo
.
Tipo di evento | Info gruppo volume auto |
---|---|
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.isSilentd() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED | CarVolumeGroupInfo.isBlock() |
EVENT_TYPE_ATTENUATION_CHANGED | InfoGruppoCarVolume.èAttenuato() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
Ulteriori informazioni
Fornisce ulteriori informazioni sul motivo per cui CarVolumeGroup
è cambiato. Le app
possono utilizzare queste informazioni per fornire ulteriore contesto per avvisare l'utente
di agire o di inviare una notifica. Ad esempio, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
indica un'attenuazione attiva dei transienti dovuta a un sovraccarico termico. L'app
può informare l'utente se tenta di aumentare il volume.
Non applichiamo alcuna procedura per ExtraInfos
. La procedura viene determinata a tua discrezione in base al criterio 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 potrebbero scegliere di mostrare un toast che indica che l'attenuazione automatica è attiva e consente all'utente di regolare il volume.
Il framework dell'audio dell'auto dipende dall'AudioControl IAudioGainCallback
dell'HAL per
fornire il ExtraInfos
suggerito. Per scoprire di più, consulta la pagina
Callback guadagno audio.
CarVolumeGroupEvent
si adatta alle esigenze future del framework audio dell'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 l'audio delle modifiche.
Callback dell'evento del gruppo del volume dell'auto
Android 14 fornisce un nuovo callback per le app della piattaforma e con privilegi per registrarsi e ricevere notifiche su CarVolumeGroupEvents
.
Per registrarti al callback, usa
CarAudioManager#registerCarVolumeGroupEventCallback()
Per annullare la registrazione del callback, utilizza
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Se un'app viene registrata con la nuova versione CarVolumeGroupEventCallback
e la precedente
CarVolumeCallback
, gli eventi CarVolumeGroupEventCallbacks
hanno la priorità.
Lo stack dell'audio dell'auto non attiva più CarVolumeCallback
. In questo modo si evitano trigger duplicati nella stessa app per lo stesso evento.
Ti consigliamo vivamente di usare CarVolumeGroupEventCallback
per gestire
il volume del gruppo e disattivare l'audio delle modifiche.
Callback guadagno audio
A partire da Android 13, AudioControl HAL può attivare un callback asincrono per gestire gli aggiornamenti del livello di volume a causa di modifiche al sistema audio dell'auto.
API HAL
AudioControl @2.0 AIDL
La versione 2.0 di AudioControl AIDL HAL aggiunge la seguente API:
API | Finalità |
---|---|
IAudioControl#registerGainCallback |
Registra un'istanza di IAudioGainCallback con AudioControl HAL. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Callback asincrono per notificare le modifiche alla configurazione del guadagno audio. |
Il callback AudioControl HAL include elenchi di motivi e il rispettivo
AudioGainConfigInfo
, che comprende:
- ID zona
- Indirizzo della porta del dispositivo
- Indice volume > indice può essere un indice limitato o un indice di aggiornamento.
I motivi possono essere a grandi linee:
- Motivi delle limitazioni. Modifica temporanea del comportamento del volume e dell'audio disattivato.
- Motivi dell'aggiornamento. Modifica permanente del comportamento del volume.
Tipi di restrizioni
A partire dal giorno AudioControl
HAL AIDL
V3
, di seguito sono riportati i tipi di limitazioni supportate:
- Disattiva audio
- Blocco
- Limitazione
- Attenuazione
Limitazione attiva | Variazione del volume attivata dall'utente | Pulsante di attivazione/disattivazione della disattivazione dell'audio attivato dall'utente |
---|---|---|
Disattiva audio | ❌ | ❌ (attivato) ✔ (audio disattivato) |
Blocco | ❌ | ✔ |
Limitazione | ❌ (oltre il limite) ✔ (sotto il limite) |
✔ |
Attenuazione | ✔ | ✔ |
La priorità tra le restrizioni è Disattiva audio > Blocco > Limitazione > Attenuazione.
Limitazioni per la disattivazione dell'audio
Le limitazioni per la disattivazione dell'audio sono:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Il framework audio dell'auto mantiene internamente due stati di disattivazione audio:
Disattivazione dell'utente. Viene attivato/disattivato in base alla richiesta dell'utente, tramite
CarAudioManager
o tramite eventi chiave.Disattiva audio HAL. Opzione attivata in base alle limitazioni di disattivazione dell'audio ricevute tramite il callback
AudioGain
.
Per gli ascoltatori come l'app Impostazioni, lo stato generale di disattivazione dell'audio del gruppo di volume
(CarVolumeGroupInfo.isMuted()
) si baserà sull'attivazione o meno di una delle
disattivazioni sopra indicate.
Quando la disattivazione dell'audio dell'HAL è abilitata, tutte le richieste di variazione del volume in entrata e di riattivazione dell'audio di gruppo vengono ignorate per tutta la durata della limitazione.
Caso di interazione: la disattivazione dell'audio dell'HAL è attiva e l'utente richiede l'opzione di attivazione/disattivazione
Quando è attiva la disattivazione dell'audio dell'HAL e quella dell'utente è disattivata:
- Lo stato di disattivazione generale del gruppo di volume è stato impostato su
true
. - Le richieste dell'utente per l'attivazione dell'audio verranno elaborate.
- Motivo: le richieste di disattivazione dell'audio degli utenti devono essere sempre rispettate per tutelare la loro privacy.
Quando è attiva la disattivazione dell'audio dell'HAL e quella dell'utente è attivata:
Lo stato di disattivazione generale del gruppo di volume è stato impostato su
true
.Le richieste dell'utente per la disattivazione dell'audio verranno
NOT
elaborate. Lo stato di disattivazione dell'audio dell'utente memorizzato nella cache rimane abilitato.Motivo: le richieste di riattivazione dell'audio dell'utente verranno soddisfatte solo se non sono presenti limitazioni attive.
Motivo: la riattivazione dell'audio dell'utente memorizzato nella cache può causare un'esplosione del suono involontaria e mettere a rischio la sicurezza degli utenti. Ciò è particolarmente vero se lo stato di disattivazione dell'audio viene attivato durante i cicli di accensione, il che riduce la consapevolezza da parte degli utenti della percezione del livello sonoro.
Caso di interazione: la disattivazione dell'audio dell'HAL è attivata e disattivata mentre la disattivazione dell'audio dell'utente non ha modifiche
L'attivazione/disattivazione dell'audio dell'HAL modificherà lo stato generale di disattivazione del gruppo di volume. Tuttavia, non aggiorna direttamente lo stato di disattivazione dell'utente. Quando la disattivazione dell'audio dell'utente è disattivata e viene ricevuto il callback di disattivazione dell'audio dell'HAL:
- Lo stato di disattivazione generale del gruppo di volume è stato impostato su
true
. Le richieste dell'utente di modificare il volume verranno
NOT
elaborate mentre è attiva la disattivazione dell'audio dell'HAL.Motivo: l'utente non riesce a percepire il suono mentre la disattivazione dell'audio è attiva. Consentire variazioni di volume può causare un'esplosione sonora e mettere in pericolo la sicurezza degli utenti.
Motivo: le app con volume possono registrarsi per i callback e attivare un avviso di riattivazione (CarAudioManager.setVolumeGroupSilent(...,/* mute=*/ true,..)) automaticamente senza l'intervento dell'utente, se questo è il comportamento previsto dall'OEM.
Quando l'audio dell'HAL è disattivato e l'audio dell'utente è disattivato:
Lo stato di disattivazione audio del gruppo di volume è stato impostato su
false
.Motivo: impostare lo stato di disattivazione dell'audio in modo permanente e richiedere all'utente di riattivarlo potrebbero interrompere inutilmente l'utente quando gli stati di disattivazione dell'audio sono frequenti.
Le richieste di modifica del volume degli utenti verranno elaborate normalmente.
Blocco
Le limitazioni di blocco sono:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Quando le limitazioni di blocco sono attive, le richieste degli utenti a:
- Le variazioni di volume non vengono elaborate.
- L'opzione Attiva/disattiva audio viene elaborata.
Limitazione
I limiti alle limitazioni sono:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Quando le limitazioni delle limitazioni sono attive, le richieste degli utenti a:
Per regolare il volume:
- Entro la limitazione vengono elaborati
- Oltre i limiti non vengono elaborati
L'opzione Attiva/disattiva audio viene elaborata.
Attenuazione
I limiti di attenuazione sono:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Quando le limitazioni di attenuazione sono attive, le richieste degli utenti a:
Le variazioni di volume vengono elaborate. Il nuovo livello di volume attuale è impostato sul volume attenuato (anziché sul volume precedente). Le modifiche al volume future vengono apportate a questo livello.
L'opzione Attiva/disattiva audio è stata elaborata.
Aggiorna all'indice
Il seguente è considerato come aggiornamento asincrono dell'indice del volume:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Per questo motivo, AudioControl HAL può aggiornare l'indice attuale del gruppo di volume
all'indice specificato. Viene utilizzato principalmente come feedback dal sistema audio per la richiesta di variazione del volume dal framework audio dell'auto. L'aggiornamento dell'indice
viene comunicato anche con le app come callback CarVolumeGroupEvent
per sincronizzare
l'indice.
Esempi
Caso d'uso: l'utente aggiorna l'indice del volume a 30
L'utente usa l'app Volume per impostare l'indice del volume su 30.
Questo indice viene convertito in guadagno di volume e inviato ad Audio HAL.
Le implementazioni dei fornitori di
Audio HAL
ricevono il nuovo guadagno del 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 da parte dei fornitori degli attivatori
AudioControl HAL
:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Il servizio audio dell'auto utilizza il nuovo indice del callback, che viene usato per persistenza e per i callback all'app del volume. L'indice richiesto dall'utente è 30. Tuttavia, il feedback asincrono del sistema audio aggiorna l'indice impostandolo su 15.
Caso d'uso: prima riproduzione audio dopo l'uscita dalla sospensione
L'indice di volume prima della sospensione è impostato su un livello alto di 95 (intervallo: [0-99]).
Android entra in modalità di sospensione.
Dopo l'esistenza della sospensione di Android (ad esempio, ripristina):
Il fornitore
Audio HAL/AudioControl HAL
applica un indice di sicurezza pari a 30 al sistema audio localmente.Il fornitore
AudioControl HAL
attiva anche il callback per l'indice sicuro:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
Il servizio audio dell'auto utilizza il nuovo indice del callback usato per la persistenza e i suoi callback all'app di 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 volume dinamico
Per questa funzionalità prendiamo in considerazione i seguenti casi d'uso principali:
Configurazione di fine linea (EOL) del veicolo.
Le case automobilistiche preferiscono aggiornare le configurazioni del volume alla fine del ciclo di vita in base alla configurazione del sistema audio del veicolo. In genere, si tratta di un sideload che non aggiorna l'immagine SW di Android.
I produttori di automobili potrebbero dover aggiornare la configurazione del volume durante una pianificazione del servizio.
Configurazione di runtime. I sistemi audio automobilistici supportano configurazioni di amplificatori esterni e queste ECU possono ospitare le configurazioni dell'intervallo del volume che vengono interrogate durante l'avvio.
Configurazione on demand. Offerta per sostenere la crescente necessità di funzionalità audio basate su domanda in cui gli utenti si abbonano a un'elaborazione avanzata dei segnali per un determinato periodo di tempo. Le nuove configurazioni dell'intervallo di volume sono valide per la durata di un abbonamento.
Design
La configurazione del volume dinamico viene eseguita 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 rilevato, viene generato un callback tramite
AudioControl::IModuleChangeCallback
.Aggiorna. Lo stack dell'audio dell'auto aggiorna gli stati del gruppo di volume con i nuovi intervalli di volume.
Facciamo il possibile 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 attuale viene impostato su un valore sicuro. Ad esempio, il livello predefinito fornito dal fornitore durante il callback.
Richiama.
Dopo gli aggiornamenti dell'intervallo del gruppo di volume, lo stack audio dell'auto attiva un callback per le app registrate tramite
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
contiene i valoriCarVolumeGroupInfo
, Event-type (cosa è cambiato) ed Extra-info (perché è cambiato) aggiornati.
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 | |
---|---|
ControlloIAudio#setModuleChangeCallback | Imposta un'istanza di IModuleChangeCallback con AudioControl HAL. |
Controllo IAudio#clearModuleChangeCallback | Cancella l'istanza di IModuleChangeCallback precedentemente impostata con l'AudioControl HAL. |
IModuleChangeCallback#onAudioPortsChanged | Callback per notifica delle modifiche a AudioPorts |
Sequenza
Di seguito è riportato il diagramma di sequenza della configurazione del volume dinamico.
Figura 2. Diagramma di sequenza per la configurazione del volume dinamico.
Aspetti principali
Per ottimizzare questa funzionalità, considera quanto segue.
Le porte audio fornite come parte del callback devono corrispondere alla definizione di Automotive BUS:
- Porta del dispositivo.
IN_DEVICE
eOUT_DEVICE
- Connessione.
BUS
- Indirizzo. Definite nella definizione di Audio HAL
- Modalità Guadagno.
JOINT
- Porta del dispositivo.
I fornitori devono definire un soprainsieme di definizioni degli intervalli di volume nel criterio Audio HAL e utilizzare il callback per personalizzarlo per le varianti del veicolo. Per ulteriori informazioni, consulta la definizione di AIDL
IModuleChangeCallbac
.Quando più di un BUS audio appartiene allo stesso gruppo di volume, ogni deve avere definizioni identiche dell'intervallo di volume. In caso contrario, il framework dell'audio dell'auto rifiuterà la nuova definizione dell'intervallo di volume.