HIDL Audio HAL

Dans Android 13 et versions antérieures, l'interface Audio HAL est définie à l'aide de HIDL dans les fichiers HIDL HAL (avec l' extension .hal) et XSD schémas pour les fichiers de configuration, comme indiqué ci-dessous.

audio_hal

Figure 1. Interface Audio HAL.

Fichiers de configuration

Les fichiers de configuration XML de la stratégie audio et des effets audio sont considérés comme faisant partie de l'interface Audio HIDL HAL. Ces fichiers doivent être conformes à leurs schémas, et la conformité est vérifiée par les tests VTS.

Dans le cadre de l'implémentation d'Audio HIDL HAL, vous devez créer un fichier de configuration de stratégie audio qui décrit la topologie audio. Les fonctionnalités Audio HAL 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 HAL Core, Effects et Common pour HIDL.

HAL Core

Voici quelques-unes des principales interfaces de HAL Core, à l'aide de HIDL :

  • IDeviceFactory.hal est le point d'entrée de l'API.
  • IDevice.hal et IPrimaryDevice.hal contiennent des méthodes telles que setMasterVolume ou openInputStream.
  • Les flux sont unidirectionnels et sont utilisés par AudioFlinger pour envoyer ou recevoir des données audio vers et depuis le HAL via IStream.hal, IStreamOut.hal et IStreamIn.hal.

Le tableau suivant répertorie l'emplacement des composants HIDL HAL Core utiles :

Composant HAL Core Emplacement
Dernière version de l'API /hardware/interfaces/audio/6.0
Types spécifiques à la dernière API HAL Core /hardware/interfaces/audio/6.0/types.hal
Schéma XSD du fichier de configuration de la stratégie audio /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd

L'implémentation par défaut de l'API HAL Core (/hardware/interfaces/audio/core/all-versions/default/) est un wrapper autour de l'implémentation HAL pré-Treble à l'aide de bibliothèques partagées hérité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'Audio HAL qui interagissent directement avec les pilotes du noyau.

HAL Effects

Le tableau suivant répertorie l'emplacement des composants HAL Effects utiles à l'aide de HIDL :

Composant HAL Effects Emplacement
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 Common

L'API HAL Common à l'aide de 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 par rapport aux API HIDL pour les implémentations, les clients et les tests.

Mises à jour d'Audio HAL V7

La version 7 d'Audio HAL dans Android 12 a subi des modifications importantes, comme indiqué dans cette section. 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 de la stratégie audio.

Plus précisément, des modifications ont été apportées aux domaines suivants dans Audio HAL V7 :

Ces modifications sont abordées plus en détail dans leurs sections respectives.

Énumérations

À partir d'Audio HAL V7, les types énumérés utilisés dans le fichier de configuration de la stratégie audio ne sont définis que dans le schéma XSD et non dans le HIDL.

Dans Audio HAL V6, 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 de la stratégie audio, ce qui crée une duplication. Pour éviter cela dans V7, 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 V7 :

audioformat-change

Figure 2. Comparaison de certaines des modifications apportées à l'énumération AudioFormat.

Consultez la liste suivante pour connaître les types d'énumération qui ont été convertis en string :

  • AudioChannelMask
  • AudioContentType
  • AudioDevice : extensible par le fournisseur
  • AudioFormat: extensible par le fournisseur
  • AudioGainMode
  • 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 emploient l'approche de conversion illustrée dans la figure 3 :

audio-passing-values

Figure 3. Transmission de valeurs d'énumération de chaîne.

Par exemple, pour transmettre une valeur de type de format audio du framework au fournisseur :

  1. La valeur d'énumération de AudioFormat est convertie en valeur de chaîne dans libaudiohal et transmise au HAL.
  2. Du côté HAL, le wrapper par défaut convertit la chaîne en valeur d'énumération, qui est transmise au HAL hérité.

Modifications du schéma XML

Le fait de 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 de la stratégie audio par VTS. Nous avons apporté des modifications au fichier de configuration de la stratégie audio utilisé avec HAL V7 pour le rendre conforme à XSD.

Dans V7, un caractère (espace) standard est utilisé pour délimiter les listes de valeurs dans les attributs (tels que les taux d'échantillonnage, les masques de canaux et les indicateurs), au lieu des symboles , (virgule) et | (barre verticale) utilisés dans V6 et versions antérieures. Comme le montre l'exemple suivant, un espace est utilisé pour délimiter la liste des valeurs de channelMasks :

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

Pour modifier les 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 V7 afin de minimiser les définitions en double. Les tuples d'éléments de données répétés 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 V6 et versions antérieures, un triplet de <format, sampling rate, channel mask> est souvent utilisé dans les interfaces et les types HIDL. Pour supprimer cette redondance, dans V7, le type de données AudioConfigBase et d'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, AudioPortConfig

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

    remplace les collections libres 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 tags personnalisés pour les métadonnées de piste audio.

Pour les métadonnées de piste de lecture et d'enregistrement, les fournisseurs peuvent transmettre leurs propres tags, qui sont utilisés pour ajouter des attributs aux flux d'E/S audio, des applications au HAL.

Les tags de fournisseur pour les métadonnées de piste de lecture sont ajoutés comme dans l'exemple suivant :

struct PlaybackTrackMetadata {
…
    /** Tags from AudioTrack audio attributes */
    vec<AudioTag> tags;
};

La structure RecordTrackMetadata est implémentée de la même manière en ajoutant des tags spécifiques aux métadonnées de piste d'enregistrement.

Espace de noms des extensions du fournisseur

À partir de HAL V7, les extensions de fournisseur nécessitent un préfixe {vendor} supplémentaire qui n'est pas obligatoire dans V6. Pour que le préfixe {vendor} soit valide, il doit comporter au moins trois caractères alphanumériques.

Utilisez le format suivant dans V7 :

VX_{vendor}_{letters/numbers}

Voici quelques exemples d'extensions de fournisseur V7 valides :

  • VX_GOOGLE_VR
  • VX_QCI_AMBIENT_MIC

Informations de version

Le tableau suivant répertorie le numéro de version HAL pour chaque version d'Android :

Version d'Android Version 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