Audio per auto e motori

Android Automotive OS (AAOS) si basa sullo stack audio Android principale per supportare i casi d'uso per l'uso come sistema di infotainment di un veicolo. AAOS è responsabile dei suoni di infotainment (ovvero contenuti multimediali, navigazione comunicazioni) ma non è direttamente responsabile dei cicalini e degli avvisi che hanno di disponibilità e tempistiche rigide. Sebbene AAOS fornisca indicatori e meccanismi per aiutare il veicolo a gestire l'audio, alla fine spetta al veicolo a decidere quali suoni devono essere riprodotti per il conducente e passeggeri, verificando che i suoni critici per la sicurezza e quelli normativi siano adeguatamente udibili senza interruzioni.

Poiché Android gestisce l'esperienza multimediale del veicolo, le fonti multimediali esterne come il sintonizzatore radio, deve essere rappresentato da app, in grado di gestire l'audio gli eventi chiave e i principali eventi multimediali per la fonte.

Android 11 include le seguenti modifiche all'audio relativo alle auto e motori assistenza:

Audio e stream Android

I sistemi audio per automobili gestiscono i seguenti suoni e stream:

Diagramma dell'architettura basata sui flussi

Figura 1. Diagramma dell'architettura basata sui flussi

Android gestisce i suoni provenienti dalle app per Android, controllando queste app e indirizzare i suoni ai dispositivi di uscita dell'HAL in base al tipo suono:

  • Stream logici, noti come sorgenti nell'audio principale sono contrassegnate da attributi audio.
  • Stream fisici, noti come dispositivi nell'audio principale non avere informazioni di contesto dopo la combinazione.

Per l'affidabilità, suoni esterni (provenienti da suoni come i cicalini di avviso delle cinture di sicurezza) sono gestite al di fuori di Android, sotto le HAL o anche in hardware separato. Gli implementer del sistema devono fornire un mixer accetta uno o più stream di input audio da Android e poi li combina trasmettere in streaming in modo adeguato con le sorgenti sonore esterne richieste dalla veicolo.

L'implementazione dell'HAL e il mixer esterno hanno la responsabilità di garantire che vengono uditi suoni esterni critici per la sicurezza e per il missaggio nel trasmettendoli in streaming e indirizzandoli ad altoparlanti adatti.

Suoni Android

Le app possono avere uno o più player che interagiscono tramite la piattaforma Android standard API (ad esempio AudioManager per il controllo dello stato attivo o MediaPlayer per lo streaming) per emettere uno o più flussi logici di dati audio. Questi dati può essere un formato mono a canale singolo o surround 7.1, ma viene instradato e trattato un'unica fonte. Lo stream di app è associato ad AudioAttributes che forniscono al sistema suggerimenti su come esprimere l'audio.

