Audio HAL

Hardware Abstraction Layer audio di Android (HAL) collega le di livello superiore, audio-specifiche API quadro nei android.media alle risultanze driver audio e hardware. L'HAL audio definisce l'interfaccia standard a cui chiamano i servizi audio. 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 audio HAL

L'interfaccia audio HAL è definita utilizzando HIDL in .hal file e XSD schemi per i file di configurazione, indicati 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.

Nell'ambito dell'attuazione del HAL audio, è necessario creare un file di configurazione di policy audio che descrive la topologia audio. Funzionalità audio HAL devono essere dichiarate nel audio_policy_configuration.xml file per il quadro di usarli.

API HAL audio

L'HAL audio contiene le seguenti API:

  • Nucleo HAL
  • Effetti HAL
  • HAL . comune

Ciascuna 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 nel API.
  • IDevice.hal e IPrimaryDevice.hal contengono metodi come setMasterVolume o openInputStream .
  • Flussi sono unidirezionali e sono utilizzati da AudioFlinger per inviare o ricevere audio da e verso l'HAL attraverso IStream.hal , IStreamOut.hal e IStreamIn.hal .

La tabella seguente elenca la posizione dei componenti Core HAL utili:

Componente HAL principale Posizione
Ultima versione dell'API /hardware/interfaces/audio/6.0
Tipi specifici dell'ultima API Core HAL /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 del core API HAL ( /hardware/interfaces/audio/core/all-versions/default/ ) è un wrapper pre-Treble HAL implementazione utilizzando le librerie legacy condiviso . L'implementazione predefinita può anche essere considerata come un riferimento quando si implementano nuove versioni di HAL audio che interagiscono direttamente con i driver del kernel.

Effetti HAL

L'API HAL degli effetti viene utilizzata dal framework degli effetti per controllare gli effetti audio. È anche possibile configurare pre-elaborazione degli effetti , come il controllo automatico del guadagno e soppressione del rumore attraverso l'API Effetti HAL.

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 esempio di implementazione delle API Effetti ( /hardware/interfaces/audio/effect/all-versions/default/ ) e l'effetti audio sezione.

HAL . comune

Common HAL è 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 strutture di dati. L'API HAL comune contiene quanto segue:

  • Definizioni ( /hardware/interfaces/audio/common/6.0/types.hal ) condiviso dal Nucleo e le API Effect.
  • Utilities ( /hardware/interfaces/audio/common/all-versions ) utilizzato per aiutare la codifica contro API HIDL per le implementazioni, i clienti e le prove.

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.
  • Concorrenza di chiamata vocale TX e la cattura del processore applicativo, come indicato alla cattura Concurrent pagina.

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 T. Per supportare e migliorare l'adozione di AIDL in Android T 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.

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

Queste modifiche sono discusse in maggior dettaglio nelle rispettive sezioni.

Enumerazioni

A partire da Audio HAL V7, i tipi enumerati utilizzati nel file Audio Policy Configuration sono definiti solo nello schema XSD e non nell'HIDL.

In audio HAL V6, i valori di enum tipi (come AudioFormat ) in types.hal sono definiti anche nella configurazione della politica dello schema file XSD audio, la creazione di una duplicazione. Per evitare questo in V7, le enum tipi sono cambiati in string e tutti i possibili valori di enumerazione sono elencati nello schema XSD invece.

Vedere la figura 1 per un confronto tra alcune delle modifiche al AudioFormat enum tipo in V7:

audioformat-change

Figura 1: Confronto tra alcune modifiche al AudioFormat enum

Fare riferimento al seguente elenco per gli enum tipi che sono stati convertiti alla String :

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : vendor-extensible
  • AudioFormat : vendor-extensible
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

Passando String valori enum

I valori stringa vengono utilizzati per trasferire informazioni come valori di enumerazione attraverso il limite dell'interfaccia HAL. Sia il quadro e l'HAL involucro valori enum use interi per implementare logica aziendale e impiegare il metodo di conversione illustrato in figura 2 .

audio-passing-values

Figura 2: Passaggio string enum valori

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

  1. enum valore di AudioFormat viene convertito in una string valore libaudiohal e viene passato al HAL.
  2. Sul lato HAL, il default wrapper converte la string in un enum valore che viene passato al HAL legacy.

Modifiche allo schema XML

Avere elenchi completi di valori enum nello schema XML (XSD) consente una migliore convalida del file XML di configurazione dei criteri audio da parte di VTS. Le modifiche vengono apportate nel file di configurazione dei criteri audio utilizzato con HAL V7 per conformarsi a XSD.

In V7, uno standard (spazio) carattere viene utilizzato per liste valori delimitano negli attributi (come i tassi di campionamento, maschere di canale e bandiere), al posto del , (virgola) e | simboli (barra verticale) utilizzati in V6 e precedenti. Come si vede nel seguente esempio, uno spazio è utilizzato per delimitare l'elenco dei valori per channelMasks :

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

Per apportare le modifiche di simboli, utilizzare uno script chiamato conversione automatica update_audio_policy_config.sh . Consulta il comando seguente 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 dati sono state ridefinite in V7 per ridurre al minimo le definizioni duplicate. Le tuple ripetute di elementi di dati vengono raggruppate in strutture riutilizzabili. Queste strutture di dati utilizzano le ultime funzionalità HIDL come le unioni sicure.

Ad esempio, in V6 e sotto, una terna di <format, sampling rate, channel mask> è usato spesso nelle interfacce HIDL e tipi. Per rimuovere questa ridondanza, in V7, AudioConfigBase tipo di dati e altri tipi di dati sono definiti come segue:

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

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

    usato da AudioConfig , AudioOffloadInfo , AudioPortConfig

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

    sostituisce collezioni sciolti in AudioPort/PortConfig

  • AudioPortExtendedInfo := device | mix | session

    sostituisce i sindacati in AudioPort/PortConfig

Tag fornitore

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 RecordTrackMetadata struttura è realizzata in modo simile con l'aggiunta di tag specifici per i metadati traccia di registrazione.

Spazio dei nomi delle estensioni del fornitore

A partire dal HAL V7, estensioni del fornitore richiedono un ulteriore {vendor} prefisso che non è richiesto in V6. Per il {vendor} prefix sia valida, deve essere di tre o più caratteri alfanumerici.

Utilizzare il seguente formato in V7:

VX_ {vendor} {_ lettere / numeri / _}

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 12 7.0
Android 11 6.0
Android 10 5,0
Android 9 4.0
Android 8 2.0