Prima di avviare uno stream logico, un'app richiede l'attenzione audio utilizzando gli stessi attributi audio utilizzati per lo stream logico. L'app deve rispettare le perdite di attenzione per funzionare come previsto nei casi d'uso nel settore auto e motori.
Sebbene l'invio di una richiesta di messa a fuoco sia consigliato, non è impostato dal sistema. Pertanto, considera l'attenzione come un mezzo per controllare indirettamente ed evitare conflitti durante la riproduzione, anziché come un meccanismo di controllo audio principale. Il veicolo non deve dipendere dal sistema di messa a fuoco per il funzionamento del sottosistema audio.
Interazioni con lo stato attivo
Per supportare AAOS, le richieste di attenzione audio vengono gestite in base a interazioni predefinite tra il CarAudioContext
della richiesta e quello dei detentori dell'attenzione attuali. Esistono tre tipi di interazioni:
- Esclusiva
- Rifiuta
- Contemporaneamente
Interazione esclusiva
Questo è il modello di interazione più comunemente utilizzato con Android.
Nelle interazioni esclusive, solo un'app può avere il focus alla volta.
Pertanto, a una richiesta di messa a fuoco in arrivo viene concessa la messa a fuoco, mentre il detentore della messa a fuoco esistente perde la messa a fuoco. Poiché entrambe le app riproducono contenuti multimediali, solo una può avere il controllo. Di conseguenza, la richiesta di attenzione dell'app appena avviata viene restituita con
AUDIOFOCUS_REQUEST_GRANTED
, mentre l'app di musica in riproduzione corrente riceve un
evento di modifica dell'attenzione con uno stato di perdita corrispondente al tipo di richiesta
effettuata.
Rifiutare l'interazione
Con le interazioni reject, la richiesta in arrivo viene sempre rifiutata. Ad esempio, quando provi a riprodurre musica durante una chiamata. In questo
caso, se Telefono ha lo stato attivo per una chiamata e una seconda app richiede lo stato attivo per riprodurre musica, l'app di musica riceve AUDIOFOCUS_REQUEST_FAILED
in risposta alla richiesta. Poiché la richiesta di attenzione viene rifiutata, non viene inviata alcuna perdita di attenzione al detentore dell'attenzione corrente.
Interazione simultanea
Un'interazione contemporanea è un'interazione unica di AAOS. In questo modo, le app che richiedono il controllo audio nell'auto possono mantenere il controllo contemporaneamente ad altre app. Affinché si verifichi un'interazione simultanea, devono essere soddisfatte le seguenti condizioni. La
La richiesta di attenzione in entrata deve richiedere AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
Il detentore dell'attenzione corrente non setPauseWhenDucked(true)
L'attuale detentore dell'attenzione sceglie di non ricevere eventi di attenuazione automatica
Se questi criteri sono soddisfatti, la richiesta di attenzione viene restituita con
AUDIOFOCUS_REQUEST_GRANTED
, mentre l'attuale detentore dell'attenzione non subisce alcuna variazione. Tuttavia, se l'elemento attualmente attivo sceglie di ricevere eventi di ducking o di mettere in pausa quando è in modalità ducking, perde lo stato attivo, come accade con un'interazione esclusiva.
Gestire gli stream simultanei
Sebbene l'interazione simultanea abbia numerosi utilizzi, fai attenzione al mixing e al ducking a livello hardware sui dispositivi di output. Ti consigliamo vivamente di indirizzare le istanze di CarAudioContext
consentite per la riproduzione contemporanea a dispositivi di output diversi.
Avere dispositivi di output separati per gli stream simultanei consente all'HAL di disattivare uno degli stream prima di combinarli o di instradare gli stream fisici a diversi altoparlanti del veicolo. Se gli stream logici vengono combinati all'interno di Android, i guadagni rimangono invariati e vengono trasmessi nell'ambito dello stesso stream fisico.
Ad esempio, quando la navigazione e i contenuti multimediali vengono trasmessi contemporaneamente, l'amplificazione per lo stream multimediale potrebbe essere ridotta temporaneamente (o attenuata) in modo che le istruzioni di navigazione possano essere ascoltate più chiaramente. In alternativa, lo stream di navigazione potrebbe essere indirizzato agli altoparlanti lato guida mentre i contenuti multimediali continuano a essere riprodotti nel resto dell'abitacolo.
Matrice di interazione
Questa tabella mostra la matrice di interazione come definita da CarAudioService
.
Ogni riga rappresenta il CarAudioContext
dell'elemento attualmente attivo e ogni colonna rappresenta quello della richiesta in arrivo.
Ad esempio, quando un'app di contenuti multimediali musicali ha il focus mentre un'app di navigazione richiede il focus, la matrice indica che le due interazioni possono essere riprodotte contemporaneamente, assumendo che gli altri criteri per le interazioni simultanee siano soddisfatti.
A causa delle interazioni simultanee, è possibile avere più di un detentore dell'attenzione. In questo caso, una richiesta di messa a fuoco in entrata viene confrontata con ciascuno dei detentori dell'attenzione corrente prima di determinare quale interazione applicare. In questo caso, vince l'interazione più conservativa. Rifiuta, poi esclusivo e infine simultaneo.
Figura 1. Matrice di interazione del focus audio.
Navigazione durante le telefonate
In Android 11 è stata introdotta una nuova impostazione utente per consentire agli utenti di modificare il comportamento di interazione tra navigazione e chiamate. Se impostato,
android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL
modifica l'Interaction tra le richieste di attenzione NAVIGATION
in arrivo e i detentori di attenzione CALL
attuali da simultanea a rifiuta. Se un utente preferisce che le istruzioni di navigazione non interrompano una chiamata, può attivare l'impostazione. Questo valore rimane costante per l'utente e può essere impostato in modo dinamico in modo che le richieste di messa a fuoco successive rispettino la nuova impostazione.
Focus audio posticipabile
In Android 11, AAOS ha aggiunto il supporto per la richiesta dell'attenzione audio posticipabile. In questo modo, le richieste di immissione non transitorie possono essere ritardate quando la loro interazione con i detentori dell'input corrente normalmente ne comporterebbe il rifiuto. Una volta che un cambio di stato dell'attenzione genera uno stato in cui la richiesta in ritardo può acquisire l'attenzione, la richiesta viene concessa.
Regole per le richieste di messa a fuoco audio ritardate
Solo richieste non transitorie. Una richiesta in ritardo può essere effettuata solo per le fonti non transitorie, per evitare che un suono transitorio venga riprodotto molto tempo dopo che è stato registrato.
È possibile ritardare una sola richiesta alla volta. Se viene fatta una richiesta ritardabile quando è già presente una richiesta ritardata, la richiesta ritardata originale riceve un evento di modifica
AUDIOFOCUS_LOSS
e la nuova richiesta riceve una risposta sincrona diAUDIOFOCUS_REQUEST_DELAYED
.Le richieste posticipabili devono avere
OnAudioFocusChangeListener
. Dopo che una richiesta viene ritardata, l'ascoltatore viene utilizzato per notificare al richiedente quando la richiesta viene finalmente concessa (AUDIOFOCUS_GAIN
) o se viene rifiutata in un secondo momento (AUDIOFOCUS_LOSS
).
Richiedi messa a fuoco posticipabile
Per creare una richiesta che può essere ritardata:
Utilizza
AudioFocusRequest.Builder#setAcceptsDelayedFocusGain
.mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener(); mDelayedFocusRequest = new AudioFocusRequest .Builder(AudioManager.AUDIOFOCUS_GAIN) .setAudioAttributes(mMusicAudioAttrib) .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener) .setForceDucking(false) .setWillPauseWhenDucked(false) .setAcceptsDelayedFocusGain(true) .build();
Quando effettui la richiesta, gestisci la risposta
AUDIOFOCUS_REQUEST_DELAYED
:int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest); if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // start audio playback return; } if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) { // audio playback delayed to audio focus listener return; }
Quando la richiesta è in ritardo, l'ascoltatore dell'attenzione gestisce le modifiche dell'attenzione:
private final class MediaWithDelayedFocusListener implements OnAudioFocusChangeListener { @Override public void onAudioFocusChange(int focusChange) { synchronized (mLock) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: … // Start focus playback case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: … // Pause media transiently case AudioManager.AUDIOFOCUS_LOSS: … // Stop media
Dissolvenza impostata dal sistema
Android 15 introduce l'attenuazione audio forzata dal sistema in AAOS. In Android, il controllo audio non viene applicato dal sistema. Pertanto, sebbene gli sviluppatori di app siano invitati a rispettare le linee guida relative al controllo audio, se un'app continua a riprodurre l'audio ad alto volume anche dopo aver perso il controllo audio, il sistema non può impedirlo.
Negli ambienti automobilistici critici per la sicurezza, l'aderenza al focus audio è fondamentale per ridurre al minimo la distrazione del conducente. Con questa funzionalità, il framework audio ora attenua automaticamente le app che perdono l'attenzione audio, per un'esperienza audio più controllata e prevedibile.
Questo miglioramento contribuisce a garantire che le app rispettino la decisione di perdita dell'attenzione audio come definita dalla matrice di interazione, evitando conflitti di riproduzione audio.
Design di alto livello
La figura seguente mostra il design di alto livello e il supporto della funzionalità di perdita di messa a fuoco nelle auto:
Figura 2. Progettazione di alto livello per la funzionalità di dissolvenza impostata dal sistema.
- Disattivazione audio mirata:l'applicazione forzata della disattivazione audio in Android 15 è progettata specificamente per le situazioni in cui un'app perde l'attenzione audio, ma continua a riprodurre l'audio.
- Meccanismo di attenuazione: quando un'app perde lo stato attivo audio a favore di una nuova app che effettua la richiesta:
- Il framework audio attenua automaticamente l'audio dell'app in perdita.
- Al termine del fade-out, lo stream audio viene disattivato dal sistema.
- L'app riceve quindi una notifica di perdita dell'attenzione audio.
- Le app che si comportano male vengono silenziate finché non riprendono il controllo dell'audio.
- La logica predefinita è quella di attenuare le app che vengono attenuate dopo 2 secondi. Tuttavia, gli OEM possono configurarlo su qualsiasi valore di timeout.
- Il framework audio utilizza le configurazioni OEM sia per le operazioni di dissolvenza in entrata sia per quelle in uscita.
File di configurazione OEM: Android 15 include un nuovo file di configurazione,
car_audio_fade_configuration.xml
:- Questo file consente agli OEM di definire i criteri per l'applicazione dell'applicazione dell'audio di sistema a un'app in perdita.
- Il framework audio applica l'attenuazione e l'eliminazione dell'audio solo se l'app in perdita corrisponde alle regole definite dall'OEM in questo file XML.
- Questo fornisce un meccanismo per consentire agli OEM di personalizzare il comportamento della funzionalità in base alle caratteristiche dell'app o ai tipi di utilizzo audio.
Controllo delle funzionalità con RRO: è stato introdotto un nuovo flag di funzionalità di overlay delle risorse di runtime (RRO),
audioUseFadeManagerConfiguration
, per attivare o disattivare questa funzionalità:- La funzionalità è disattivata per impostazione predefinita.
- Per attivare la perdita di attenzione audio impostata dal sistema, gli OEM devono impostare questo flag su
true
. - Sebbene il framework audio per auto preveda definizioni di configurazione di dissolvenza valide quando il flag è attivato, l'assenza di queste definizioni non comporta automaticamente un'eccezione fatale.
- Tutte le app delle configurazioni di dissolvenza devono avere definizioni di dissolvenza corrispondenti. È un errore irreversibile richiamare una configurazione di dissolvenza (per il nome) nell'ambito della configurazione dell'audio della auto senza fornire una definizione valida.
- Quando il flag è disattivato, tutte le definizioni di configurazione di dissolvenza e eventuali riferimenti alla configurazione vengono ignorati.
Configurazione del gestore di attenuazione
Il framework audio di Android 15 introduce un FadeManagerConfiguration
uniforme per fornire agli OEM un controllo granulare sul comportamento di dissolvenza audio. Questo framework è illustrato nella Figura 3:
Figura 3. Configurazione del gestore di dissolvenza.
Questa configurazione include:
- Proprietà di transizione con dissolvenza:impostazioni per la dissolvenza in entrata e in uscita.
- Può essere definito con utilizzi o attributi audio specifici.
- Consente di impostare durate personalizzate.
- Queste impostazioni vengono utilizzate per creare
VolumeShaper.Configuration
.
- Norme di dissolvenza:regole che regolano quando si verifica la dissolvenza.
- Un pulsante di attivazione/disattivazione globale per attivare o disattivare l'attenuazione.
- Un elenco configurabile di utilizzi audio attenuabili (idonei per l'attenuazione al verificarsi di una perdita di attenzione).
- Gli elenchi di esclusione (non attenuabili) impediscono l'attenuazione delle sorgenti audio fondamentali o designate. Questi elenchi possono essere basati su:
- Tipi di contenuti
- Attributi audio
- UID app (possono essere impostati solo in fase di esecuzione)
Configurazioni OEM
In questa sezione vengono esaminate le personalizzazioni OEM disponibili.
File XML di configurazione dell'attenuazione audio dell'auto
Android 15 introduce un nuovo file di configurazione,car_audio_fade_configuration.xml
, che consente un'ampia personalizzazione da parte dell'OEM del comportamento di attenuazione dell'audio in caso di perdita di attenzione.
- Questo file XML consente di definire più configurazioni di dissolvenza distinte, ciascuna delle quali richiede un nome univoco per i riferimenti incrociati all'interno di
car_audio_configuration.xml
. - Queste configurazioni possono essere applicate in modo flessibile a diverse zone audio e configurazioni di zone.
- In particolare, ogni configurazione di dissolvenza accetta solo valori di durata in millisecondi, che il sistema utilizza poi per generare internamente il valore
VolumeShaper.Configuration
corrispondente.
Per indicazioni pratiche sull'implementazione, consulta le configurazioni di esempio fornite per l'emulatore all'indirizzo
device/generic/car/emulator/audio/car_audio_fade_configuration.xml
.
File XML di configurazione dell'impianto audio dell'auto
Android 15 introduce un file car_audio_configuration.xml
aggiornato, ora nella versione 4, che incorpora nuovi tag applyFadeConfigs
e fadeConfig
.
Il tag applyFadeConfigs
può contenere più definizioni di fadeConfig
,
consentendo una configurazione flessibile dell'effetto dissolvenza. Ogni definizione:
- Deve includere un
fadeConfig
predefinito contrassegnato conisDefault = true
. - Può includere più definizioni
fadeConfig
transitorie. Queste configurazioni transitorie vengono applicate specificamente durante le interazioni con perdita dell'attenzione audio e solo quando l'app che acquisisce l'attenzione audio corrisponde ai criteri definiti all'interno della configurazione transitoria.
Per indicazioni pratiche sull'implementazione, consulta le configurazioni di esempio fornite per l'emulatore all'indirizzo
device/generic/car/emulator/audio/car_audio_configuration.xml
.
Estensione di servizio per l'audio in primo piano OEM
Gli OEM che implementano un servizio di messa a fuoco audio personalizzato per l'auto hanno la possibilità di configurare le impostazioni di attenuazione audio includendole in OemCarAudioFocusResult
.
Questo risultato può essere ottenuto utilizzando il metodo del compilatore setAudioAttributesToCarAudioFadeConfigurationMap()
:
/** @see OemCarAudioFocusResult#getAudioAttributesToCarAudioFadeConfigurationMap() **/
@NonNull
public Builder setAudioAttributesToCarAudioFadeConfigurationMap(@NonNull
Map<AudioAttributes, CarAudioFadeConfiguration> attrsToCarAudioFadeConfig) {
}
In particolare, gli OEM possono scegliere di utilizzare le impostazioni di attenuazione preconfigurate al momento dell'avvio o applicare dinamicamente le configurazioni tramite il proprio servizio di attenzione audio personalizzato, offrendo un controllo adattabile.
Diagramma di sequenza
Questo diagramma di sequenza illustra il comportamento dopo l'assegnazione dell'audio focus a App2
e la successiva perdita dell'audio focus da parte di App1
:
- Quando il servizio audio dell'auto invia la perdita dell'attenzione audio a
App1
, la riproduzione dal playerApp1
subisce un'attenuazione come definito daiFadeManagerConfiguration
attivi. Al termine dell'operazione di dissolvenza in uscita,App1
riceve la chiamata di ritorno standard per la perdita dell'attenzione audio. - Facoltativamente, l'audio di
App1
può essere attenuato di nuovo dopo una durata configurabile. Gli OEM hanno la possibilità di impostare questa durata tramiteBuilder#setFadeInDurationForUsage(int, long)
in base ai loro requisiti specifici del prodotto.
Figura 4. Diagramma di sequenza per la funzionalità di attenuazione dell'audio dell'auto.
Gestione dell'attenzione multizona
Per i veicoli con più zone audio, l'attenzione audio viene gestita in modo indipendente per ogni zona. Di conseguenza, una richiesta in una zona non tiene conto di ciò che ha il controllo in altre zone né fa perdere il controllo ai detentori del controllo in altre zone. In questo modo, lo stato attivo dell'abitacolo principale può essere gestito separatamente da un sistema di intrattenimento per i sedili posteriori, evitando così di interrompere la riproduzione audio in una zona a causa di modifiche apportate in un'altra.
Per tutte le app, CarAudioService
gestisce automaticamente lo stato attivo. La zona audio di una richiesta di attenzione è determinata dal relativo UserId
o UID
associato (per maggiori dettagli, consulta Instradamento audio multizona).
Richiedere l'audio da più zone contemporaneamente
Se un'app vuole riprodurre audio in più zone contemporaneamente, deve richiedere il focus per ogni zona includendo AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
nel bundle:
//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
zoneId);
AudioAttributes attributesWithZone = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.addBundle(bundle)
.build();
//Create focus request using built attributesWithZone
Questo parametro del bundle consente all'autore della richiesta di ignorare le mappature automatiche delle zone audio per utilizzare l'ID zona specificato. Di conseguenza, un'app potrebbe emettere richieste separate per zone audio diverse.
Messa a fuoco audio HAL
A partire da Android 11, l'HAL è abilitato a richiedere lo stato attivo per conto di stream esterni. Sebbene facoltativo, l'utilizzo di queste API è vivamente consigliato per consentire ai suoni esterni di essere componenti ottimali dell'ecosistema Android e per offrire un'esperienza utente fluida.
L'HAL prende la decisione finale su quali suoni devono avere la priorità. In questo senso, gli avvisi sonori critici per la sicurezza e le emergenze devono essere riprodotti indipendentemente dal fatto che all'HAL sia stato concesso o meno l'audio focus e devono continuare a essere riprodotti come appropriato anche se l'HAL perde l'audio focus. Lo stesso vale per qualsiasi suono richiesto dalle normative governative.
L'HAL deve disattivare in modo proattivo gli stream di Android, se opportuno, durante la riproduzione di suoni di emergenza o di sicurezza per garantire che vengano ascoltati chiaramente.
AudioControl@2.0
La versione 2.0 dell'HAL AudioControl introduce queste nuove API:
API | Finalità |
---|---|
IAudioControl#registerFocusListener |
Registra un'istanza di IFocusListener con l'HAL AudioControl. Questo ascoltatore consente all'HAL di richiedere e abbandonare l'attenzione audio. L'HAL fornisce un'istanza ICloseHandle da utilizzare da parte di Android per annullare la registrazione dell'ascoltatore. |
IAudioControl#onAudioFocusChange |
Invia una notifica all'HAL delle modifiche dello stato delle richieste di messa a fuoco effettuate dall'HAL tramite IFocusListener , incluse le risposte alle richieste di messa a fuoco iniziali. |
IFocusListener#requestAudioFocus |
Richiede il fuoco per conto dell'HAL per un utilizzo, un ID zona e un tipo di guadagno del fuoco specificati. |
IFocusListener#abandonAudioFocus |
Abbandona le richieste di attenzione HAL esistenti per l'utilizzo e l'ID zona specificati. |
L'HAL può avere più richieste di messa a fuoco contemporaneamente, ma è limitato a una richiesta per accoppiamento di utilizzo e ID zona. Android presuppone che l'HAL inizi immediatamente a riprodurre i suoni per un utilizzo dopo che è stata effettuata una richiesta e continui a farlo finché non perde lo stato attivo.
A parte registerFocusListener
, queste richieste sono oneway
per garantire che Android non ritardi l'HAL durante l'elaborazione di una richiesta di messa a fuoco. L'HAL non deve
non attendere di acquisire lo stato attivo prima di riprodurre suoni critici per la sicurezza. È facoltativo per l'HAL ascoltare e rispondere alle modifiche dell'attenzione audio tramite IAudioControl#onAudioFocusChange
.
Servizio di attivazione audio in auto OEM
In Android 14, AAOS ha introdotto i servizi plug-in OEM per auto per abilitare la configurabilità di alcuni componenti dell'auto. Per il servizio di plug-in per l'impianto audio dell'auto, il servizio di plug-in consente agli OEM di gestire le richieste di messa a fuoco intercettate dal servizio di impianto audio dell'auto. Ciò offre agli OEM una maggiore flessibilità in termini di gestione dell'attenzione in base alle regole e ai regolamenti. Di conseguenza, l'interazione con l'audio potrebbe variare da un produttore all'altro e da una regione all'altra. La premessa di base per l'attenzione audio rimane valida: le app devono comunque richiedere l'attenzione per una gestione migliore dell'audio al fine di migliorare l'esperienza utente. In generale, per la richiesta di attenzione audio da parte delle app valgono ancora alcune regole:
In assenza di un'attenzione audio di alta priorità (inclusa una chiamata, un avviso di emergenza o una notifica di sicurezza), le app dovrebbero essere in grado di acquisire l'attenzione audio in modo temporaneo o permanente.
Quando è attivo un'attenzione multimediale:
Le app che richiedono l'attenzione per l'utilizzo delle chiamate devono essere in grado di ricevere la chiamata contemporaneamente o in modo esclusivo.
Le app che richiedono l'attenzione per l'utilizzo della navigazione devono essere in grado di ricevere l'attenzione per la navigazione contemporaneamente o esclusivamente.
Le app che richiedono l'attenzione per l'utilizzo dell'assistente devono essere in grado di ricevere l'attenzione per l'utilizzo contemporaneamente o esclusivamente.
Quando sono attive app con attenzione audio ad alta priorità (inclusa una chiamata, un avviso di emergenza o una notifica di sicurezza), qualsiasi richiesta di attenzione audio in ritardo in arrivo deve essere concessa o ritardata in base alle esigenze.
Anche se questi suggerimenti non sono esaustivi, possono aiutare le app che richiedono il silenzio attivo a ottenerlo se non sono presenti suoni ad alta priorità attivi. Anche quando sono attivi suoni con priorità elevata, le richieste di messa a fuoco ritardata devono essere rispettate e devono essere in grado di acquisire il controllo quando il suono con priorità elevata si interrompe.