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.
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 HIDL HAL 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 HIDL HAL audio
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
eIPrimaryDevice.hal
contengono metodi comesetMasterVolume
oopenInputStream
.- Gli stream sono unidirezionali e vengono utilizzati da AudioFlinger per inviare o ricevere audio alla e dalla HAL tramite
IStream.hal
,IStreamOut.hal
eIStreamIn.hal
.
La tabella seguente elenca la posizione dei componenti HIDL HAL di base 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 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 intorno 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 degli effetti
La tabella seguente elenca la posizione dei componenti HAL di Effects utili utilizzando HIDL:
Componente HAL effetti | 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 maggiori informazioni, consulta un'implementazione di esempio dell'API Effects HAL all'indirizzo /hardware/interfaces/audio/effect/all-versions/default/
e la sezione Effetti audio.
Common HAL
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 la duplicazione tra i tipi di dati HIDL (enumerazioni) e lo schema XML utilizzato per la configurazione delle norme audio.
In particolare, le modifiche vengono apportate nelle 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 di enumerazione 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:
Figura 2. Confronto di alcune modifiche all'enumerazione AudioFormat.
Consulta l'elenco seguente per i tipi di enumerazione che sono stati convertiti in
string
:
AudioChannelMask
AudioContentType
AudioDevice
: Estensibile dal fornitoreAudioFormat
: Estensibile dal fornitoreAudioGainMode
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 sia il wrapper HAL utilizzano valori enum interi per implementare la logica di business e impiegano l'approccio di conversione illustrato nella Figura 3:
Figura 3. Trasmissione di valori enum stringa.
Ad esempio, per passare un valore del tipo di formato audio dal framework al fornitore:
- Il valore enum di
AudioFormat
viene convertito in un valore stringa inlibaudiohal
e viene passato all'HAL. - Sul lato HAL, il wrapper predefinito converte la stringa in un valore enum, che viene passato all'HAL precedente.
Modifiche allo schema XML
Disporre 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
. Vedi 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 i sindacati in
AudioPort/PortConfig
Tag fornitore
Oltre ai tipi e ai formati di dispositivo, 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 in V6. Affinché il prefisso {vendor}
sia valido, deve essere composto da
tre o più 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 |