La gestione del volume è 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 di AAOS utilizzano un amplificatore hardware per regolare il volume anziché un mixer software. Per evitare effetti collaterali, imposta il flag config_useFixedVolume
su
true
(sovrapponi 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 app possono chiamare AudioManager.setStreamVolume()
per modificare il volume in base al tipo di stream
nel mixer software. Ciò potrebbe non essere sempre auspicabile a causa di potenziali effetti su altre app e del fatto che l'attenuazione del volume nel mixer software può comportare 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 di una raccolta di dispositivi all'interno di una zona audio. Per ogni gruppo di volume, il volume può essere controllato indipendentemente. 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>
Ogni gruppo di volumi deve contenere uno o più dispositivi di output con gli indirizzi associati. Gli 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 passo 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. Il guadagno massimo più elevato tra i dispositivi del gruppo.
- Guadagno predefinito. Guadagno predefinito più alto tra i dispositivi del gruppo.
Dato il modo in cui sono configurati questi valori, è possibile impostare il guadagno di un gruppo di volume al di fuori dell'intervallo supportato per un dispositivo associato al gruppo di volume. In questo caso, per il dispositivo il guadagno viene 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 nell'ordine definito 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 nella 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 accetta un groupId
senza un zoneId
viene impostata per impostazione predefinita sulla zona audio principale.
Gestione dei volumi multizona
Ogni zona audio dovrebbe avere uno o più gruppi di volume e ogni gruppo di volume è associato a una sola zona audio. Questa relazione è definita nell'ambito di car_audio_configuration.xml
. Per saperne di più, consulta l'esempio riportato sopra
in Definire i gruppi di volumi.
I livelli di volume attuali per ogni zona vengono mantenuti per l'utente associato a quella zona. Queste impostazioni sono specifiche per ogni 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 sono diversi da quelli per la zona secondaria.
Gestire gli eventi dei tasti del volume
Android definisce diversi codici a tasti per il controllo del volume, tra cui:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Per impostazione predefinita, Android inoltra gli eventi chiave del volume alle app. Le implementazioni nel settore auto e motori devono forzare l'elaborazione di questi eventi chiave da parte di CarAudioService
, che a sua volta chiama 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 si presume che siano tutti associati alla zona audio principale. Quando viene ricevuto un evento del tasto del volume, CarAudioService
determina il gruppo di volume da 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. La 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. Le API di sistema corrispondenti per CarAudioManager 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 dell'altoparlante verso il lato destro (+) o sinistro (-) dell'auto.- 0,0 è al centro
- +1.0 è completamente a destra
- -1.0 è completamente a sinistra
- Un valore al di fuori dell'intervallo da -1 a 1 è un errore
setFadeTowardFront(float value)
regola il volume dell'altoparlante verso la parte anteriore (+) o posteriore (-) dell'auto.- 0,0 è al centro
- +1.0 è completamente in 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. 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 modo alternativo l'attenuazione e il bilanciamento tramite effetti audio sui dispositivi di output appropriati anziché tramite queste API.
Attenuazione automatica audio
L'attenuazione audio si verifica quando il veicolo riduce il guadagno di uno stream in modo che un altro stream riprodotto contemporaneamente possa essere ascoltato più chiaramente. In AAOS, la funzionalità di attenuazione audio viene implementata dall'HAL. Android non ha alcun controllo sui suoni oltre il sistema operativo. In Android 11, le informazioni principali disponibili per l'HAL per prendere decisioni relative al ducking sono se due dispositivi di output hanno o meno stream attivi.
Quando abbassarsi
Spetta al singolo OEM stabilire come viene gestito il silenziamento dall'HAL, ma consigliamo le seguenti linee guida.
La riproduzione di più stream su Android si verifica comunemente quando due app o servizi monopolizzano contemporaneamente l'audio. Per scoprire quando Android potrebbe concedere il controllo contemporaneamente, consulta la matrice di interazione in Tipi di restrizioni. Con l'introduzione del plug-in per l'audio dell'auto, questo dipende anche dalla gestione di AudioFocus.
Eventuali stream combinati da Android vengono combinati prima dell'applicazione di eventuali guadagni. 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 mixarli.
Comportamento consigliato per la disattivazione audio
Di seguito sono riportate le potenziali interazioni simultanee per le quali è consigliato l'uso del ducking.
Interazione | Azione |
---|---|
EMERGENCY
| Mette in sottofondo o disattiva l'audio di tutti i contenuti tranne SAFETY
|
SAFETY |
Mette in sottofondo tutto tranne EMERGENCY |
NAVIGATION |
Mette in sospensione tutto tranne SAFETY e EMERGENCY |
CALL |
Anatra tutto tranne SAFETY , EMERGENCY e NAVIGATION |
VOICE |
Anatre CALL_RING |
VEHICLE_SOUNDS |
Puoi determinare l'importanza del suono attivo e se deve o meno attenuare gli altri suoni. |
MUSIC e ANNOUNCEMENT |
Ho evitato tutto. Fanno eccezione i suoni di interazione tocco riprodotti come SYSTEM_SOUND .
|
Considerazioni sul ducking
Alcune app e alcuni servizi, come la navigazione o un assistente, potrebbero utilizzare più lettori per eseguire azioni. Evita un'attenuazione aggressiva quando uno stream di dati si interrompe durante il flusso attraverso i dispositivi di output per assicurarti che i contenuti multimediali non tornino al volume pieno prima di essere attenuati prima dell'avvio della riproduzione successiva dalla navigazione o di un'app di assistenza.
Per i veicoli con più stadi sonori con un isolamento sufficiente, puoi indirizzare 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
Android 11 ha introdotto le API HAL per l'attenzione audio. L'HAL garantisce che i suoni critici per la sicurezza abbiano la priorità rispetto ad altri suoni. Se l'HAL mantiene l'audio
in primo piano per USAGE_EMERGENCY
, non è garantito che le app e i servizi di
Android non riproducano suoni. L'HAL determina quali stream di Android devono essere miscelati o disattivati per riprodurre suoni di sicurezza critici.
Configurare 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 profitti dei gruppi di volumi. Questa separazione garantisce che non siano necessarie modifiche in caso di modifica della configurazione dei gruppi di volumi.
Nell'interfaccia utente delle impostazioni dell'auto, 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 consente un rendering ragionevole
del VolumeGroups
definito utilizzando le risorse associate al primo
utilizzo riconosciuto contenuto in ogni VolumeGroup
.
Ad esempio, l'esempio seguente definisce un VolumeGroup
come contenente voice_communication
e 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 corrispondenza 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 scoprire quanti controlli devono essere disegnati.getGroupMinVolume()
egetGroupMaxVolume()
per ottenere i limiti inferiore e superiore.getGroupVolume()
per ottenere il volume attuale.registerVolumeChangeObserver()
per ricevere una notifica delle modifiche al volume.
Evento gruppo di volumi di auto
I casi d'uso relativi all'aggiornamento del volume e all'opzione di disattivazione dell'audio per i veicoli hanno basi contestuali che possono definire le azioni di determinate app, come le impostazioni del volume. Il callback corrente per il volume e la disattivazione dell'audio dallo stack audio dell'auto fornisce informazioni contestuali limitate. Per supportare meglio i casi d'uso nel settore auto e motori e la scalabilità futura, CarVolumeGroupEvent è stato aggiunto ad Android 14. Ogni evento contiene tre tipi di informazioni fondamentali:
- Elenco di
CarVolumeGroupInfo
EventTypes
(bitmap)- Elenco di
ExtraInfos
CarVolumeGroupInfo
Il destinatario del callback dell'evento ha accesso immediato all'elenco delle informazioni sul gruppo di volume delle auto interessate. Ciò significa che l'app non deve effettuare chiamate aggiuntive al framework audio per auto per ottenere lo stato più recente. Può semplicemente utilizzare il CarVolumeGroupInfos
ricevuto per aggiornare l'interfaccia utente o gli stati interni. Per semplificare le cose per le app, gli aspetti che sono cambiati in un gruppo di volume
delle auto vengono forniti anche all'interno di EventTypes
, come spiegato di seguito.
EventTypes
Definisce quale aspetto di CarVolumeGroupInfo
è cambiato. Le app possono utilizzarlo per identificare le modifiche e intraprendere le azioni necessarie. Ad esempio,
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
indica che il rispettivo
CarVolumeGroups
indice di aumento del volume massimo è cambiato e può essere sottoposto a query tramite
CarVolumeGroupInfo.getMaxVolumeGainIndex()
.
La seguente tabella mostra la relazione tra EventType
e
CarVolumeGroupInfo
.
EventType | CarVolumeGroupInfo |
---|---|
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.isMuted() |
EVENT_TYPE_VOLUME_BLOCKED_CHANGED | CarVolumeGroupInfo.isBlocked() |
EVENT_TYPE_ATTENUATION_CHANGED | CarVolumeGroupInfo.isAttenuated() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
Fornisce ulteriori informazioni sul motivo della modifica del CarVolumeGroup
. Le app possono utilizzare queste informazioni per fornire un contesto aggiuntivo per avvisare l'utente di intervenire o per inviare una notifica. Ad esempio, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
indica un'attenuazione transitoria attiva a causa di un sovraccarico termico. L'app può informare l'utente se tenta di aumentare il volume.
Non applichiamo alcuna procedura per ExtraInfos
. È a tua discrezione determinare la procedura in base a ExtraInfos
. Ad esempio, se l'attenuazione è attiva a causa di EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED
, puoi anche scegliere di attenuare inizialmente l'interfaccia utente della barra del volume per impedire all'utente di modificare il volume.
Altri potrebbero scegliere di mostrare un messaggio che indica che la funzionalità è attiva e consentire all'utente di regolare il volume.
Il framework audio per auto dipende dall'HAL AudioControl IAudioGainCallback
per fornire il ExtraInfos
suggerito. Per saperne di più, consulta
Audio Gain Callback.
CarVolumeGroupEvent
si adatta alle esigenze future del framework audio per auto. Abbiamo intenzione di supportare le nuove funzionalità solo tramite CarVolumeGroupEvent
. Ti consigliamo vivamente di utilizzare CarVolumeGroupEvent
per gestire le modifiche al volume e alla disattivazione dell'audio del gruppo.
Richiamo evento gruppo di volumi dell'auto
Android 14 fornisce un nuovo callback per le app privilegiate e della piattaforma per registrarsi ed essere avvisate di CarVolumeGroupEvents
.
Per registrarti per la chiamata di ritorno, utilizza
CarAudioManager#registerCarVolumeGroupEventCallback()
Per annullare la registrazione del callback, utilizza
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Se un'app si registra con il nuovo CarVolumeGroupEventCallback
e con il precedente
CarVolumeCallback
, viene data la priorità all'evento CarVolumeGroupEventCallbacks
.
La pila audio dell'auto non attiva più CarVolumeCallback
. In questo modo si evitano attivatori duplicati per la stessa app per lo stesso evento.
Ti consigliamo vivamente di utilizzare CarVolumeGroupEventCallback
per gestire il volume del gruppo e le modifiche alla disattivazione dell'audio.
Callback per il guadagno audio
A partire da Android 13, l'HAL AudioControl può attivare un callback asincrono per gestire gli aggiornamenti del livello del volume a causa di modifiche all'impianto audio dell'auto.
API HAL
AudioControl @2.0 AIDL
La versione 2.0 dell'HAL AIDL AudioControl aggiunge la seguente API:
API | Finalità |
---|---|
IAudioControl#registerGainCallback |
Registra un'istanza di IAudioGainCallback con l'HAL AudioControl. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Callback asincrono per notificare le modifiche alla configurazione del guadagno audio. |
Il callback HAL AudioControl include elenchi di motivi e il rispettivo
AudioGainConfigInfo
, composto da:
- ID zona
- Indirizzo porta del dispositivo
- L'indice del volume > indice può essere un indice limitato o un indice di aggiornamento.
I motivi possono essere classificati in modo generico come:
- Motivi della limitazione. Modifica transitoria del comportamento del volume e della disattivazione audio.
- Motivi dell'aggiornamento. Modifica permanente del comportamento del volume.
Tipi di restrizioni
A partire dal giorno AudioControl
HAL AIDL
V3
, i tipi di limitazioni supportati sono i seguenti:
- Disattiva audio
- Blocco
- Limitazione
- Attenuazione
Limitazione attiva | Modifica del volume attivata dall'utente | Pulsante di attivazione/disattivazione dell'audio attivato dall'utente |
---|---|---|
Disattiva audio | ❌ | ❌ (riattiva l'audio) ✔ (disattiva l'audio) |
Blocco | ❌ | ✔ |
Limitazione | ❌ (oltre il limite) ✔ (sotto il limite) |
✔ |
Attenuazione | ✔ | ✔ |
La priorità tra le limitazioni è Disattivazione audio > Blocco > Limitazione > Atenuazione.
Limitazioni di disattivazione audio
Le limitazioni relative al silenziamento sono:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Il framework audio per auto gestisce internamente questi due stati di disattivazione dell'audio:
Disattivazione audio dell'utente. Attivato/disattivato in base alla richiesta dell'utente tramite
CarAudioManager
o eventi chiave.HAL, disattiva l'audio. Attivato/disattivato in base alle limitazioni di disattivazione dell'audio ricevute tramite il
AudioGain
callback.
Per gli ascoltatori come l'app Impostazioni, lo stato di disattivazione audio complessiva del gruppo di volumi (CarVolumeGroupInfo.isMuted()
) si baserà sull'attivazione di una delle disattivazione audio sopra indicate.
Quando la disattivazione dell'audio HAL è attiva, tutte le richieste in arrivo di modifica del volume e di attivazione dell'audio del gruppo vengono ignorate per la durata della limitazione.
Caso d'interazione: il silenziamento HAL è attivo e l'utente richiede l'opzione di attivazione/disattivazione del silenziamento
Quando la disattivazione audio HAL è attivata e la disattivazione audio utente è disattivata:
- Lo stato di disattivazione del volume complessivo del gruppo è impostato su
true
. - Le richieste dell'utente di attivare la disattivazione dell'audio verranno elaborate.
- Motivo: le richieste di disattivazione dell'audio degli utenti devono essere rispettate in ogni momento per tutelare la loro privacy.
Quando la disattivazione audio HAL è attiva e la disattivazione audio utente è attiva:
Lo stato di disattivazione del volume complessivo del gruppo è impostato su
true
.Le richieste dell'utente di disattivare l'audio verranno
NOT
elaborate. Lo stato di disattivazione dell'audio dell'utente memorizzato nella cache rimane attivo.Motivo: le richieste di attivazione dell'audio degli utenti verranno soddisfatte solo se non sono presenti limitazioni attive.
Motivo: la disattivazione dell'audio dell'utente memorizzato nella cache potrebbe causare un aumento improvviso del volume e mettere a rischio la sicurezza dell'utente. Questo è particolarmente vero se lo stato di disattivazione dell'audio è attivo tra i cicli di accensione, il che riduce la consapevolezza degli utenti sulla percezione del livello di suono.
Caso d'uso: disattivazione e attivazione della disattivazione audio HAL mentre la disattivazione audio utente non subisce modifiche
L'attivazione/disattivazione della disattivazione audio HAL modifica lo stato di disattivazione audio complessivo del gruppo di volumi. Tuttavia, non aggiorna direttamente lo stato di disattivazione audio dell'utente. Quando la disattivazione audio dell'utente è disattivata e viene ricevuto il callback di disattivazione audio HAL per l'abilitazione:
- Lo stato di disattivazione del volume complessivo del gruppo è impostato su
true
. Le richieste dell'utente di modificare il volume
NOT
verranno elaborate quando l'opzione di disattivazione audio HAL è attivata.Motivo: l'utente non riesce a percepire l'audio quando la disattivazione dell'audio è attiva. Consentire la variazione del volume può causare un'esplosione di suoni e mettere in pericolo la sicurezza degli utenti.
Motivo: le app di controllo del volume possono registrarsi per i callback e attivare lo sblocco del volume (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automaticamente senza intervento dell'utente, se questo è il comportamento previsto dall'OEM.
Quando la disattivazione audio HAL è disattivata mentre la disattivazione audio utente è disattivata:
Lo stato di disattivazione del volume del gruppo è impostato su
false
.Motivo: l'impostazione dello stato di disattivazione dell'audio come permanente e la richiesta all'utente di riattivare l'audio possono interrompere inutilmente l'utente quando gli stati di disattivazione dell'audio vengono attivati e disattivati di frequente.
Le richieste degli utenti di modificare il volume 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 di:
- Le modifiche al volume non vengono elaborate.
- Le richieste di attivazione/disattivazione dell'audio vengono elaborate.
Limitazione
Le limitazioni sono:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Quando le limitazioni sono attive, le richieste degli utenti di:
Regolare il volume:
- Entro il limite vengono elaborati
- I dati che superano il limite non vengono elaborati
Le richieste di attivazione/disattivazione dell'audio vengono elaborate.
Attenuazione
Le limitazioni di attenuazione sono:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Quando le limitazioni di attenuazione sono attive, le richieste degli utenti di:
Regolare il volume. Il nuovo livello di volume corrente viene impostato sul volume attenuato (anziché sul volume precedente). Le modifiche future al volume vengono apportate da questo livello.
L'opzione Attiva/disattiva audio è stata elaborata.
Aggiornamento dell'indice
Di seguito è riportato l'aggiornamento dell'indice dei volumi asincroni:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Per questo motivo, l'HAL AudioControl può aggiornare l'indice corrente del gruppo di volumi
all'indice specificato. Viene utilizzato principalmente come feedback del sistema audio per la richiesta di modifica del volume dal framework audio dell'auto. L'aggiornamento dell'indice viene comunicato anche ad App come callback CarVolumeGroupEvent
per sincronizzare l'indice.
Esempi
Caso d'uso: l'utente aggiorna l'indice del volume su 30
L'utente utilizza l'app Volume per impostare l'indice del volume su 30.
Questo indice viene convertito in guadagno del volume e inviato all'HAL audio.
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 degli attivatori
AudioControl HAL
da parte dei fornitori:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Il servizio audio per auto utilizza il nuovo indice dal callback utilizzato per la persistenza e i callback all'app di controllo del volume. L'indice richiesto dall'utente è 30. Tuttavia, il feedback asincrono del sistema audio aggiorna l'indice su 15.
Caso d'uso: prima riproduzione audio dopo l'uscita dalla sospensione
L'indice di volume prima della sospensione è impostato su un livello elevato di 95 (intervallo: [0-99]).
Android entra in modalità sospensione.
Una volta che Android è in stato di sospensione (ad esempio, ripresa):
Il fornitore
Audio HAL/AudioControl HAL
applica un indice di sicurezza di 30 al sistema audio a livello locale.Il fornitore
AudioControl HAL
attiva anche il callback per l'indice sicuro:
IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {..., 30 /* safe index */})
Il servizio audio per auto utilizza il nuovo indice dal callback utilizzato per la persistenza e i suoi callback all'app di gestione del volume che sincronizza l'indice. L'indice del volume prima della sospensione è 95. Tuttavia, al riavvio, questo indice viene impostato su un livello di volume sicuro di 30 dall'implementatore di
AudioControl HAL
.
Configurazione del volume dinamico
Per questa funzionalità, consideriamo i seguenti casi d'uso principali:
Configurazione del veicolo di fine serie (EOL).
I produttori di auto preferiscono aggiornare le configurazioni del volume a fine vita in base alla configurazione dell'impianto audio del veicolo. In genere, si tratta di un sideload senza aggiornare l'immagine del software Android.
I produttori di auto potrebbero dover aggiornare la configurazione del volume durante una programmazione del servizio.
Configurazione di runtime. I sistemi audio per auto supportano configurazioni di amplificatori esterni e queste ECU possono ospitare le configurazioni dell'intervallo di volume a cui viene eseguita la query durante l'avvio.
Configurazione on demand. Offerto per supportare la crescente necessità di funzionalità audio basate sulla domanda in cui gli utenti si abbonano all'elaborazione avanzata dei segnali per un determinato periodo di tempo. Le nuove configurazioni dell'intervallo di volumi sono valide per la durata di un abbonamento.
Design
La configurazione dei volumi dinamici avviene in tre fasi:
Discovery. L'implementazione HAL AudioControl del fornitore rileva i nuovi aggiornamenti della gamma di volume tramite un meccanismo IPC personalizzato di proprietà del fornitore.
Una volta rilevato, viene generato un callback tramite
AudioControl::IModuleChangeCallback
.Aggiorna. La pila audio dell'auto aggiorna gli stati del gruppo di volume con i nuovi intervalli di volume.
Ci impegniamo a mantenere lo stesso livello di volume dopo l'aggiornamento dell'intervallo di volume. Tuttavia, se l'indice non è compreso nell'intervallo consentito, l'indice del volume corrente viene impostato su un valore sicuro. Ad esempio, il livello predefinito fornito dal fornitore durante il callback.
Richiamata.
Dopo aver pubblicato gli aggiornamenti dell'intervallo del gruppo di volumi, lo stack audio dell'auto attiva un callback per le app registrate tramite
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
contieneCarVolumeGroupInfo
aggiornato, Tipo-evento (che cosa è cambiato) e Informazioni-extra (perché è cambiato).
Figura 1. Configurazione del volume dinamico.
API HAL
AudioControl @ 3.0 AIDL
La versione 3.0 dell'HAL AIDL AudioControl introduce le seguenti API:
API | |
---|---|
IAudioControl#setModuleChangeCallback | Imposta un'istanza di IModuleChangeCallback con l'HAL AudioControl. |
IAudioControl#clearModuleChangeCallback | Cancella l'istanza di IModuleChangeCallback impostata in precedenza con l'HAL AudioControl. |
IModuleChangeCallback#onAudioPortsChanged | Callback per notificare le modifiche ad 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 chiave
Per ottimizzare questa funzionalità, tieni presente quanto segue.
Le AudioPort fornite nell'ambito del callout devono corrispondere alla definizione di AutomotiveBUS:
- Porta del dispositivo.
IN_DEVICE
,OUT_DEVICE
- Connessione.
BUS
- Indirizzo. Definito nella definizione dell'HAL audio
- Modalità guadagno.
JOINT
- Porta del dispositivo.
I fornitori devono definire un superset di definizioni di intervalli di volume nel criterio HAL audio e utilizzare il callback per personalizzarlo in base alle varianti del veicolo. Per ulteriori informazioni, consulta la definizione di AIDL di
IModuleChangeCallbac
.Quando più di un bus audio appartiene allo stesso gruppo di volumi, ogni bus deve avere definizioni di intervallo di volume identiche. In caso contrario, il framework audio dell'auto rifiuterà la definizione del nuovo intervallo di volume.