I flussi logici vengono inviati tramite AudioService e indirizzati a uno (e uno solo dei flussi di output fisici disponibili, ognuno dei quali è l'output di un mixer in AudioFlinger. Dopo aver mixato gli attributi audio a uno stream fisico, non sono più disponibili.

Ogni stream fisico viene quindi inviato all'HAL audio per il rendering e l'hardware. Nelle app automobilistiche, l'hardware di rendering può essere costituito da codec locali (simile ai dispositivi mobili) o un processore remoto nella parte fisica del veicolo in ogni rete. In ogni caso, è compito dell'implementazione di Audio HAL fornire dati di esempio effettivi e diventino udibili.

Stream esterni

Stream audio che non devono essere indirizzati tramite Android (per la certificazione o motivi di tempo) può essere inviata direttamente al mixer esterno. A partire da Android 11, L'HAL è ora in grado di richiedere lo stato attivo per questi suoni esterni per informare Android in modo che possa adottare le misure appropriate, come mettere in pausa i contenuti multimediali o impedire ad altri di concentrarsi.

Se gli stream esterni sono sorgenti multimediali che devono interagire con l'audio nell'ambiente in corso da Android (ad esempio, interrompi la riproduzione di MP3 quando il sintonizzatore esterno sia attivato), questi stream esterni devono essere rappresentati da un App per Android. Un'app di questo tipo richiederebbe il focus audio per conto della fonte multimediale anziché all'HAL e risponderanno alle notifiche mirate avvia/interrompe l'origine esterna in base alle esigenze per rientrare nell'attenzione di Android . L'app è anche responsabile della gestione degli eventi chiave multimediali, play/pausa. Un meccanismo suggerito per controllare questi dispositivi esterni è HwAudioSource.

Dispositivi di output

A livello di Audio HAL, il tipo di dispositivo AUDIO_DEVICE_OUT_BUS fornisce un dispositivo di output generico da utilizzare nei sistemi audio dei veicoli. L'autobus supporta porte indirizzabili (ogni porta è il punto di arrivo fisico) ed è previsto che sia l'unico tipo di dispositivo di output supportato in di un veicolo.

Un'implementazione di sistema può usare una porta bus per tutti i suoni Android, in Android mescola tutto in un unico stream. In alternativa, l'HAL può fornire una porta bus per ogni CarAudioContext per consentire simultanea di qualsiasi tipo di suono. Ciò permette all'HAL implementazione per mixare e attenuare i diversi suoni a seconda delle tue preferenze.

L'assegnazione dei contesti audio ai dispositivi di uscita avviene tramite: car_audio_configuration.xml.

Ingresso microfono

Durante l'acquisizione dell'audio, l'HAL audio riceve un openInputStream che include un argomento AudioSource che indica come l'input del microfono dovrebbe essere elaborato.

Origine VOICE_RECOGNITION (nello specifico l'Assistente Google) si aspetta uno stream con microfono stereo con un effetto di cancellazione eco (se disponibile), ma non viene applicata alcuna altra elaborazione. Il Beamforming dovrebbe essere eseguito dall'assistente.

Ingresso microfono multicanale

Per acquisire l'audio da un dispositivo con più di due canali (stereo), utilizza una della maschera dell'indice del canale invece della maschera dell'indice posizionale (ad esempio CHANNEL_IN_LEFT). Esempio:

final AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(44100)
    .setChannelIndexMask(0xf /* 4 channels, 0..3 */)
    .build();
final AudioRecord audioRecord = new AudioRecord.Builder()
    .setAudioFormat(audioFormat)
    .build();
audioRecord.setPreferredDevice(someAudioDeviceInfo);

Quando sia setChannelMask sia setChannelIndexMask sono impostati, AudioRecord utilizza solo il valore impostato da setChannelMask (massimo due canali).

Acquisizione simultanea

A partire da Android 10, il framework Android supporta l'acquisizione simultanea di input, ma con restrizioni per proteggere la privacy dell'utente. Nell'ambito di queste restrizioni, le origini virtuali come AUDIO_SOURCE_FM_TUNER vengono ignorate e come tali possono essere acquisiti contemporaneamente insieme a un normale ingresso (come il microfono). Inoltre, i contenuti HwAudioSources non sono considerati parte integrante di limitazioni di acquisizione.

App progettate per funzionare con AUDIO_DEVICE_IN_BUS dispositivi o con i dispositivi AUDIO_DEVICE_IN_FM_TUNER secondari devono fare affidamento identificare questi dispositivi e utilizzare AudioRecord.setPreferredDevice() per bypassare la logica di selezione dell'origine predefinita di Android.

Utilizzi audio

AAOS utilizza principalmente AudioAttributes.AttributeUsages per routing, regolazioni del volume e gestione dello stato attivo. Gli utilizzi sono rappresentazione del "perché" lo stream viene riprodotto. Di conseguenza, tutti gli stream e le richieste di messa a fuoco audio devono specificare un utilizzo per la riproduzione audio. Quando non è impostato in modo specifico durante la creazione di un oggetto AudioAttributes, l'utilizzo sarà il valore predefinito è USAGE_UNKNOWN. Anche se al momento viene trattato allo stesso modo come USAGE_MEDIA, questo comportamento non deve essere utilizzato per i contenuti multimediali per riprodurre un video.

Utilizzi da parte del sistema

In Android 11 sono stati introdotti gli utilizzi del sistema. Questi utilizzi si comportano in modo simile agli utilizzi stabiliti in precedenza, ad eccezione del fatto che richiedono API di sistema da utilizzare in combinazione con android.permission.MODIFY_AUDIO_ROUTING. Il nuovo di utilizzo del sistema sono:

  • USAGE_EMERGENCY
  • USAGE_SAFETY
  • USAGE_VEHICLE_STATUS
  • USAGE_ANNOUNCEMENT

Per creare un AudioAttributes con un utilizzo del sistema, usa AudioAttributes.Builder#setSystemUsage anziché setUsage. Chiamata a questo metodo con un utilizzo non di sistema comporterà il lancio di IllegalArgumentException. Inoltre, se sia l'uso che l'utilizzo del sistema sono stati impostati su un builder, verrà generato un IllegalArgumentException durante la creazione.

Per controllare quale utilizzo è associato a AudioAttributes , chiama AudioAttributes#getSystemUsage. Restituisce l'utilizzo o l'utilizzo del sistema associato.

Contesto audio

Per semplificare la configurazione dell'audio AAOS, gli utilizzi simili sono stati raggruppati in CarAudioContext. Questi contesti audio vengono utilizzati CarAudioService per definire routing, gruppi di volume e focus audio gestione dei dispositivi.

I contesti audio in Android 11 sono:

Contesto audioauto Attributi associati associati
MUSIC UNKNOWN, GAME, MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT, ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION, NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

Mappatura tra contesti e utilizzi audio. Le righe evidenziate si riferiscono a nuovi utilizzi del sistema.

Audio multizona

Con il settore automobilistico arriva una nuova serie di casi d'uso per gli utenti simultanei che interagiscono con la piattaforma e cercano di usufruire di contenuti multimediali separati. Per esempio, un conducente può ascoltare musica in cabina mentre i passeggeri seduti sul sedile posteriore. stanno guardando un video di YouTube sul display posteriore. L'audio multizona consente consentendo la riproduzione simultanea di diverse sorgenti audio in aree diverse del veicolo.

L'audio multizona a partire da Android 10 consente agli OEM di configurare l'audio in zone separate. Ogni zona è un insieme di dispositivi all'interno del veicolo con i propri gruppi di volumi, la configurazione del routing per i contesti gestione dei dispositivi. In questo modo, la cabina principale potrebbe essere configurata come un unico audio mentre i jack per cuffie del display posteriore sono configurati come seconda zona.

Le zone sono definite come parte di car_audio_configuration.xml. CarAudioService legge quindi la configurazione e aiuta AudioService indirizzare gli stream audio in base alla zona associata. Ogni zona definisce per il routing in base ai contesti e all'uid dell'applicazione. Quando un giocatore creato, CarAudioService determina per quale zona si trova e quindi in base all'utilizzo, a quale dispositivo l'AudioFlinger deve indirizzare l'audio.

Inoltre, la messa a fuoco viene mantenuta in modo indipendente per ogni zona audio. Ciò consente in diverse zone per produrre audio in modo indipendente senza che interferiscono tra loro mantenendo le applicazioni che rispettano le modifiche attivo all'interno della propria zona. CarZonesAudioFocus entro CarAudioService è responsabile della gestione dell'attenzione zona di destinazione.

Configura audio multizona

Figura 2. Configura audio multizona

HAL audio

Le implementazioni audio nel settore auto e motori si basano sullo standard Android Audio HAL, che include:

  • IDevice.hal. Crea flussi di input e output, gestisce il volume principale e la disattivazione dell'audio, oltre a utilizzare:
    • createAudioPatch. Per creare patch esterne-esterne tra i dispositivi.
    • IDevice.setAudioPortConfig() per fornire volume per ogni stream fisico.
  • IStream.hal. Insieme alle varianti di input e output, gestisce lo streaming di campioni audio da e verso l'hardware.

Tipi di dispositivi per auto e motori

I seguenti tipi di dispositivi sono pertinenti per le piattaforme automobilistiche.

Tipo di dispositivo Descrizione
AUDIO_DEVICE_OUT_BUS Output principale da Android (questo è il rendimento di tutto l'audio di Android consegnato al veicolo). Utilizzato come indirizzo per disambiguare i flussi per ogni contesto.
AUDIO_DEVICE_OUT_TELEPHONY_TX Utilizzato per l'audio indirizzato al segnale radio cellulare per la trasmissione.
AUDIO_DEVICE_IN_BUS Utilizzato per gli input non altrimenti classificati.
AUDIO_DEVICE_IN_FM_TUNER Utilizzato solo per l'input della trasmissione radio.
AUDIO_DEVICE_IN_TV_TUNER Utilizzato per un dispositivo TV, se presente.
AUDIO_DEVICE_IN_LINE Utilizzato per il jack di ingresso AUX.
AUDIO_DEVICE_IN_BLUETOOTH_A2DP Musica ricevuta tramite Bluetooth.
AUDIO_DEVICE_IN_TELEPHONY_RX Utilizzato per l'audio ricevuto dal segnale radio cellulare associato a un telefono chiamata.

Configurazione dei dispositivi audio

I dispositivi audio visibili ad Android devono essere definiti in /audio_policy_configuration.xml, che include i seguenti componenti:

  • il nome del modulo. Supporta il tipo "principale" (per casi d'uso nel settore auto e motori), "A2DP", "remote_submix" e "USB". Il nome del modulo e l'audio corrispondente driver deve essere compilato in audio.primary.$(variant).so.
  • devicePorts. Contiene un elenco di descrittori dei dispositivi per tutti i valori di input e output (inclusi quelli collegati in modo permanente e i dispositivi rimovibili) che possono essere da questo modulo.
    • Per ogni dispositivo di output è possibile definire un controllo del guadagno, che consiste in valori min/max/default/step in millibel (1 millibel = 1/100 dB = 1/1000 bel).
    • L'attributo indirizzo su un'istanza devicePort può essere utilizzato per trovare dispositivo mobile, anche se sono presenti più dispositivi con lo stesso tipo di dispositivo AUDIO_DEVICE_OUT_BUS.
  • mixPort. Contiene un elenco di tutti gli stream di output e di input esposti dal audio HAL. Ogni istanza mixPort può essere considerata come un flusso fisico Android AudioService.
  • route. Definisce un elenco di possibili connessioni tra input e output tra dispositivi o tra stream e dispositivo.

L'esempio seguente definisce un dispositivo di output bus0_phone_out in cui tutte le Gli stream audio Android vengono mixati tramite mixer_bus0_phone_out. Il percorso segue stream di output di mixer_bus0_phone_out al dispositivo bus0_phone_out.

<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_phone_out</item>
<defaultOutputDevice>bus0_phone_out</defaultOutputDevice>
            <mixPorts>
                <mixPort name="mixport_bus0_phone_out"
                         role="source"
                         flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_phone_out"
                            role="sink"
                            type="AUDIO_DEVICE_OUT_BUS"
                            address="BUS00_PHONE">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400"
                                maxValueMB="4000"
                                defaultValueMB="0"
                                stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_phone_out"
                       sources="mixport_bus0_phone_out"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>