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.
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
eIPrimaryDevice.hal
contengono metodi comesetMasterVolume
oopenInputStream
. - I flussi sono unidirezionali e vengono utilizzati da AudioFlinger per inviare o ricevere audio da e verso l'HAL tramite
IStream.hal
,IStreamOut.hal
eIStreamIn.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:
- Tipi di enumerazione
- Tipi di dati
- Tag del venditore
- Spaziatura dei nomi delle estensioni del fornitore
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.
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 .
Figura 3. Passaggio di valori enum di stringhe
Ad esempio, per passare un valore di tipo di formato audio dal framework al fornitore:
- Il valore enum di
AudioFormat
viene convertito in un valore stringa inlibaudiohal
e passato all'HAL. - 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 |