HIDL Audio HAL

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.

audio_hal

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 être conformes à leurs schémas, et la conformité est vérifiée par les 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 et IPrimaryDevice.hal contiennent des méthodes telles que setMasterVolume ou openInputStream.
  • Les flux sont unidirectionnels et permettent à AudioFlinger d'envoyer ou de recevoir du contenu audio depuis et vers le HAL via IStream.hal, IStreamOut.hal et IStreamIn.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) permettant de coder avec des 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 la HAL audio dans Android 12, comme décrit 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:

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 règles 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 répertorié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 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: fournisseur extensible
  • AudioFormat: fournisseur extensible
  • 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 mettre en œuvre la logique métier et suivent la méthode de conversion illustrée dans la Figure 3:

audio-passing-values

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:

  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é de l'HAL, le wrapper par défaut convertit la chaîne en une valeur d'énumération, qui est transmise à l'ancienne HAL.

Modifications du schéma XML

La présence de listes complètes de valeurs d'énumération dans la définition de schéma XML (XSD) permet d'améliorer la 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 V7, un caractère standard (espace) est utilisé pour délimiter les listes de valeurs dans les attributs (tels que les taux d'échantillonnage, les masques de canal et les indicateurs), au lieu des symboles , (virgule) et | (barre verticale) utilisés dans V6 et 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 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 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 et AudioPortConfig

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

    remplace des collections non modifiables 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 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