Routage combiné des appareils audio

La fonctionnalité de routage combiné des appareils audio permet de diffuser du contenu audio sur plusieurs appareils audio simultanément. Grâce à cette fonctionnalité, les applications privilégiées peuvent sélectionner plusieurs appareils préférés pour une stratégie particulière à l'aide d'API système. Les applications peuvent découvrir les fonctionnalités des appareils audio plus précisément à l'aide des API publiques fournies par cette fonctionnalité. Pour les versions d'Android 11 et antérieures, l'implémentation du framework audio est limitée pour plusieurs appareils audio du même type (par exemple, deux casques Bluetooth A2DP) connectés simultanément. De plus, les règles de routage audio par défaut ne permettent pas aux utilisateurs de sélectionner plusieurs appareils du même type pour un cas d'utilisation donné.

À partir d'Android 12, ces limites sont supprimées afin de permettre de nouveaux cas d'utilisation, tels que la diffusion audio, la multidiffusion vers un groupe de casques audio BLE ou la sélection simultanée de plusieurs cartes son USB. Le routage vers plusieurs appareils USB simultanément n'est pas pris en charge.

À partir d'Android 14, le framework USB prend en charge le routage vers plusieurs appareils USB, à condition que les appareils USB soient de types d'appareils audio différents et que le noyau et le fournisseur prennent en charge la connexion simultanée de plusieurs appareils USB.

Cette page explique comment implémenter la prise en charge de la diffusion audio sur plusieurs appareils audio et comment valider l'implémentation de cette fonctionnalité.

Prendre en charge la diffusion audio sur plusieurs appareils audio

Android 12 comporte deux ensembles d'API qui prennent en charge cette fonctionnalité :

  • Les API système gèrent plusieurs appareils préférés pour une stratégie.
  • L'interface HIDL, implémentée par le fournisseur dans le cadre de la HAL audio, signale les fonctionnalités de l'appareil.

Les sections suivantes décrivent chacune de ces API plus en détail.

Gérer plusieurs appareils préférés pour une stratégie

L'Audio Policy Manager propose des API système pour mieux prendre en charge la diffusion audio sur plusieurs appareils audio simultanément. Ces API système permettent de définir, d'obtenir et de supprimer plusieurs appareils préférés pour une stratégie donnée. Jusqu'à Android 12, cette fonctionnalité n'était compatible qu'avec un seul appareil.

L'Audio Policy Manager introduit le concept d'appareils multimédias actifs pour décrire les appareils les plus susceptibles d'être sélectionnés pour la lecture multimédia. Lorsqu'un appareil amovible est connecté, les flux de sortie HAL audio qui peuvent être routés vers cet appareil peuvent devoir être ouverts et sondés pour les attributs compatibles.

Un appareil audio doit être spécifié lors de l'ouverture d'un flux de sortie. L'appareil multimédia actif est l'appareil utilisé lorsque les flux de sortie sont ouverts dans ce contexte.

La sélection de l'appareil multimédia actif peut changer en fonction des appareils connectés ou déconnectés. L'Audio Policy Manager utilise la série de règles suivante pour choisir les appareils multimédias actifs :

  1. Si tous les appareils préférés pour les médias sont disponibles, ils sont tous choisis comme appareils actifs.
  2. Sinon, le dernier appareil amovible connecté est choisi.
  3. Si aucun appareil amovible n'est connecté, les règles de stratégie audio par défaut pour le choix des appareils de sortie sont appliquées pour choisir les appareils actifs.

Un flux de sortie doit répondre aux critères suivants pour être rouvert et routé vers les appareils actifs afin que la meilleure configuration soit sélectionnée pour la lecture :

  • Le flux de sortie doit être compatible avec les appareils actifs.
  • Le flux de sortie doit être compatible avec les profils dynamiques.
  • Le flux de sortie ne doit pas être routé vers des appareils actifs.

Pour appliquer une nouvelle sélection d'appareil, l'Audio Policy Manager ferme et rouvre un flux de sortie lors de la connexion de l'appareil si le flux de sortie est inactif, ou le diffère jusqu'à ce que le flux de sortie soit mis en veille.

L'Audio Policy Manager propose la liste suivante d'API système(telles que définies dans AudioManager.java) :

  • setPreferredDeviceForStrategy

    Définit l'appareil par défaut pour le routage audio pour une stratégie donnée. Notez que l'appareil peut ne pas être disponible au moment où l'appareil préféré est défini, mais il est utilisé une fois disponible.

  • removePreferredDeviceForStrategy

    Supprime le ou les appareils audio préférés précédemment définis avec setPreferredDeviceForStrategy ou setPreferredDevicesForStrategy.

  • getPreferredDeviceForStrategy

    Renvoie l'appareil préféré pour une stratégie audio précédemment définie avec setPreferredDeviceForStrategy ou setPreferredDevicesForStrategy.

  • setPreferredDevicesForStrategy

    Définit les appareils préférés pour une stratégie donnée.

  • getPreferredDevicesForStrategy

    Renvoie les appareils préférés pour une stratégie audio précédemment définie avec setPreferredDeviceForStrategy ou setPreferredDevicesForStrategy.

  • OnPreferredDevicesForStrategyChangedListener

    Définit une interface pour la notification des modifications apportées aux appareils audio préférés définis pour une stratégie audio donnée.

  • addOnPreferredDevicesForStrategyChangedListener

    Ajoute un écouteur pour être informé des modifications apportées à l'appareil audio préféré de la stratégie.

  • removeOnPreferredDevicesForStrategyChangedListener

    Supprime un écouteur précédemment ajouté pour les modifications apportées à l'appareil audio préféré de la stratégie.

