HIDL Audio HAL

In Android 13 e versioni precedenti, l'interfaccia Audio HAL è definita utilizzando HIDL nei file HIDL HAL (con l'estensione .hal) e schemi XSD per i file di configurazione, come mostrato di seguito.

audio_hal

Figura 1. Interfaccia HAL audio.

File di configurazione

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

Nell'ambito dell'implementazione dell'HAL HIDL audio, devi creare un file di configurazione della policy 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 Audio HIDL HAL

Questa sezione descrive le API HAL Core, Effects e Common per HIDL.

HAL di base

Di seguito sono riportate alcune delle interfacce chiave di Core HAL, che utilizzano HIDL:

  • IDeviceFactory.hal è il punto di ingresso dell'API.
  • IDevice.hal e IPrimaryDevice.hal contengono metodi come setMasterVolume o openInputStream.
  • Gli stream sono unidirezionali e vengono utilizzati da AudioFlinger per inviare o ricevere audio alla e dalla HAL tramite IStream.hal, IStreamOut.hal e IStreamIn.hal.

La tabella seguente elenca la posizione dei componenti HIDL HAL principali utili:

Componente HAL principale Località
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 delle norme 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ò essere considerata anche come riferimento per l'implementazione di nuove versioni di HAL audio che interagiscono direttamente con i driver del kernel.

HAL Effetti

La tabella seguente elenca la posizione dei componenti HAL di Effects utili utilizzando HIDL:

Componente HAL effetti Località
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 saperne di più, consulta un'implementazione di esempio dell'API Effects HAL all'indirizzo /hardware/interfaces/audio/effect/all-versions/default/ e la sezione Effetti audio.

HAL comune

L'API Common HAL che utilizza HIDL 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 facilitare la codifica rispetto alle API HIDL per implementazioni, client e test.

Aggiornamenti all'HAL audio V7

La versione 7 dell'HAL audio in Android 12 presenta modifiche significative, come descritto in questa sezione. L'HAL audio V7 esegue le seguenti operazioni:

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

In particolare, le modifiche vengono apportate alle seguenti aree di Audio HAL V7:

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

Enumerazioni

A partire da Audio HAL V7, i tipi enumerati utilizzati nel file di configurazione delle norme audio sono definiti solo nello schema XSD e non in HIDL.

In Audio HAL V6, i valori dei tipi di enumerazione (come AudioFormat) in types.hal sono definiti anche nello schema XSD del file di configurazione delle norme audio, creando una duplicazione. Per evitare questo problema nella versione 7, i tipi enum vengono modificati in string e tutti i possibili valori di enumerazione vengono elencati nello schema XSD.

La figura 2 confronta alcune delle modifiche al tipo di enumerazione AudioFormat nella versione 7:

audioformat-change

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

Consulta il seguente elenco per i tipi di enumerazione convertiti in string:

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

Trasmettere valori enum 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 di business e impiegano l'approccio di conversione illustrato nella Figura 3:

audio-passing-values

Figura 3. Trasmissione di valori enum di stringa.

Ad esempio, per trasmettere un valore del 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

La presenza di elenchi completi di valori enum nella definizione dello schema XML (XSD) consente una migliore convalida del file XML di configurazione dei criteri audio da parte di VTS. Abbiamo apportato modifiche al file di configurazione delle norme audio utilizzato con HAL V7 per rispettare XSD.

Nella versione 7, un carattere (spazio) standard viene utilizzato per delimitare gli elenchi di valori negli attributi (come frequenze di campionamento, maschere dei canali e flag), anziché i simboli , (virgola) e | (barra verticale) utilizzati nella versione 6 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 le modifiche ai simboli, utilizza uno script di conversione automatica chiamato update_audio_policy_config.sh. Consulta il seguente comando per convertire un file di configurazione delle norme 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

Abbiamo ridefinito alcune strutture di dati nella versione 7 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 funzionalità HIDL più recenti, come le unioni sicure.

Ad esempio, in V6 e versioni precedenti, una tripla di <format, sampling rate, channel mask> viene spesso utilizzata nelle interfacce e nei tipi HIDL. Per eliminare questa ridondanza, nella versione 7, il tipo di dati AudioConfigBase e gli 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 sparse in AudioPort/PortConfig

  • AudioPortExtendedInfo := device | mix | session

    sostituisce le unioni in AudioPort/PortConfig

Tag fornitore

Oltre a tipi e formati di 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, che vengono utilizzati per aggiungere attributi ai flussi di input/output audio, dalle app all'HAL.

I tag dei fornitori per i metadati delle tracce di riproduzione vengono aggiunti come mostrato nel seguente esempio:

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.

Spazio dei nomi delle estensioni fornitore

A partire da HAL V7, le estensioni del fornitore richiedono un prefisso {vendor} aggiuntivo che non è richiesto nella versione 6. Affinché il prefisso {vendor} sia valido, deve contenere almeno tre caratteri alfanumerici.

Utilizza il seguente formato in V7:

VX_{vendor}_{letters/numbers}

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

  • VX_GOOGLE_VR
  • VX_QCI_AMBIENT_MIC

Informazioni sulla versione

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

Versione di Android Versione HIDL 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