Audio HAL

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

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

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

Interfaccia HAL audio

L'interfaccia HAL audio è definita utilizzando HIDL nei file .hal e negli schemi XSD per i file di configurazione, mostrati di seguito.

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à viene verificata dai test VTS.

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

API HAL audio

L'HAL audio contiene le seguenti API:

  • Nucleo HAL
  • Effetti HAL
  • HAL comune

Ognuna di queste API è descritta nelle sezioni seguenti.

Nucleo 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 dei componenti Core HAL utili.

Componente principale HAL Posizione
Ultima versione dell'API /hardware/interfaces/audio/6.0
Tipi specifici dell'API Core HAL più recente /hardware/interfaces/audio/6.0/types.hal
Schema XSD del file di configurazione dei criteri 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 utilizzando le librerie condivise legacy . L'implementazione predefinita può anche essere considerata come 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 gli effetti di pre -elaborazione come il controllo automatico del guadagno e la soppressione del rumore tramite l'API Effects HAL.

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

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

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

HAL comune

L'HAL comune è una libreria di tipi di dati comuni utilizzati dalle API HAL Core ed Effects. Non ha interfacce e nessun test VTS associato in quanto definisce solo le strutture dei 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 la codifica rispetto alle API HIDL per implementazioni, client e test

Requisiti

Oltre all'implementazione dell'HAL audio e alla creazione del file di configurazione dei criteri 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.
  • Concomitanza di TX di chiamate vocali 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, Stable AIDL è 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 esegue le seguenti operazioni:

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

In particolare, vengono apportate modifiche nelle seguenti aree in audio HAL V7:

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 dei criteri audio sono definiti solo nello schema XSD e non in 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 modifiche al tipo enum AudioFormat in V7.

audioformat-change

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

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

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

Passa i valori enum della stringa

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 impiegano l'approccio di conversione illustrato nella figura 3 .

audio-passing-values

Figura 3. Passaggio di valori enum stringa

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 viene 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, un carattere standard (spazio) viene utilizzato per delimitare gli 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 mostrato 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 modifiche ai simboli, utilizza uno script di conversione automatica denominato update_audio_policy_config.sh . Consulta il seguente comando per convertire un file di configurazione dei criteri 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. Le tuple ripetute di elementi di dati vengono raggruppate insieme in strutture riutilizzabili. Queste strutture di dati utilizzano le più recenti funzionalità HIDL come le unioni sicure.

Ad esempio, in V6 e versioni precedenti, una tripla di <format, sampling rate, channel mask> viene utilizzata spesso nelle interfacce e nei tipi HIDL. 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 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 i metadati delle tracce di riproduzione e registrazione, i fornitori possono passare i propri tag, 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 che non è richiesto in V6. Affinché il prefisso {vendor} sia valido, deve contenere 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
Androide 13 7.1
Androide 12 7.0
Androide 11 6.0
Androide 10 5.0
Android9 4.0
Androide 8 2.0