La gestione del volume è contenuta in CarAudioService
, che utilizza volumi fissi con la previsione 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 software. Per evitare effetti collaterali, imposta il flag config_useFixedVolume
su true
(sovrapponilo se necessario):
<resources>
<!-- Car uses hardware amplifier for volume. -->
<bool name="config_useFixedVolume">true</bool>
</resources>
Quando il flag config_useFixedVolume
non è impostato (o è impostato su false
), le app possono chiamare AudioManager.setStreamVolume()
per modificare il volume in base al tipo di flusso nel mixer software. Ciò potrebbe non essere sempre auspicabile a causa dei 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 per un insieme di dispositivi all'interno di una zona audio. Per ciascun gruppo di volume, il volume può essere controllato in modo indipendente. 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>
Ciascun gruppo di volumi dovrebbe 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 volumi 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 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:
- Dimensione del passo. Deve essere lo stesso per tutti i dispositivi controllati dal gruppo di volumi.
- Guadagno minimo. Guadagno minimo più piccolo tra i dispositivi del gruppo.
- Guadagno massimo. Guadagno massimo più alto tra i dispositivi del gruppo.
- Guadagno predefinito. Guadagno predefinito più alto tra i dispositivi del gruppo.
Dato il modo in cui sono configurati questi valori, è possibile impostare il guadagno di un gruppo di volumi al di fuori dell'intervallo supportato per un dispositivo associato al gruppo di volumi. In questo caso, per quel dispositivo il guadagno è impostato sul valore di guadagno minimo o massimo del dispositivo a seconda che il valore del gruppo di volume sia inferiore o superiore all'intervallo.
Identificatori del gruppo di volumi
I gruppi di volumi vengono identificati in fase di runtime 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 in quella zona. In questo modo, gli ID dei gruppi di volumi non sono univoci tra le zone. Questi identificatori vengono utilizzati per le API CarAudioManager
associate ai gruppi di volumi. Qualsiasi API che accetta un groupId
senza zoneId
utilizza per impostazione predefinita la zona audio primaria.
Gestione del volume multizona
Si prevede che ciascuna zona audio disponga di uno o più gruppi di volume e ciascun gruppo di volume è associato solo a una singola zona audio. Questa relazione è definita come parte di car_audio_configuration.xml
. Per ulteriori informazioni, vedere l'esempio sopra in Definire gruppi di volumi .
I livelli di volume correnti per ciascuna zona vengono mantenuti per l'utente associato a quella zona. Queste impostazioni sono specifiche della zona, ovvero se un utente accede su un display associato alla zona primaria e successivamente accede a una zona associata a una zona audio secondaria, i livelli di volume caricati e persistenti per la prima zona differiscono da quelli per la zona secondaria.
Gestire gli eventi relativi ai 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 indirizza gli eventi dei tasti del volume alle app. Le implementazioni automobilistiche dovrebbero forzare l'elaborazione di questi eventi chiave da parte di CarAudioService
, che quindi 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>
Gli eventi relativi ai tasti del volume attualmente non hanno modo di distinguere a quale zona sono destinati e si presuppone che siano tutti associati alla zona audio primaria. Quando viene ricevuto un evento relativo al tasto del volume, CarAudioService
determina quale gruppo di volume regolare recuperando i contesti audio per i lettori attivi e quindi regolando il gruppo di volume che contiene il dispositivo di output associato al contesto audio con la priorità più alta. La priorità è determinata in base a un ordinamento fisso definito in CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Dissolvenza ed equilibrio
Entrambe le versioni di AudioControl HAL includono API per impostare la dissolvenza e il bilanciamento nel veicolo. Le API di sistema corrispondenti per CarAudioManager passano i valori all'HAL AudioControl. Queste API richiedono android.car.permission.CAR_CONTROL_AUDIO_VOLUME
. Le API AudioControl sono:
setBalanceTowardRight(float value)
sposta il volume dell'altoparlante verso il lato destro (+) o sinistro (-) dell'auto.- 0.0 è centrato
- +1.0 è pienamente corretto
- -1.0 è completamente a sinistra
- Un valore fuori dall'intervallo compreso tra -1 e 1 è un errore
setFadeTowardFront(float value)
sposta il volume dell'altoparlante verso la parte anteriore (+) o posteriore (-) dell'auto.- 0.0 è centrato
- +1.0 è completamente in avanti
- -1.0 è completamente indietro
- Un valore fuori dall'intervallo compreso tra -1 e 1 è un errore
Sei tu a decidere come applicare questi valori e come visualizzarli agli utenti. Potrebbero essere applicati rigorosamente ai media o in generale a tutti i suoni Android. Android 11 ha introdotto anche il supporto per l'applicazione di effetti audio ai dispositivi di output. In questo modo è possibile gestire in alternativa la dissolvenza e il bilanciamento tramite effetti audio sui dispositivi di output appropriati anziché tramite queste API.
Ducking dell'audio
Il ducking audio si verifica quando il veicolo riduce il guadagno di un flusso in modo che un altro flusso riprodotto contemporaneamente possa essere ascoltato più chiaramente. In AAOS, il ducking audio è implementato dall'HAL. Android non ha alcun controllo sui suoni al di fuori del sistema operativo. In Android 11, l'informazione principale a disposizione dell'HAL per prendere decisioni di ducking è se due dispositivi di output hanno entrambi flussi attivi o meno.
Quando abbassarsi
Anche se spetta al singolo OEM determinare la modalità di gestione del ducking da parte dell'HAL, si consigliano le seguenti linee guida.
Più flussi riprodotti in Android si verificano comunemente quando due app o servizi mantengono contemporaneamente il focus audio. Per sapere quando Android può concedere il focus simultaneo, consulta la matrice di interazione in Tipi di restrizione . Con l'introduzione del plug-in audio per auto, ciò dipende anche dalla tua gestione AudioFocus.
Tutti i flussi mescolati insieme da Android vengono eseguiti prima dell'applicazione di eventuali guadagni. Pertanto, qualsiasi flusso che deve essere sottoposto al ducking quando riprodotto contemporaneamente a un altro deve essere instradato a dispositivi di output separati in modo che l'HAL possa applicare il ducking prima di mixarli.
Comportamento di ducking consigliato
Di seguito sono riportate le potenziali interazioni simultanee. Si consiglia il ducking.
Interazione | Azione |
---|---|
EMERGENCY | Abbassa o silenzia tutto tranne SAFETY |
SAFETY | Evita tutto tranne EMERGENCY |
NAVIGATION | Evita tutto tranne SAFETY ed EMERGENCY |
CALL | Evita tutto tranne SAFETY , EMERGENCY e NAVIGATION |
VOICE | Anatre CALL_RING |
VEHICLE_SOUNDS | Sei tu a determinare l'importanza del suono attivo e se elimina o meno altri suoni. |
MUSIC e ANNOUNCEMENT | Schiacciato da tutto. Le eccezioni sono i toni di interazione touch riprodotti come SYSTEM_SOUND . |
Considerazioni sul ducking
Alcuni app e servizi, come la navigazione o un assistente, potrebbero utilizzare più lettori per eseguire azioni. Evita lo sgancio aggressivo quando un flusso di dati smette di fluire attraverso i dispositivi di output per garantire che i contenuti multimediali non ritornino al volume massimo prima di essere abbassati prima3 dell'avvio della riproduzione successiva dalla navigazione o da un'app di assistenza.
Per i veicoli con più livelli sonori con un isolamento sufficientemente buono, puoi instradare l'audio in diverse aree dell'auto invece di abbassarlo. Ad esempio, le istruzioni di navigazione possono essere indirizzate agli altoparlanti sul poggiatesta del conducente continuando a riprodurre la musica a volume normale in tutto l'abitacolo.
Suoni critici per la sicurezza
Android 11 ha introdotto le API di messa a fuoco audio HAL . L'HAL garantisce che i suoni critici per la sicurezza abbiano la priorità rispetto agli altri suoni. Se l'HAL mantiene il focus audio per USAGE_EMERGENCY
, non è garantito che le app e i servizi di Android non riproducano suoni. L'HAL determina quali flussi provenienti 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 Configurazione dei guadagni del gruppo di volumi . Questa separazione garantisce che non siano necessarie modifiche nel caso in cui dovesse cambiare la 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 titolo e icona) associati a ciascun AudioAttributes.USAGE
definito. Questo file fornisce una resa ragionevole dei VolumeGroups
definiti utilizzando le risorse associate al primo utilizzo riconosciuto contenuto in ciascun VolumeGroup
.
Ad esempio, l'esempio seguente definisce un VolumeGroup
come comprendente 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
poiché questo è il primo matc nel file.
<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
<item car:usage="voice_communication"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="voice_communication_signalling"
car:title="@*android:string/volume_call"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="media"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="game"
car:title="@*android:string/volume_music"
car:icon="@*android:drawable/ic_audio_media"/>
<item car:usage="alarm"
car:title="@*android:string/volume_alarm"
car:icon="@*android:drawable/ic_audio_alarm"/>
<item car:usage="assistance_navigation_guidance"
car:title="@string/navi_volume_title"
car:icon="@drawable/ic_audio_navi"/>
<item car:usage="notification_ringtone"
car:title="@*android:string/volume_ringtone"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistant"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="notification"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_request"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_instant"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_communication_delayed"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="notification_event"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_accessibility"
car:title="@*android:string/volume_notification"
car:icon="@*android:drawable/ic_audio_ring_notif"/>
<item car:usage="assistance_sonification"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
<item car:usage="unknown"
car:title="@*android:string/volume_unknown"
car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>
Gli attributi e i valori utilizzati nella configurazione precedente sono dichiarati in packages/apps/Car/Settings/res/values/attrs.xml
. L'interfaccia utente delle impostazioni del volume utilizza le seguenti API CarAudioManager basate su VolumeGroup
:
-
getVolumeGroupCount()
per sapere quanti controlli dovrebbero essere disegnati. -
getGroupMinVolume()
egetGroupMaxVolume()
per ottenere i limiti inferiore e superiore. -
getGroupVolume()
per ottenere il volume corrente. -
registerVolumeChangeObserver()
per ricevere una notifica delle modifiche al volume.
Evento del gruppo di volumi dell'auto
I casi d'uso automobilistici dell'aggiornamento del volume e dell'attivazione/disattivazione dell'audio hanno basi contestuali che possono definire le azioni di determinate app, come le impostazioni del volume. Il volume corrente e la richiamata disattivata dallo stack audio dell'auto forniscono informazioni contestuali limitate. Per servire meglio i casi d'uso automobilistici e la scalabilità futura, CarVolumeGroupEvent viene aggiunto ad Android 14. Ogni evento trasporta tre tipi critici di informazioni:
- Elenco di
CarVolumeGroupInfo
-
EventTypes
(bitmap) - Elenco delle
ExtraInfos
CarVolumeGroupInfo
Il destinatario della richiamata dell'evento ha accesso immediato all'elenco delle informazioni sui gruppi di volumi dell'auto interessati. Ciò significa che l'app non ha bisogno di effettuare ulteriori chiamate al framework Car audio per ottenere lo stato più recente. Può semplicemente utilizzare le CarVolumeGroupInfos
ricevute to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of
EventTypes`, come spiegato di seguito.
Tipi di eventi
Definisce quale aspetto di CarVolumeGroupInfo è cambiato. Le app possono utilizzarlo per identificare le modifiche e intraprendere le azioni richieste. Ad esempio, EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
indica che l' CarVolumeGroups' maximum volume gain index has changed and can be queried by
CarVolumeGroupInfo.getMaxVolumeGainIndex()`.
La tabella seguente mostra la relazione tra EventType
e CarVolumeGroupInfo
.
Tipo di evento | 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.isAttenuato() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
Informazioni extra
Fornisce informazioni aggiuntive sul motivo per cui CarVolumeGroup
è cambiato. Le app possono usare queste informazioni per fornire contesto aggiuntivo per avvisare l'utente di agire o per inviare una notifica. Ad esempio, EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
indica un'attenuazione transitoria attiva dovuta a un sovraccarico termico. L'app può informare l'utente se tenta di aumentare il volume.
Non applichiamo alcun processo per ExtraInfos
. È a tua discrezione determinare il processo in base a 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 possono scegliere di mostrare un brindisi che indica che il ducking è attivo e consentire all'utente di modificare il volume.
La struttura dell'audio dell'auto dipende dall'HAL AudioControl IAudioGainCallback
per fornire le ExtraInfos
suggerite. Per ulteriori informazioni, consulta Richiamata guadagno audio .
CarVolumeGroupEvent
è scalabile per soddisfare le esigenze future del framework audio per 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 le modifiche.
Richiamata evento gruppo volume auto
Android 14 fornisce una nuova richiamata per le app privilegiate e della piattaforma per registrarsi ed essere informati di CarVolumeGroupEvents
.
Per registrarsi per la richiamata, utilizzare
CarAudioManager#registerCarVolumeGroupEventCallback()
Per annullare la registrazione della richiamata, utilizzare
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Se un'app si registra con il nuovo CarVolumeGroupEventCallback
e il CarVolumeCallback
legacy, viene data la priorità all'evento CarVolumeGroupEventCallbacks
. Lo stack audio dell'auto non attiva più CarVolumeCallback
. Ciò impedisce attivazioni duplicate sulla stessa app per lo stesso evento.
Ti consigliamo vivamente di utilizzare CarVolumeGroupEventCallback
per gestire il volume del gruppo e disattivare le modifiche.
Richiamata del guadagno audio
A partire da Android 13, AudioControl HAL può attivare una richiamata asincrona per gestire gli aggiornamenti del livello del volume dovuti a modifiche al sistema audio dell'auto.
API HAL
Controllo audio @2.0 AIDL
La versione 2.0 di AudioControl AIDL HAL aggiunge la seguente API:
API | Scopo |
---|---|
IAudioControl#registerGainCallback | Registra un'istanza di IAudioGainCallback con l'HAL AudioControl. |
IAudioGainCallback#onAudioDeviceGainsChanged | Richiamata asincrona per notificare le modifiche alla configurazione del guadagno audio. |
La richiamata HAL AudioControl include elenchi di motivi e il rispettivo AudioGainConfigInfo
, che consiste in:
- Identificativo zona
- Indirizzo della porta del dispositivo
- Indice volume > indice può essere un indice limitato o un indice di aggiornamento.
Le ragioni possono essere classificate a grandi linee come:
- Motivi di restrizione. Modifica temporanea del volume e del comportamento silenzioso.
- Aggiorna motivi. Modifica permanente del comportamento del volume.
Tipi di restrizione
A partire da AudioControl
HAL AIDL
V3
, i seguenti sono i tipi di restrizioni supportate:
- Muto
- Blocco
- Limitazione
- Attenuazione
Restrizione attiva | Modifica del volume attivata dall'utente | Attiva/disattiva l'audio attivato dall'utente |
---|---|---|
Muto | ❌ | ❌ (attiva l'audio) ✔ (muto) |
Blocco | ❌ | ✔ |
Limitazione | ❌ (oltre il limite) ✔ (sotto il limite) | ✔ |
Attenuazione | ✔ | ✔ |
La priorità tra le restrizioni è Mute > Blocco > Limitazione > Attenuazione.
Restrizioni silenziose
Le restrizioni sulla disattivazione dell'audio sono:
-
Reasons.TCU_MUTE
-
Reasons.REMOTE_MUTE
La struttura audio dell'auto mantiene internamente questi due stati muti:
Utente muto. Attivato/disattivato in base alla richiesta dell'utente, tramite
CarAudioManager
o eventi chiave.HAL disattivato. Attivato/disattivato in base alle restrizioni di disattivazione ricevute tramite la richiamata
AudioGain
.
Per gli ascoltatori come l'app Impostazioni, lo stato di disattivazione generale del gruppo di volumi ( CarVolumeGroupInfo.isMuted()
) si baserà sul fatto che una delle disattivazioni di cui sopra sia abilitata.
Quando la disattivazione dell'audio dell'HAL è abilitata, tutte le richieste di modifica del volume in entrata e di attivazione dell'audio del gruppo vengono ignorate per la durata della restrizione.
Caso di interazione: la disattivazione dell'HAL è attiva e le richieste dell'utente per la disattivazione vengono attivate/disattivate
Quando la disattivazione dell'audio dell'HAL è abilitata e la disattivazione dell'audio dell'utente è disabilitata:
- Lo stato di silenziamento generale del gruppo di volumi viene modificato in
true
. - Le richieste dell'utente per abilitare la disattivazione verranno elaborate.
- Motivo: le richieste di disattivazione dell'utente devono essere rispettate in ogni momento per preservare la privacy degli utenti.
Quando la disattivazione dell'audio dell'HAL è abilitata e la disattivazione dell'audio dell'utente è abilitata:
Lo stato di silenziamento generale del gruppo di volumi viene modificato in
true
.Le richieste dell'utente di disabilitare l'audio
NOT
verranno elaborate. Lo stato di disattivazione dell'utente memorizzato nella cache rimane abilitato.Motivo: le richieste di attivazione dell'audio dell'utente verranno soddisfatte solo se non sono attive restrizioni.
Motivo: riattivare l'audio dell'utente memorizzato nella cache può causare un'esplosione sonora involontaria e mettere in pericolo la sicurezza dell'utente. Ciò è particolarmente vero se lo stato muto è abilitato durante i cicli di accensione, il che riduce la consapevolezza degli utenti della percezione del livello sonoro.
Caso di interazione: HAL Mute è abilitato e disabilitato mentre il mute dell'utente non presenta modifiche
La disattivazione dell'audio dell'HAL modificherà lo stato di disattivazione generale del gruppo di volumi. Tuttavia, non aggiorna direttamente lo stato di disattivazione dell'utente. Quando la disattivazione dell'audio dell'utente è disabilitata e viene ricevuta la richiamata della disattivazione dell'audio dell'HAL per l'attivazione:
- Lo stato di silenziamento generale del gruppo di volumi viene modificato in
true
. Le richieste da parte dell'utente di modificare il volume
NOT
verranno elaborate mentre è abilitata la disattivazione dell'HAL.Motivo: l'utente non può percepire il suono mentre la disattivazione dell'audio è attivata. Consentire la modifica del volume può provocare un'esplosione sonora e mettere in pericolo la sicurezza dell'utente.
Motivo: le app del volume possono registrarsi per le richiamate e attivare automaticamente l'attivazione dell'audio (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) senza l'intervento dell'utente, se questo è il comportamento previsto dall'OEM.
Quando l'audio HAL è disabilitato mentre l'audio utente è disabilitato:
Lo stato di disattivazione dell'audio del gruppo di volumi viene modificato in
false
.Motivo: rendere permanente lo stato di disattivazione e richiedere all'utente di riattivare l'audio potrebbe interrompere inutilmente l'utente quando gli stati di disattivazione si alternano frequentemente.
Le richieste degli utenti di modificare il volume verranno elaborate normalmente.
Blocco
Le restrizioni di blocco sono:
-
Reasons.FORCED_MASTER_MUTE
-
Reasons.REMOTE_MUTE
-
Reasons.TCU_MUTE
.
Quando le restrizioni di blocco sono attive, le richieste degli utenti a:
- Il volume delle modifiche non verrà elaborato.
- L'attivazione/disattivazione dell'audio viene elaborata.
Limitazione
Le restrizioni di limitazione sono:
-
Reasons.THERMAL_LIMITATION
-
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Quando le restrizioni di limitazione sono attive, le richieste degli utenti a:
Modifica volume:
- Entro i limiti vengono elaborati
- Oltre i limiti non vengono elaborati
L'attivazione/disattivazione dell'audio viene elaborata.
Attenuazione
Le restrizioni sull'attenuazione sono:
-
Reasons.ADAS_DUCKING
-
Reasons.NAV_DUCKING
-
Reasons.PROJECTION_DUCKING
Quando le restrizioni di attenuazione sono attive, le richieste degli utenti a:
Il volume delle modifiche viene elaborato. Il nuovo livello di volume attuale viene impostato sul volume attenuato (invece che sul volume precedente). Le future modifiche al volume verranno apportate da questo livello.
L'attivazione/disattivazione dell'audio viene elaborata.
Aggiorna all'indice
Quanto segue è considerato come aggiornamento dell'indice del volume asincrono: Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Per questo motivo, AudioControl HAL può aggiornare l'indice corrente del gruppo di volumi all'indice specificato. Viene utilizzato principalmente come feedback dal sistema audio per la richiesta di modifica del volume dal framework audio dell'auto. L'aggiornamento dell'indice viene comunicato anche alle 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 modificare l'indice del volume su 30.
Questo indice viene convertito in guadagno di volume e inviato all'HAL audio.
Le implementazioni del fornitore di
Audio HAL
ricevono il nuovo guadagno di 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 del fornitore dei trigger
AudioControl HAL
:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Il servizio audio per auto utilizza il nuovo indice dalla richiamata utilizzata per la persistenza e le richiamate all'app del volume. L'indice richiesto dall'utente è 30. Tuttavia, il feedback asincrono del sistema audio aggiorna l'indice a 15.
Caso d'uso: prima riproduzione audio dopo l'uscita dalla sospensione
L'indice del volume prima della sospensione è impostato su un livello alto pari a 95 (intervallo: [0-99]).
Android entra in sospensione.
Una volta che Android esiste, sospendi (ad esempio, riprendi):
Audio HAL/AudioControl HAL
applica localmente un indice di sicurezza pari a 30 al sistema audio.AudioControl HAL
del fornitore attiva anche la richiamata 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 propri callback all'app del 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 del volume dinamico
Per questa funzionalità consideriamo i seguenti casi d'uso principali:
Configurazione di fine linea (EOL) del veicolo.
Le case automobilistiche preferiscono aggiornare le configurazioni del volume all'EOL in base alla configurazione del sistema audio del veicolo. In genere, si tratta di un sideload senza aggiornamento dell'immagine SW Android.
Le case automobilistiche potrebbero dover aggiornare la configurazione del volume durante un programma di servizio.
Configurazione in fase di esecuzione. I sistemi audio automobilistici supportano configurazioni di amplificatori esterni e queste ECU possono ospitare le configurazioni della gamma di volume richieste durante la fase di avvio.
Configurazione su richiesta. Offerto per supportare la crescente necessità di funzionalità audio basate sulla domanda in cui gli utenti si abbonano all'elaborazione avanzata del segnale per un periodo di tempo. Le nuove configurazioni dell'intervallo di volume sono valide per tutta la durata dell'abbonamento.
Progetto
La configurazione dinamica del volume si ottiene 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 scoperto, viene generato un callback tramite
AudioControl::IModuleChangeCallback
.Aggiornamento. Lo stack audio dell'auto aggiorna gli stati dei gruppi di volume con i nuovi intervalli di volume.
Vengono compiuti sforzi 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 corrente viene impostato su un valore sicuro. Ad esempio, il livello predefinito fornito dal fornitore durante la richiamata.
Richiamare.
Dopo gli aggiornamenti dell'intervallo del gruppo di volume, lo stack audio dell'auto attiva una richiamata alle app registrate tramite
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
contieneCarVolumeGroupInfo
aggiornato, tipo di evento (cosa è cambiato) e informazioni extra (perché è cambiato).
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 | |
---|---|
IAudioControl#setModuleChangeCallback | Imposta un'istanza di IModuleChangeCallback con AudioControl HAL. |
IAudioControl#clearModuleChangeCallback | Cancella l'istanza di IModuleChangeCallback precedentemente impostata con l'HAL AudioControl. |
IModuleChangeCallback#onAudioPortsChanged | Richiamata per notificare le modifiche a AudioPorts |
Sequenza
Di seguito viene visualizzato 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à, considerare quanto segue.
Le porte audio fornite come parte della richiamata devono corrispondere alla definizione del BUS automobilistico:
- Porta del dispositivo.
IN_DEVICE
,OUT_DEVICE
- Connessione.
BUS
- Indirizzo. Definito nella definizione HAL audio
- Modalità guadagno.
JOINT
- Porta del dispositivo.
I fornitori devono definire un superset di definizioni di intervallo di volume nella policy HAL audio e utilizzare il callback per personalizzarlo per le varianti del veicolo. Per ulteriori informazioni, vedere la definizione AIDL
IModuleChangeCallbac
.Quando più di un BUS audio appartiene allo stesso gruppo di volumi, ciascuno deve avere definizioni di range di volume identiche. In caso contrario, la struttura dell'audio dell'auto rifiuta la nuova definizione della gamma di volume.