In Android 10, car_audio_configuration.xml
sostituisce
car_volumes_groups.xml
e IAudioControl.getBusForContext
.
Nel nuovo file di configurazione, viene definito un elenco di zone. Ogni zona ha uno o più
gruppi di volume con i dispositivi associati e ogni dispositivo include i contesti
deve essere indirizzato all'interno di quella zona. È obbligatorio che tutti i contesti siano rappresentati
all'interno di ciascuna zona.
Configurazione del routing audio
I file dei criteri audio, che in genere si trovano nella partizione del fornitore, rappresentano
la configurazione hardware audio della scheda. Tutti i dispositivi a cui viene fatto riferimento in
car_audio_configuration.xml
deve essere definito all'interno del
audio_policy_configuration.xml
.
Attivazione del routing AAOS
Per utilizzare il routing basato su AAOS, devi impostare il
audioUseDynamicRouting
flag per true
:
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
Quando false
, il routing e gran parte di CarAudioService
verranno disattivati e
il sistema operativo ricorrerà al comportamento predefinito di AudioService
.
Zona principale
Per impostazione predefinita, tutto l'audio verrà indirizzato alla zona principale. È possibile
una zona principale, indicata nella configurazione dall'attributo
isPrimary="true"
.
Configurazione di esempio
Ad esempio, un veicolo potrebbe avere due zone: una principale e un sedile posteriore.
un sistema di intrattenimento basato su cloud. Detto questo, car_audio_configuration.xml
sarebbe definito come segue:
<audioZoneConfiguration version="2.0"> <zone name="primary zone" isPrimary="true"> <volumeGroups> <group> <device address="bus0_media_out"> <context context="music"/> <context context="announcement"/> </device> <device address="bus3_call_ring_out"> <context context="call_ring"/> </device> <device address="bus6_notification_out"> <context context="notification"/> </device> <device address="bus7_system_sound_out"> <context context="system_sound"/> <context context="emergency"/> <context context="safety"/> <context context="vehicle_status"/> </device> </group> <group> <device address="bus1_navigation_out"> <context context="navigation"/> </device> <device address="bus2_voice_command_out"> <context context="voice_command"/> </device> </group> <group> <device address="bus4_call_out"> <context context="call"/> </device> </group> <group> <device address="bus5_alarm_out"> <context context="alarm"/> </device> </group> </volumeGroups> </zone> <zone name="rear seat zone" audioZoneId="1"> <volumeGroups> <group> <device address="bus100_rear_seat"> <context context="music"/> <context context="navigation"/> <context context="voice_command"/> <context context="call_ring"/> <context context="call"/> <context context="alarm"/> <context context="notification"/> <context context="system_sound"/> <context context="emergency"/> <context context="safety"/> <context context="vehicle_status"/> <context context="announcement"/> </device> </group> </volumeGroups> </zones> </audioZoneConfiguration>
In questo caso, la zona principale ha separato i contesti per dispositivi diversi. Ciò consente
all'HAL per applicare diversi effetti di post-elaborazione e mescolare sull'output del dispositivo
utilizzando l'hardware del veicolo. I dispositivi sono stati organizzati in quattro gruppi di volumi:
contenuti multimediali, navigazione, chiamate e sveglie. Se il sistema è configurato
useFixedVolume
, verranno superati i livelli di volume per ogni gruppo
sull'HAL da applicare all'output di questi dispositivi.
Per la zona secondaria, l'output previsto è tramite un singolo dispositivo di output. In questo esempio, tutti gli utilizzi vengono indirizzati al singolo dispositivo e gruppo di volume a per semplificare le cose.
Configurazione audio della zona degli occupanti
In Android 11, la car_audio_configuration.xml
è stata ulteriormente estesa a
introducono due nuovi campi, audioZoneId
e occupantZoneId
.
La prima, audioZoneId
, può essere utilizzata per controllare meglio la gestione delle zone.
Invece, occupantZoneId
può essere utilizzato per configurare le campagne basate su ID utente
il routing.
Per utilizzare questi nuovi campi, la V2 di car_audio_configuration.xml
obbligatorio. Riesaminare la configurazione audio indicata sopra, ma utilizzare il nuovo campo per
ID zona degli occupanti e mappatura ID zona audio, la nuova configurazione senza volume
Le definizioni dei gruppi possono essere impostate come segue:
<audioZoneConfiguration version="2.0"> <zone name="primary zone" isPrimary="true" occupantZoneId="0"> ... </zone> <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1"> ... </zone> </zones> </audioZoneConfiguration>
La configurazione precedente definisce una mappatura della zona principale alla zona degli occupanti 0.
audioZoneId
da 1 a occupantZoneId
1. In generale, qualsiasi mappatura
tra zona occupante e zona audio può essere configurata, ma la mappatura deve essere one-to-one.
Di seguito sono riportate le regole che hanno definito i due nuovi campi:
- Il valore
audioZoneId
per la zona principale è sempre zero - I numeri
audioZoneId
eoccupantZoneId
non possono essere ripetuti audioZoneId
eoccupantZoneId
possono avere una sola mappatura 1:1
Routing tramite un UID dell'applicazione
È stata introdotta una serie di API nascoste in CarAudioManager
su 10 per consentire alle app
eseguire query e impostare zone e focus audio.
int[] getAudioZoneIds(); int getZoneIdForUid(int uid); boolean setZoneIdForUid(int zoneId, int uid); boolean clearZoneIdForUid(int uid);
Le API precedenti consentivano a un'applicazione proprietaria di gestire il routing audio
sull'UID di un'applicazione. Di conseguenza, sia l'ID zona audio sia l'UID dell'applicazione sono
necessario. Tenendo disponibili queste informazioni, il routing audio può essere impostato utilizzando il metodo
API CarAudioManager#setZoneIdForUid
.
Cambiare le zone per un'app
Per impostazione predefinita, tutti i percorsi audio vengono indirizzati alla zona principale. Aggiornare un'applicazione in modo che
indirizzato a una zona diversa, usa CarAudioManager#setZoneIdForUid
:
// Find zone to play int zoneId = ... // Find application's uid Int uid = mContext.getPackageManager() .getApplicationInfo(mContext.getPackageName(), 0) .uid; if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) { Log.d(TAG, "Zone successfully updated"); } else { Log.d(TAG, "Failed to change zone"); }
No Nota:i flussi e lo stato attivo non possono cambiare zona in modo dinamico. Pertanto, la riproduzione deve essere interrotta e una nuova richiesta di messa a fuoco per cambiare zona.
Routing con ID utente
Mentre il routing basato su UID di un'applicazione consente il controllo granulare dei
il routing audio, richiede anche che il routing audio per ogni applicazione sia definito prima
all'applicazione che richiede effettivamente il focus audio e riproduce audio. Per limitare questo
problemi e facilitare ulteriormente le applicazioni di terze parti a riprodurre audio senza modifiche,
CarAudioService
utilizza la mappatura della zona degli occupanti dell'auto e delle zone audio per definire
il routing basato sull'ID utente. In questo modo, quando un utente accede alla zona degli occupanti, l'audio dell'auto
viene avvisato. Con questo segnale, la gestione e il routing della messa a fuoco dell'audio vengono automaticamente
e configurata per tutte le zone audio.
Il routing basato sull'UID delle applicazioni può comunque essere utilizzato, ma deve essere eseguito indipendentemente
routing ID utente. Ciò significa che se la mappatura delle zone degli occupanti alle zone audio dell'auto è
definito, il routing basato su UID viene disattivato e tenta di chiamare
CarAudioManager#setZoneidForUid
restituirà un errore.
Il routing audio e la gestione della messa a fuoco sono stati semplificati grazie alla zona degli occupanti
l'utente deve essere comunque assegnato a una zona degli occupanti. Questa operazione può essere eseguita
utilizzando l'CarOccupantZoneManager#assignProfileUserToOccupantZone
. Questo
L'API richiede l'autorizzazione per gestire gli utenti. L'attuale aspettativa che gli OEM debbano gestire
l'assegnazione tra l'utente e la zona del passeggero attraverso una sorta di UI di sistema. Al termine, fai domanda
l'avvio, il routing audio e la gestione dello stato attivo saranno configurati automaticamente per l'utente.
Routing con setPreferredDevice
Oltre alle modifiche precedenti, Android 11 ha anche una nuova API per eseguire query sui dispositivi di output associato a ogni zona, CarAudioManager#getOutputDeviceForUsage(int zoneId, int utilizzo).
L'API può essere utilizzata per interrogare un dispositivo di output per una zona specifica e un attributo audio
all'utilizzo delle risorse. In questo modo le applicazioni proprietarie possono indirizzare l'audio a zone diverse
utilizzando l'API setPreferredDevice
del player. La
L'API getOutputDeviceForUsage
richiede
PERMISSION_CAR_CONTROL_AUDIO_SETTINGS
ed è un'API di sistema. Di seguito è riportato un
esempio di come trovare il dispositivo multimediale per una determinata zona e di instradarlo a quel dispositivo
usando l'API setPreferredDevice
.
audioZoneId = ... ; mediaDeviceInfo = mCarAudioManager .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA); … mPlayer.setPreferredDevice(mediaDeviceInfo);