Routing dell'audio

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 e occupantZoneId non possono essere ripetuti
  • audioZoneId e occupantZoneId 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);