Signaler les fonctionnalités de l'appareil

Dans le cadre de l'implémentation de la HAL audio, les fournisseurs implémentent les API qui prennent en charge le signalement des fonctionnalités de l'appareil. Cette section explique les types de données et les méthodes utilisées pour signaler les fonctionnalités de l'appareil, et répertorie certaines modifications apportées à la HAL HIDL audio V7 pour prendre en charge plusieurs appareils.

Types de données

Dans la HAL HIDL audio V7, les fonctionnalités de l'appareil sont signalées à l'aide des structures AudioProfile et AudioTransport. La structure AudioTransport décrit la fonctionnalité d'un port audio avec AudioProfile pour les formats audio connus, ou avec des descripteurs matériels bruts pour les formats inconnus de la plate-forme. La structure AudioProfile contient le format audio, les taux d'échantillonnage compatibles avec le profil et la liste des masques de canaux, comme illustré dans le bloc de code suivant de types.hal :

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

Dans la HAL HIDL audio V7, le type de données AudioPort est défini avec les structures AudioTransport et AudioProfile pour décrire les fonctionnalités de l'appareil.

Méthodes HAL audio

L'Audio Policy Manager utilise les méthodes suivantes pour interroger les fonctionnalités de l'appareil :

  • getParameters:A generic method for retrieving vendor-specific parameter values such as supported audio formats and their respective sampling rates.
  • getAudioPort:Renvoie la liste des attributs compatibles (tels que les taux d'échantillonnage, les formats, les masques de canaux, les contrôleurs de gain) pour un port audio donné.

Le code suivant de IDevice.hal montre l'interface de la méthode getAudioPort :

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

Modifications apportées à l'API héritée

Pour prendre en charge plusieurs profils audio, la version 3.2 de l'API héritée ajoute une nouvelle structure appelée audio_port_v7. Pour en savoir plus, consultez le code source.

En raison de l'ajout de audio_port_v7, la version 3.2 de l'API héritée ajoute une nouvelle API appelée get_audio_port_v7 pour interroger les fonctionnalités des appareils à l'aide de la audio_port_v7 structure.

Le code suivant de audio.h montre la définition de l'API get_audio_port_v7 :

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

Les données de l'API héritée get_audio_port doivent être renseignées dans le nouveau format AudioPort lorsque la version de l'API héritée est inférieure à 3.2 et que la version de la HAL HIDL est 7 ou supérieure. Dans ce cas, tous les taux d'échantillonnage et masques de canaux signalés par get_audio_port sont supposés être compatibles avec tous les formats renvoyés, ce qui permet un mappage simple des valeurs get_audio_port vers la nouvelle structure AudioPort.

Exemples d'implémentations d'API

Cette section décrit plusieurs suites de tests contenant des méthodes qui utilisent les API abordées dans les sections précédentes. Consultez ces méthodes pour obtenir des exemples d'implémentation et d'utilisation de ces API.

Un exemple d'utilisation des API système setPreferredDevicesForStrategy, getPreferredDevicesForStrategy, removePreferredDeviceForStrategy et OnPreferredDevicesForStrategyChangedListener se trouve dans la méthode PreferredDeviceRoutingTest, qui se trouve dans GTS.

Pour voir un exemple de la nouvelle structure dans AudioDeviceInfo, consultez la méthode AudioManagerTest#testGetDevices, qui se trouve dans CTS.

Un exemple d'implémentation pour get_audio_port_v7 se trouve dans audio_hal.c et montre comment les fonctionnalités sont interrogées pour plusieurs appareils.

Validation

Cette section fournit des informations sur la validation CTS et GTS (suite de tests des services Google Mobile) de l'Audio Manager.

Tests CTS

Les tests CTS se trouvent dans android.media.cts.AudioManagerTest.

Voici la liste des tests Audio Manager disponibles :

  • AudioManagerTest#testGetDevices

    Vérifie les fonctionnalités précises de l'appareil audio. Il vérifie également que les profils audio renvoyés dans la structure AudioDeviceInfo conservent le contenu de l'ancien format de tableau aplati, mais qu'ils sont au nouveau format AudioProfile.

  • AudioManagerTest#testPreferredDevicesForStrategy et AudioManagerTest#testPreferredDeviceForCapturePreset

    Vérifiez que les tests d'API associés aux appareils préférés pour la stratégie et le préréglage de capture se terminent correctement.

Tests GTS

Les tests GTS se trouvent dans com.google.android.gts.audioservice.AudioServiceHostTest.

Pour vérifier si les API pour les appareils préférés pour la stratégie et le préréglage de capture fonctionnent correctement, exécutez les tests AudioServiceHostTest#testPreferredDeviceRouting et AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset.