Audio HAL

L'audio Hardware Abstraction Layer (HAL) di Android collega le API del framework audio specifiche di livello superiore in android.media ai driver audio e all'hardware sottostanti. Audio HAL definisce l'interfaccia standard in cui i servizi audio chiamano. Deve essere implementato affinché l'hardware audio funzioni correttamente.

Questa pagina fornisce una panoramica dell'HAL audio e fornisce dettagli sulla sua API e sui requisiti di implementazione.

Interfaccia audio HAL

L'interfaccia audio HAL viene definita utilizzando HIDL nei file .hal e schemi XSD per i file di configurazione, mostrati come segue.

audio_hal

Figura 1. Interfaccia audio HAL

File di configurazione

I file di configurazione XML dei criteri audio e degli effetti audio sono considerati parte dell'interfaccia Audio HAL. Questi file devono essere conformi ai loro schemi e la conformità è verificata dai test VTS.

Come parte dell'implementazione dell'HAL audio, è necessario creare un file di configurazione della politica audio che descriva la topologia audio. Le funzionalità HAL audio devono essere dichiarate nel file audio_policy_configuration.xml affinché il framework possa utilizzarle.

API HAL audio

L'HAL audio contiene le seguenti API:

  • Core HAL
  • Effetti HAL
  • HAL comune

Ciascuna di queste API è descritta nelle sezioni seguenti.

Core HAL

Il Core HAL è l'API principale utilizzata da AudioFlinger per riprodurre l'audio e controllare il routing dell'audio. Alcune delle interfacce chiave sono le seguenti:

  • IDeviceFactory.hal è il punto di ingresso nell'API.
  • IDevice.hal e IPrimaryDevice.hal contengono metodi come setMasterVolume o openInputStream .
  • I flussi sono unidirezionali e vengono utilizzati da AudioFlinger per inviare o ricevere audio da e verso l'HAL tramite IStream.hal , IStreamOut.hal e IStreamIn.hal .

La tabella seguente elenca la posizione di utili componenti Core HAL.

Componente HAL principale Posizione
Ultima versione dell'API /hardware/interfaces/audio/6.0
Tipi specifici per l'ultima API Core HAL /hardware/interfaces/audio/6.0/types.hal
Schema XSD del file di configurazione della politica audio /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

L'implementazione predefinita dell'API Core HAL ( /hardware/interfaces/audio/core/all-versions/default/ ) è un wrapper attorno all'implementazione HAL pre-Treble che utilizza librerie condivise legacy . L'implementazione predefinita può anche essere considerata un riferimento quando si implementano nuove versioni di HAL audio che interagiscono direttamente con i driver del kernel.

Effetti HAL

L'API Effects HAL viene utilizzata dal framework degli effetti per controllare gli effetti audio. È inoltre possibile configurare effetti di preelaborazione come il controllo automatico del guadagno e la soppressione del rumore tramite l'API HAL degli effetti.

La tabella seguente elenca la posizione dei componenti HAL degli effetti utili.

Effetti Componente HAL Posizione
Ultima versione dell'API /hardware/interfaces/audio/effect/6.0/
Schema XSD del file di configurazione degli effetti /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd

Per ulteriori informazioni, vedere un'implementazione di esempio dell'API HAL degli effetti ( /hardware/interfaces/audio/effect/all-versions/default/ ) e la sezione Effetti audio .

HAL comune

Common HAL è una libreria di tipi di dati comuni utilizzati dalle API Core ed Effects HAL. Non ha interfacce e test VTS associati in quanto definisce solo strutture di dati. L'API HAL comune contiene quanto segue:

  • Definizioni ( /hardware/interfaces/audio/common/6.0/types.hal ) condivise dalle API Core ed Effect
  • Utilità ( /hardware/interfaces/audio/common/all-versions ) utilizzate per aiutare a codificare le API HIDL per implementazioni, client e test

Requisiti

Oltre a implementare l'HAL audio e creare il file di configurazione della politica audio, è necessario rispettare i seguenti requisiti HAL:

  • Se l'acquisizione per Sound Trigger (acquisizione dal buffer DSP hotword) è supportata da un profilo di input, l'implementazione deve supportare il numero di flussi attivi su questo profilo corrispondente al numero di sessioni simultanee supportate da Sound Trigger HAL.
  • Simultaneità della chiamata vocale TX e acquisizione dal processore dell'applicazione come dettagliato nella pagina Acquisizione simultanea .

Aggiornamenti all'Audio HAL V7

Per risolvere i problemi di compatibilità con le versioni precedenti, AIDL stabile è obbligatorio per tutte le modifiche HAL a partire da Android 13. Per supportare e migliorare l'adozione di AIDL in Android 13 e versioni successive, Audio HAL V7 effettua le seguenti operazioni:

  • Unifica i modelli di dati utilizzati dal framework e HAL.
  • Riduce al minimo la duplicazione tra i tipi di dati HIDL (enumerazioni) e lo schema XML utilizzato per la configurazione dei criteri audio.

Nello specifico, nell'audio HAL V7 vengono apportate modifiche alle seguenti aree:

Queste modifiche sono discusse in modo più dettagliato nelle rispettive sezioni.

Enumerazioni

A partire da Audio HAL V7, i tipi enumerati utilizzati nel file di configurazione della politica audio sono definiti solo nello schema XSD e non nell'HIDL.

In audio HAL V6, i valori dei tipi enum (come AudioFormat ) in types.hal sono definiti anche nello schema XSD del file di configurazione della politica audio, creando una duplicazione. Per evitare ciò in V7, i tipi enum vengono modificati in string e tutti i possibili valori di enumerazione vengono invece elencati nello schema XSD.

Vedere la Figura 2 per un confronto di alcune delle modifiche al tipo enum AudioFormat in V7.

audioformat-change

Figura 2. Confronto di alcune delle modifiche all'enumerazione AudioFormat

Fare riferimento all'elenco seguente per i tipi enum che sono stati convertiti in String :

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : estensibile dal fornitore
  • AudioFormat : estensibile dal fornitore
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

Passa i valori dell'enumerazione delle stringhe

I valori stringa vengono utilizzati per trasferire informazioni come valori di enumerazione attraverso il limite dell'interfaccia HAL. Sia il framework che il wrapper HAL utilizzano valori enum interi per implementare la logica aziendale e utilizzano l'approccio di conversione illustrato nella figura 3 .

audio-passing-values

Figura 3. Passaggio di valori enum di stringhe

Ad esempio, per passare un valore di tipo di formato audio dal framework al fornitore:

  1. Il valore enum di AudioFormat viene convertito in un valore stringa in libaudiohal e passato all'HAL.
  2. Sul lato HAL, il wrapper predefinito converte la stringa in un valore enum, che viene passato all'HAL legacy.

Modifiche allo schema XML

Avere elenchi completi di valori enum nella definizione dello schema XML (XSD) consente una migliore convalida del file XML di configurazione della politica audio da parte di VTS. Le modifiche vengono apportate al file di configurazione della politica audio utilizzato con HAL V7 per conformarsi a XSD.

In V7, viene utilizzato un carattere (spazio) standard per delimitare elenchi di valori negli attributi (come frequenze di campionamento, maschere di canale e flag), invece di , (virgola) e | (barra verticale) simboli utilizzati in V6 e precedenti. Come si vede nell'esempio seguente, viene utilizzato uno spazio per delimitare l'elenco di valori per channelMasks :

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

Per apportare le modifiche ai simboli, utilizzare uno script di conversione automatica chiamato update_audio_policy_config.sh . Consulta il comando seguente per convertire un file di configurazione della politica audio V6 in una versione V7 per il dispositivo Pixel 5 (Redfin):

hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0

Tipi di dati

Alcune strutture di dati vengono ridefinite in V7 per ridurre al minimo le definizioni duplicate. Tuple ripetute di elementi di dati sono raggruppate in strutture riutilizzabili. Queste strutture di dati utilizzano le ultime funzionalità HIDL come le unioni sicure.

Ad esempio, in V6 e versioni precedenti, nelle interfacce e nei tipi HIDL viene spesso utilizzata una tripla di <format, sampling rate, channel mask> . Per rimuovere questa ridondanza, in V7, il tipo di dati AudioConfigBase e altri tipi di dati sono definiti come segue:

  • AudioConfigBase := <format, sampling rate, channel mask>

  • AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>

    utilizzato da AudioConfig , AudioOffloadInfo , AudioPortConfig

  • AudioProfile := <format, {sampling rates}, {channel masks}>

    sostituisce le raccolte sciolte in AudioPort/PortConfig

  • AudioPortExtendedInfo := device | mix | session

    sostituisce le unioni in AudioPort/PortConfig

Tag del venditore

Oltre ai tipi e ai formati dei dispositivi, i fornitori possono aggiungere tag personalizzati per i metadati delle tracce audio.

Per la riproduzione e la registrazione dei metadati delle tracce, i fornitori possono passare i propri tag, che vengono utilizzati per aggiungere attributi ai flussi di I/O audio, dalle app all'HAL.

I tag del fornitore per i metadati della traccia di riproduzione vengono aggiunti come mostrato nell'esempio seguente:

struct PlaybackTrackMetadata {
…
    /** Tags from AudioTrack audio attributes */
    vec<AudioTag> tags;
};

La struttura RecordTrackMetadata viene implementata in modo simile aggiungendo tag specifici per i metadati della traccia di registrazione.

Spaziatura dei nomi delle estensioni del fornitore

A partire da HAL V7, le estensioni del fornitore richiedono un prefisso {vendor} aggiuntivo non richiesto in V6. Affinché il prefisso {vendor} sia valido, deve essere composto da tre o più caratteri alfanumerici.

Utilizzare il seguente formato in V7:

VX_{ vendor }_{ letters/numbers }

Di seguito sono riportati alcuni esempi di estensioni del fornitore V7 valide:

  • VX_GOOGLE_VR
  • VX_ QCI _AMBIENT_MIC

Informazioni sulla versione

La tabella seguente elenca il numero di versione HAL per ogni versione di Android.

Versione Android Versione HAL
Android 13 7.1
Android 12 7.0
Android 11 6.0
Android 10 5.0
Android 9 4.0
Android 8 2.0