Sous Android 13 et versions antérieures, l'interface HAL Audio est définie à l'aide de HIDL dans les fichiers HAL HIDL (avec l'extension .hal
) et les schémas XSD pour les fichiers de configuration, comme indiqué ci-dessous.
Figure 1 : Interface Audio HAL.
Fichiers de configuration
Les fichiers de configuration XML des règles audio et des effets audio sont considérés comme faisant partie de l'interface HAL Audio HIDL. Ces fichiers doivent respecter leurs schémas, et la conformité est vérifiée par des tests VTS.
Lors de l'implémentation du HAL audio HIDL, vous devez créer un fichier de configuration de stratégie audio qui décrit la topologie audio. Les fonctionnalités HAL audio doivent être déclarées dans le fichier audio_policy_configuration.xml
pour que le framework puisse les utiliser.
API Audio HIDL HAL
Cette section décrit les API Core, Effects et HAL communes pour HIDL.
Core HAL
Voici quelques-unes des principales interfaces du HAL principal, qui utilisent HIDL:
IDeviceFactory.hal
est le point d'entrée de l'API.IDevice.hal
etIPrimaryDevice.hal
contiennent des méthodes telles quesetMasterVolume
ouopenInputStream
.- Les flux sont unidirectionnels et sont utilisés par AudioFlinger pour envoyer ou recevoir de l'audio depuis et vers le HAL via
IStream.hal
,IStreamOut.hal
etIStreamIn.hal
.
Le tableau suivant indique l'emplacement des composants HIDL HAL principaux utiles:
Composant HAL principal | Position |
---|---|
Dernière version de l'API | /hardware/interfaces/audio/6.0
|
Types spécifiques à la dernière API Core HAL | /hardware/interfaces/audio/6.0/types.hal
|
Schéma XSD du fichier de configuration des règles audio | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
L'implémentation par défaut de l'API HAL principale (/hardware/interfaces/audio/core/all-versions/default/
) est un wrapper autour de l'implémentation HAL antérieure à Treble à l'aide d'anciennes bibliothèques partagées.
L'implémentation par défaut peut également être considérée comme une référence lors de l'implémentation de nouvelles versions d'HAL audio qui interagissent directement avec les pilotes du noyau.
HAL des effets
Le tableau suivant indique l'emplacement des composants HAL d'effets utiles à l'aide de HIDL:
Composant HAL des effets | Position |
---|---|
Dernière version de l'API | /hardware/interfaces/audio/effect/6.0/
|
Schéma XSD du fichier de configuration des effets | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
Pour en savoir plus, consultez un exemple d'implémentation de l'API HAL Effects sur /hardware/interfaces/audio/effect/all-versions/default/
et la section Effets audio.
HAL commun
L'API HAL commune utilisant HIDL contient les éléments suivants:
- Définitions (
/hardware/interfaces/audio/common/6.0/types.hal
) partagées par les API Core et Effect. - Utilitaires (
/hardware/interfaces/audio/common/all-versions
) utilisés pour faciliter le codage avec les API HIDL pour les implémentations, les clients et les tests.
Mises à jour de la version 7 de l'HAL audio
Des modifications importantes ont été apportées à la version 7 de l'HAL Audio dans Android 12, comme indiqué dans cette section. L'Audio HAL V7 effectue les opérations suivantes:
- Unifie les modèles de données utilisés par le framework et HAL.
- Réduit la duplication entre les types de données HIDL (énumérations) et le schéma XML utilisé pour la configuration des règles audio.
Plus précisément, des modifications sont apportées dans les domaines suivants de la version 7 de l'HAL audio:
- Types d'énumération
- Types de données
- Tags de fournisseur
- Espace de noms des extensions du fournisseur
Ces modifications sont décrites plus en détail dans les sections correspondantes.
Énumérations
À partir de la version 7 de l'HAL Audio, les types énumérés utilisés dans le fichier de configuration des stratégies audio ne sont définis que dans le schéma XSD et non dans le HIDL.
Dans la version 6 de l'HAL audio, les valeurs des types d'énumération (comme AudioFormat
) dans types.hal
sont également définies dans le schéma XSD du fichier de configuration des stratégies audio, ce qui crée une duplication. Pour éviter cela dans la version 7, les types d'énumération sont remplacés par string
et toutes les valeurs d'énumération possibles sont listées dans le schéma XSD.
La figure 2 compare certaines des modifications apportées au type d'énumération AudioFormat
dans la version 7:
Figure 2. Comparaison de certaines modifications apportées à l'énumération AudioFormat.
Reportez-vous à la liste suivante pour connaître les types d'énumération qui ont été convertis en string
:
AudioChannelMask
AudioContentType
AudioDevice
: extensible par le fournisseurAudioFormat
: extensible par le fournisseurAudioGainMode
AudioSource
AudioStreamType
AudioUsage
Transmettre des valeurs d'énumération de chaîne
Les valeurs de chaîne sont utilisées pour transférer des informations en tant que valeurs d'énumération au-delà de la limite de l'interface HAL. Le framework et le wrapper HAL utilisent des valeurs d'énumération entières pour implémenter la logique métier et appliquent l'approche de conversion illustrée sur la figure 3:
Figure 3. Transmettre des valeurs d'énumération de chaîne.
Par exemple, pour transmettre une valeur de type de format audio du framework au fournisseur:
- La valeur d'énumération de
AudioFormat
est convertie en valeur de chaîne danslibaudiohal
et transmise au HAL. - Côté HAL, le wrapper par défaut convertit la chaîne en valeur d'énumération, qui est transmise à l'ancien HAL.
Modifications du schéma XML
Disposer de listes complètes de valeurs d'énumération dans la définition du schéma XML (XSD) permet une meilleure validation du fichier XML de configuration des règles audio par VTS. Nous avons apporté des modifications au fichier de configuration des règles audio utilisé avec HAL V7 pour qu'il respecte la norme XSD.
Dans la version 7, un caractère ␣
(espace) standard est utilisé pour délimiter les listes de valeurs dans les attributs (comme les taux d'échantillonnage, les masques de canaux et les indicateurs), au lieu des symboles ,
(virgule) et |
(barre verticale) utilisés dans la version 6 et les versions antérieures. Comme illustré dans l'exemple suivant, un espace est utilisé pour délimiter la liste des valeurs pour channelMasks
:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
Pour apporter les modifications de symboles, utilisez un script de conversion automatique appelé update_audio_policy_config.sh
. Consultez la commande suivante pour convertir un fichier de configuration de stratégie audio V6 en version V7 pour l'appareil Pixel 5 (Redfin) :
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
Types de données
Nous avons redéfini certaines structures de données dans la version 7 afin de réduire les définitions en double. Les tupels répétés d'éléments de données sont regroupés dans des structures réutilisables. Ces structures de données utilisent les dernières fonctionnalités HIDL, telles que les unions sécurisées.
Par exemple, dans la version 6 et les versions antérieures, un triple de <format, sampling rate, channel mask>
est souvent utilisé dans les interfaces et les types HIDL. Pour supprimer cette redondance, dans la version 7, le type de données AudioConfigBase
et les autres types de données sont définis comme suit:
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
utilisé par
AudioConfig
,AudioOffloadInfo
etAudioPortConfig
AudioProfile := <format, {sampling rates}, {channel masks}>
remplace les collections non structurées dans
AudioPort/PortConfig
AudioPortExtendedInfo := device | mix | session
remplace les unions dans
AudioPort/PortConfig
Tags de fournisseur
En plus des types et des formats d'appareils, les fournisseurs peuvent ajouter des balises personnalisées pour les métadonnées des pistes audio.
Pour les métadonnées de lecture et d'enregistrement des pistes, les fournisseurs peuvent transmettre leurs propres balises, qui sont utilisées pour ajouter des attributs aux flux d'E/S audio, des applications au HAL.
Les balises du fournisseur pour les métadonnées de la piste de lecture sont ajoutées, comme illustré dans l'exemple suivant:
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
La structure RecordTrackMetadata
est implémentée de manière similaire en ajoutant des balises spécifiques aux métadonnées de la piste d'enregistrement.
Noms des extensions de fournisseurs
À partir de la version 7 de HAL, les extensions du fournisseur nécessitent un préfixe {vendor}
supplémentaire qui n'est pas requis dans la version 6. Pour que le préfixe {vendor}
soit valide, il doit comporter au moins trois caractères alphanumériques.
Utilisez le format suivant dans la version 7:
VX_{vendor}_{letters/numbers}
Voici quelques exemples d'extensions de fournisseur V7 valides:
VX_GOOGLE_VR
VX_QCI_AMBIENT_MIC
Informations sur la version
Le tableau suivant indique le numéro de version de l'HAL pour chaque version d'Android:
Version d'Android | Version du HAL HIDL |
---|---|
Android 13 | 7.1 |
Android 12 | 7.0 |
Android 11 | 6.0 |
Android 10 | 5,0 |
Android 9 | 4.0 |
Android 8 | 2.0 |