La gestione del volume è contenuta in CarAudioService
, che utilizza volumi fissi
con la previsione che i volumi vengano applicati sotto l'HAL da un amplificatore
hardware anziché nel software. CarAudioService
organizza i dispositivi di output
in gruppi di volume per applicare gli stessi guadagni a tutti i dispositivi associati a un
gruppo di volume.
Volumi fissi
Le implementazioni di AAOS utilizzano un amplificatore hardware per controllare il volume anziché un mixer software. Per evitare effetti collaterali, imposta il flag config_useFixedVolume
su
true
(sovrapponi 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 numero inferiore di bit significativi disponibili nel segnale quando viene ricevuto
dall'amplificatore hardware.
Gruppi di volumi
I gruppi di volumi gestiscono i volumi per una raccolta di dispositivi all'interno di una zona audio. Per ogni gruppo di volumi, 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 caricate quando l'utente esegue l'accesso.
Definisci i gruppi di volumi
CarAudioService utilizza i gruppi di volumi definiti in car_audio_configuration.xml
:
<audioZoneConfiguration version="4">
</deviceConfigurations>
<activationVolumeConfigs>
<activationVolumeConfig name="activation_volume_on_boot_config">
<activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
invocationType="onBoot" />
</activationVolumeConfig>
...
</activationVolumeConfigs>
<zones>
<zone name="primary zone" isPrimary="true">
<zoneConfigs>
<zoneConfig name="primary zone config 0" isDefault="true">
<volumeGroups>
<group activationConfig="activation_volume_on_boot_config">
<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>
</zoneConfig>
...
</zoneConfigs>
</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
.
Configurare i guadagni del gruppo di volumi
Ogni gruppo di volumi ha valori di guadagno minimo, massimo e predefinito, nonché una
dimensione del 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 nel seguente modo:
- Dimensione passo. Deve essere lo stesso per tutti i dispositivi controllati dal gruppo di volumi.
- Guadagno minimo. Il guadagno minimo più basso tra i dispositivi del gruppo.
- Guadagno massimo. Il guadagno massimo più alto tra i dispositivi del gruppo.
- Guadagno predefinito. Il guadagno predefinito più alto tra i dispositivi del gruppo.
Data la modalità di configurazione di 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 minimo o massimo del guadagno del dispositivo a seconda che il valore del gruppo di volumi 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 volumi in quella 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
utilizza per impostazione predefinita la zona audio principale.
Gestione del volume multizona
Ogni zona audio deve avere uno o più gruppi di volumi e ogni gruppo di volumi è 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
nella sezione Definisci gruppi di volumi.
I livelli di volume correnti per ogni zona vengono mantenuti per l'utente associato a quella zona. Queste impostazioni sono specifiche per zona, il che significa che se un utente accede a un display associato alla zona principale e poi accede a una zona associata a una zona audio secondaria, i livelli di volume caricati e salvati per la prima zona differiscono da quelli della zona secondaria.
Volume di attivazione minimo e massimo
Android 15 introduce il controllo degli indici dei gruppi di volumi per una maggiore sicurezza e
comfort dell'utente nei sistemi audio per auto. Ciò si ottiene utilizzando volumi di attivazione minimi e massimi, configurati all'interno della configurazione dell'audio dell'auto (vedi Definire i gruppi di volumi). Puoi attivare questa funzionalità impostando
audioUseMinMaxActivationVolume
su true
negli RRO del servizio auto.
Puoi definire più voci activationVolumeConfig
in
activationVolumeConfigs
, ognuna delle quali rappresenta una configurazione di attivazione minima e
massima diversa. Ogni activationVolumeConfig
:
- Deve contenere un
name
univoco nel file di configurazione dell'audio dell'auto, in modo che possa essere fatto riferimento in un secondo momento nel gruppo di volumi (group
). - Deve contenere un solo elemento
activationVolumeConfigEntry
.
Ogni activationVolumeConfig
contiene i seguenti attributi:
minActivationVolumePercentage
(numero intero, 0-100, facoltativo, valore predefinito: 0): Specifica il volume di attivazione minimo in percentuale.maxActivationVolumePercentage
(numero intero, 0-100, facoltativo, valore predefinito: 100): Specifica il volume di attivazione massimo in percentuale.invocationType
(stringa, facoltativa, valore predefinito:onPlaybackChanged
): definisce le condizioni in base alle quali viene applicato il volume di attivazione minimo e massimo:onBoot
: applicato solo alla prima riproduzione attivata di recente su un gruppo di volumi dopo l'avvio.onSourceChanged
: applicato solo a una riproduzione attiva di recente con un'app o un'origine UID modificata in un gruppo di volumi.onPlaybackChanged
: Applicato a ogni riproduzione appena attivata in un gruppo di volumi.
CarAudioService
gestisce l'attivazione minima e massima monitorando i seguenti sottocomponenti audio attualmente attivi:
- Tracce di riproduzione attive correnti
- Stato attuale della chiamata
- Richiesta di stato attivo audio corrente da Audio Control HAL in cui la richiesta di stato attivo audio da Audio Control HAL segnala che è in corso una riproduzione audio attiva al di fuori di Android
L'immagine seguente mostra una panoramica di alto livello della gestione del volume di attivazione minimo e massimo:
Figura 1. Gestione dei percorsi audio attivi per il volume di attivazione minimo e massimo.
Con minActivationVolumePercentage
, maxActivationVolumePercentage
, indice di guadagno di volume minimo e massimo specificati, puoi calcolare l'indice di guadagno di volume di attivazione minimo e massimo per ogni gruppo di volumi. CarAudioService
monitora ogni riproduzione appena attivata e applica il volume di attivazione minimo e massimo
alle seguenti condizioni:
- Corrispondenze del tipo di invocazione: il tipo di attivazione della riproduzione (derivato da Audio Manager, Audio Control HAL o Telephony Manager) deve corrispondere a
invocationType
specificato inactivationVolumeConfigEntry
associato al gruppo di volume. Indice del volume fuori intervallo: l'indice di guadagno del volume corrente del gruppo di volumi deve rientrare al di fuori dell'intervallo di indice di guadagno del volume di attivazione definito, in particolare, è vera una delle seguenti condizioni:
L'indice è inferiore all'indice di guadagno del volume di attivazione minimo calcolato.
O
L'indice è superiore all'indice di aumento del volume di attivazione massimo calcolato.
In caso di corrispondenza dell'attivazione, l'indice di guadagno di volume del gruppo di volumi verrà modificato in uno dei seguenti valori:
Indice di guadagno del volume di attivazione minimo se inferiore all'indice di guadagno del volume di attivazione minimo
O
Indice di guadagno del volume di attivazione massimo se superiore all'indice di guadagno del volume di attivazione massimo
Inoltre, viene inviato un evento di gruppo di volumi dell'auto con tipo di evento
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED
a tutti i callback degli eventi di gruppo di volumi registrati.
Gestire gli eventi dei tasti del volume
Android definisce diversi keycode per il controllo del volume, tra cui:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Per impostazione predefinita, Android indirizza gli eventi chiave del volume alle app. Le implementazioni per il settore automobilistico 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, gli eventi chiave del volume non consentono di distinguere la zona
a cui sono destinati e si presume che siano tutti associati alla zona
audio principale. Quando viene ricevuto un evento chiave del volume, CarAudioService
determina
quale gruppo di volumi regolare recuperando i contesti audio per i player
attivi e poi regolando il gruppo di volumi che contiene il dispositivo di output
associato al contesto audio con la priorità più alta. La priorità è
determinata in base a un ordine fisso definito in
CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY
.
Dissolvenza e bilanciamento
Entrambe le versioni dell'HAL AudioControl includono API per l'impostazione del dissolvenza e del 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 è completamente a destra
- -1.0 è completamente a sinistra
- Un valore al di fuori dell'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 al di fuori dell'intervallo compreso tra -1 e 1 è un errore
Decidi come applicare questi valori e come visualizzarli per gli utenti. Possono essere applicati rigorosamente ai contenuti multimediali o in modo generale a tutti i suoni di 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 dissolvenza e bilanciamento tramite gli effetti audio sui dispositivi di output appropriati anziché tramite queste API.
Attenuazione automatica audio
L'attenuazione automatica 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, la riduzione del volume audio viene implementata dall'HAL. Android non ha alcun controllo sui suoni al di fuori del sistema operativo. In Android 11, le informazioni principali disponibili per l'HAL per prendere decisioni di abbassamento sono se due dispositivi di output hanno entrambi stream attivi.
Quando abbassarsi
Sebbene spetti al singolo OEM determinare la gestione dell'abbassamento del volume da parte dell'HAL, consigliamo le seguenti linee guida.
La riproduzione di più stream in Android si verifica in genere quando due app o servizi mantengono contemporaneamente lo stato attivo audio. Per scoprire quando Android può concedere lo stato attivo simultaneo, consulta la matrice di interazione in Tipi di limitazione. Con l'introduzione del plug-in audio per auto, dipende anche dalla gestione della messa a fuoco audio.
I flussi combinati da Android vengono eseguiti prima dell'applicazione di qualsiasi guadagno. Pertanto, qualsiasi flusso 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 di ducking consigliato
Di seguito sono riportate le potenziali interazioni simultanee consigliate.
Interazione | Azione |
---|---|
EMERGENCY
| Abbassano o disattivano l'audio di tutto tranne SAFETY
|
SAFETY |
Ducks everything except EMERGENCY |
NAVIGATION |
Tutto tranne SAFETY e EMERGENCY |
CALL |
Anatre tutto tranne SAFETY , EMERGENCY ,
e NAVIGATION |
VOICE |
Anatre CALL_RING |
VEHICLE_SOUNDS |
Sei tu a determinare l'importanza del suono attivo e se deve attenuare altri suoni. |
MUSIC e ANNOUNCEMENT |
Evitato da tutto. Fanno eccezione i toni di interazione touch riprodotti come
SYSTEM_SOUND .
|
Considerazioni sul ducking
Alcuni servizi e app, come la navigazione o un assistente, potrebbero utilizzare più player per eseguire azioni. Evita l'abbassamento aggressivo quando un flusso di dati smette di fluire attraverso i dispositivi di output per assicurarti che i contenuti multimediali non tornino al volume massimo prima di essere abbassati prima della riproduzione successiva dalla navigazione o dall'avvio di un'app assistente.
Per i veicoli con più palcoscenici sonori con un isolamento sufficiente, puoi indirizzare l'audio a diverse aree dell'auto anziché abbassarlo. Ad esempio, le istruzioni di navigazione possono essere indirizzate agli altoparlanti del poggiatesta del conducente, mentre la musica continua a essere riprodotta in tutto l'abitacolo a un volume normale.
Suoni critici per la sicurezza
Android 11 ha introdotto le
API HAL per la messa a fuoco audio. L'HAL garantisce
che i suoni critici per la sicurezza abbiano la priorità rispetto ad altri suoni. Se l'HAL mantiene la messa a fuoco
audio per USAGE_EMERGENCY
, non è garantito che app e servizi di
Android non riproducano suoni. L'HAL determina quali stream di Android devono
essere mixati o silenziati per riprodurre suoni critici per la sicurezza.
Configurare l'UI delle impostazioni del volume
AAOS separa 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 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 titolo e icona) associati a ogni
AudioAttributes.USAGE
definito. Questo file prevede un rendering ragionevole
del VolumeGroups
definito utilizzando le risorse associate al primo
utilizzo riconosciuto contenuto in ogni VolumeGroup
.
Ad esempio, il seguente esempio definisce un VolumeGroup
come includente
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 conoscere il volume attuale.registerVolumeChangeObserver()
per ricevere una notifica delle modifiche al volume.
Evento del gruppo di volume dell'auto
I casi d'uso automobilistici dell'aggiornamento del volume e dell'attivazione/disattivazione della modalità Silenzioso hanno basi contestuali che possono definire le azioni di determinate app, ad esempio le impostazioni del volume. Il volume attuale e il callback di disattivazione dell'audio dallo stack audio dell'auto forniscono informazioni contestuali limitate. Per gestire meglio i casi d'uso automobilistici e la scalabilità futura, CarVolumeGroupEvent viene 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 sui gruppi di volumi delle auto interessate. Ciò significa che l'app non deve effettuare chiamate
aggiuntive al framework audio dell'auto per ottenere lo stato più recente. Può
semplicemente utilizzare l'CarVolumeGroupInfos
ricevuto per aggiornare l'interfaccia utente o gli stati
interni. Per semplificare l'utilizzo delle app, gli aspetti modificati in un gruppo di volumi dell'auto
vengono forniti anche nell'ambito di EventTypes
, come spiegato di seguito.
EventTypes
Definisce quale aspetto di CarVolumeGroupInfo
è cambiato. Le app possono utilizzare questo valore per
identificare le modifiche e intraprendere le azioni richieste. Ad esempio,
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
indica che l'indice di
CarVolumeGroups
guadagno di volume massimo è cambiato e può essere interrogato da
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 per cui CarVolumeGroup
è cambiato. Le app
possono utilizzare queste informazioni per fornire un 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 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 riduzione è attiva e consentire all'utente
di modificare il volume.
Il framework audio dell'auto dipende da AudioControl HAL IAudioGainCallback
per
fornire il ExtraInfos
suggerito. Per saperne di più, consulta
Audio Gain Callback.
CarVolumeGroupEvent
si adatta per soddisfare le esigenze future del framework audio per auto. Intendiamo supportare nuove funzionalità solo tramite CarVolumeGroupEvent
. Consigliamo vivamente agli sviluppatori di app di utilizzare CarVolumeGroupEvent
per gestire le modifiche al volume e alla disattivazione dell'audio di gruppo.
Callback dell'evento del gruppo di volumi dell'auto
Android 14 fornisce un nuovo callback per le app privilegiate e
della piattaforma per registrarsi e ricevere notifiche di CarVolumeGroupEvents
.
Per registrarti al richiamo, utilizza
CarAudioManager#registerCarVolumeGroupEventCallback()
Per annullare la registrazione del callback, utilizza
CarAudioManager#unregisterCarVolumeGroupEventCallback()
Se un'app si registra con il nuovo CarVolumeGroupEventCallback
e il precedente
CarVolumeCallback
, l'evento CarVolumeGroupEventCallbacks
ha la priorità.
Lo stack audio dell'auto non attiva più CarVolumeCallback
. In questo modo si evitano
trigger duplicati per la stessa app per lo stesso evento.
Ti consigliamo vivamente di utilizzare CarVolumeGroupEventCallback
per gestire
il volume dei gruppi e le modifiche alla disattivazione dell'audio.
Callback del guadagno audio
A partire da Android 13, AudioControl HAL può attivare un callback asincrono per gestire gli aggiornamenti del livello del 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 l'HAL AudioControl. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Callback asincrono per notificare le modifiche alla configurazione del guadagno audio. |
Il callback AudioControl HAL include elenchi di motivi e i rispettivi
AudioGainConfigInfo
, che consiste in:
- ID zona
- Indirizzo porta del dispositivo
- Indice del volume > l'indice può essere un indice con limitazioni o un indice di aggiornamento.
I motivi possono essere suddivisi in grandi categorie:
- Motivi della limitazione. Modifica temporanea del volume e del comportamento di disattivazione dell'audio.
- Motivi dell'aggiornamento. Modifica permanente del comportamento del volume.
Tipi di limitazioni
A partire dal giorno AudioControl
HAL AIDL
V3
, i seguenti sono i tipi di limitazioni
supportate:
- 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 audio) ✔ (disattiva audio) |
Blocco | ❌ | ✔ |
Limitazione | ❌ (oltre il limite) ✔ (entro il limite) |
✔ |
Attenuazione | ✔ | ✔ |
La priorità tra le limitazioni è Silenziamento > Blocco > Limitazione > Attenuazione.
Limitazioni relative alla disattivazione audio
Le limitazioni per la disattivazione dell'audio sono:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Il framework audio dell'auto gestisce internamente questi due stati di disattivazione dell'audio:
Disattivazione dell'utente. Attivato/disattivato in base alla richiesta dell'utente, tramite
CarAudioManager
o eventi chiave.HAL mute. Attivato/disattivato in base alle limitazioni di disattivazione dell'audio ricevute tramite il callback
AudioGain
.
Per i listener come l'app Impostazioni, lo stato di disattivazione dell'audio complessiva del gruppo di volumi
(CarVolumeGroupInfo.isMuted()
) si baserà sull'attivazione di una delle
disattivazioni dell'audio sopra indicate.
Quando la disattivazione dell'audio HAL è attiva, tutte le richieste di modifica del volume e di riattivazione dell'audio del gruppo in entrata vengono ignorate per la durata della limitazione.
Scenario di interazione: la disattivazione dell'audio di HAL è attiva e l'utente richiede l'attivazione/disattivazione dell'audio
Quando la disattivazione audio HAL è attivata e la disattivazione audio utente è disattivata:
- Lo stato di disattivazione dell'audio complessivo del gruppo di volumi è cambiato in
true
. - Le richieste di attivazione della disattivazione dell'audio da parte dell'utente verranno elaborate.
- Motivo: le richieste di disattivazione dell'audio degli utenti devono essere sempre rispettate per tutelare la privacy degli utenti.
Quando la disattivazione audio HAL è abilitata e la disattivazione audio utente è abilitata:
Lo stato di disattivazione dell'audio complessivo del gruppo di volumi è cambiato in
true
.Le richieste dell'utente di disattivare la disattivazione dell'audio verranno elaborate
NOT
. Lo stato di disattivazione dell'audio dell'utente memorizzato nella cache rimane attivo.Motivo: le richieste di riattivazione dell'audio dell'utente verranno accettate solo se non sono presenti limitazioni attive.
Motivo: la riattivazione dell'audio dell'utente memorizzato nella cache potrebbe causare un'esplosione sonora involontaria e mettere a rischio la sicurezza dell'utente. Ciò è particolarmente vero se lo stato di disattivazione dell'audio è abilitato durante i cicli di accensione, il che riduce la consapevolezza degli utenti della percezione del livello sonoro.
Scenario di interazione: HAL Mute attivato e disattivato mentre User mute non subisce modifiche
L'attivazione/disattivazione della disattivazione dell'HAL cambierà lo stato di disattivazione generale del gruppo di volumi. Tuttavia, non aggiorna direttamente lo stato di disattivazione dell'audio dell'utente. Quando la disattivazione dell'audio dell'utente è disattivata e viene ricevuto il callback di disattivazione dell'audio HAL per l'attivazione:
- Lo stato di disattivazione dell'audio complessivo del gruppo di volumi è cambiato in
true
. Le richieste dell'utente di modificare il volume
NOT
verranno elaborate mentre il silenziamento HAL è attivo.Motivo: l'utente non riesce a percepire il suono quando la disattivazione dell'audio è attiva. Consentire la modifica del volume può causare un'esplosione sonora e mettere in pericolo la sicurezza dell'utente.
Motivo: le app di volume possono registrarsi per i callback e attivare la riattivazione dell'audio (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) automaticamente senza l'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 dell'audio del gruppo di volumi è cambiato in
false
.Motivo: rendere permanente lo stato di disattivazione dell'audio e richiedere all'utente di riattivarlo potrebbe interrompere inutilmente l'utente quando gli stati di disattivazione dell'audio cambiano frequentemente.
Le richieste degli utenti di modificare il volume verranno elaborate normalmente.
Blocco
Le limitazioni al blocco sono:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Quando le limitazioni di blocco sono attive, le richieste degli utenti di:
- La modifica del volume non viene elaborata.
- L'attivazione/disattivazione dell'audio viene elaborata.
Limitazione
Le limitazioni sono le seguenti:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Quando le limitazioni sono attive, le richieste degli utenti di:
Modificare il volume:
- Vengono elaborati entro i limiti
- La limitazione precedente non viene elaborata
L'attivazione/disattivazione dell'audio viene elaborata.
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:
Le modifiche al volume vengono elaborate. Il nuovo livello di volume attuale è impostato sul volume attenuato (anziché sul volume precedente). Le modifiche future del volume vengono apportate da questo livello.
L'attivazione/disattivazione dell'audio è in corso di elaborazione.
Aggiorna indice
Il seguente è considerato l'aggiornamento asincrono dell'indice dei volumi:
Reasons.EXTERNAL_AMP_VOL_FEEDBACK
.
Con 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 ad Apps come callback CarVolumeGroupEvent
per sincronizzare
l'indice.
Esempi
Caso d'uso: l'utente aggiorna l'indice del volume a 30
L'utente utilizza 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 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 dei trigger
AudioControl HAL
dei fornitori:IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {..., 15 /* New index */})
Il servizio audio dell'auto utilizza il nuovo indice del callback che viene utilizzato per la persistenza e i callback all'app del volume. L'indice richiesto dall'utente è 30. Tuttavia, l'aggiornamento asincrono del feedback 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 elevato di 95 (intervallo: [0-99]).
Android entra in modalità di sospensione.
Una volta che Android esiste, sospendi (ad esempio, riprendi):
Il fornitore
Audio HAL/AudioControl HAL
applica un indice di sicurezza di 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 che viene utilizzato per la persistenza e i propri callback per l'app del volume che sincronizza l'indice. L'indice del volume prima della sospensione è 95. Tuttavia, dopo la ripresa, questo indice viene impostato a un livello di volume sicuro di 30 dall'implementatore
AudioControl HAL
.
Configurazione dinamica del volume
Per questa funzionalità, prendiamo in considerazione i seguenti casi d'uso principali:
Configurazione di fine linea (EOL) del veicolo.
I produttori di automobili preferiscono aggiornare le configurazioni del volume alla fine del ciclo di vita in base alla configurazione dell'impianto 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 manutenzione.
Configurazione di runtime. Gli impianti audio per auto supportano configurazioni di amplificatori esterni e queste ECU possono ospitare le configurazioni dell'intervallo di volume che vengono interrogate durante l'avvio.
Configurazione on demand. Offerta per soddisfare la crescente necessità di funzionalità audio basate sulla domanda in cui gli utenti si abbonano all'elaborazione avanzata del segnale per un determinato periodo di tempo. Le nuove configurazioni dell'intervallo di volume sono valide per la durata di un abbonamento.
Design
La configurazione dinamica dei volumi viene eseguita in tre fasi:
Scoperta. L'implementazione di AudioControl HAL del fornitore rileva i 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
.Aggiornamento. Lo stack audio dell'auto aggiorna gli stati del gruppo 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 non rientra nei limiti, l'indice del volume corrente viene impostato su un valore sicuro. Ad esempio, il livello predefinito fornito dal fornitore durante il callback.
Richiamata.
Dopo 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, Event-type (what changed) e Extra-info (why it changed).
Figura 2. Configurazione dinamica del volume.
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 impostata in precedenza con AudioControl HAL. |
IModuleChangeCallback#onAudioPortsChanged | Callback per notificare le modifiche ad AudioPorts |
Sequenza
Di seguito è riportato il diagramma di sequenza della configurazione dinamica dei volumi.
Figura 3. Diagramma di sequenza per la configurazione dinamica dei volumi.
Aspetti chiave
Per ottimizzare questa funzionalità, tieni presente quanto segue.
Gli AudioPort forniti nell'ambito del callback devono corrispondere alla definizione di Automotive BUS:
- 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 dell'intervallo di volume nel criterio HAL audio e utilizzare il callback per personalizzarlo per le varianti del veicolo. Per saperne di più, consulta la definizione AIDL di
IModuleChangeCallbac
.Quando più BUS audio appartengono allo stesso gruppo di volumi, ognuno deve avere definizioni di intervallo di volume identiche. In caso contrario, il framework audio dell'auto rifiuterà la nuova definizione dell'intervallo di volume.