Composition multicircuits ACX
Cette rubrique traite de la composition multi-circuit ACX. Pour une vue d'ensemble de l'ACX et une liste de termes ACX, voir Vue d'ensemble des extensions de la classe audio ACX.
Comme décrit dans Résumé des objets ACX, un AcxCircuit représente un chemin audio partiel ou complet vers un appareil audio perçu par l'utilisateur (haut-parleurs, micro, etc.). Un AcxCircuit a au moins une broche d’entrée et une broche de sortie (ACXPIN), et il peut agréger un ou plusieurs objets de type AcxElements. Pour des informations générales, voir Circuits ACX.
Composition des circuits ACX
ACX relie les circuits entre eux jusqu'à ce qu'ils forment un chemin audio complet. ACX utilise des liaisons audio pour connecter les circuits audio entre eux. En même temps, chaque circuit ACX est converti en filtre KS. Ces filtres KS sont ensuite détectés par l'Audio Endpoint Builder (AEB) qui s'exécute en tant que service en mode utilisateur. L'AEB analyse le graphique du filtre KS détecté et crée le point de terminaison audio logiciel représentant l'infrastructure audio soulignée lorsqu'il détecte un chemin audio complet.
Le diagramme suivant montre les objets ACX utilisés par ACX pour détecter, construire et surveiller les circuits composant le point de terminaison audio composite.
Important
Notez que seuls les types indiqués en bleu sont publics : ACXCIRCUITTEMPLATE, ACXCOMPOSITETEMPLATE (non illustré), ACXMANAGER, ACXCIRCUITFACTORY et ACXCIRCUIT. Tous les types représentés en violet sont internes et ne sont listés ici qu'à titre d'illustration. Il n'est pas garanti que les types internes restent les mêmes ou qu'ils soient disponibles dans les différentes versions d'ACX, et ils ne doivent pas être appelés ou utilisés directement.
Le gestionnaire ACX analyse les modèles de circuit au moment de l'initialisation du pilote, lorsque les pilotes ACX les enregistrent auprès du gestionnaire ACX. Les pilotes ACX enregistrent les modèles/liens composites en utilisant ACXCIRCUTTEMPLATES (#1).
Lorsque le gestionnaire ACX reçoit un modèle de circuit, il vérifie s'il s'agit d'un modèle d'instance ou d'un modèle de classe générique.
Pour les modèles d'instance, ACX crée un ACXCOMPOSITEMANAGER (#4), pour les modèles de classe générique, ACX crée un ACXCOMPOSITEFACTORY (#2), qui est responsable de la création d'éléments ACXCOMPOSITEMANAGER (#3) lorsqu'il détecte le circuit 'central' du composite. Les circuits centraux sont les circuits qui donnent l'identité à un point de terminaison audio composite.
L'ACXCOMPOSITEMANAGER crée à son tour l'ACXCOMPOSITE (#5) pour représenter le point de terminaison audio composite souligné. Le gestionnaire de composite est responsable de la surveillance de tout segment de circuit optionnel qui pourrait apparaître après la création/initialisation du composite.
L'ACXCOMPOSITE crée à son tour un ACXCIRCUITMANAGER (#6) pour chaque circuit faisant partie du composite. L'ACXCIRCUITMANAGER est responsable de la création, de la surveillance et du contrôle d'un seul circuit (#7).
Dans ce cas, l'ACXCIRCUITMANAGER trouve sa fabrique de circuits et demande un nouveau circuit pour le composite (#8). L'ACXCIRCUITFACTORY crée un ACXCIRCUIT conformément à la requête (#9).
Lorsque tous les ACXCIRCUITS sont détectés et actifs, l'ACXCOMPOSITE devient également actif et demande aux ACXCIRCUITMANAGERS d'activer les interfaces 'audio' de leurs circuits.
Le diagramme de séquence suivant montre comment deux circuits ACX (circuits A et B) sont liés pour créer un chemin audio complet, qui est représenté par le constructeur de point de terminaison audio (AEB) avec un appareil audio logiciel.
Négociation du format multi-circuits
Cette section décrit la négociation de format qui a lieu lorsque le point de terminaison audio est composé de deux circuits ou plus. Pour des informations générales sur les circuits ACX, reportez-vous à la section Communications multi-piles entre pilotes ACX.
Broches de pont de niveau inférieur
Les broches de pont de niveau inférieur sont les broches qui envoient des données à un appareil audio physique (rendu) ou reçoivent des données d'un appareil audio physique (capture) directement ou indirectement. Ce type de broches peut ou non être associé à des ACXMODEFORMATLIST. Ces broches de pont sont de type 'AcxPinQualifierBridgeB' ou 'AcxPinQualifierBridgeDevice'. Pour plus d'informations sur ACXMODEFORMATLIST, consultez l'en-tête acxdataformat.h.
Dans ce diagramme et dans cet article, les termes uplevel et downlevel sont utilisés pour décrire la direction du flux, car la direction du flux ascendant ou descendant dépend du fait que les broches envoient des données vers (rendu) ou reçoivent des données (capture).
Broches de pont de niveau inférieur sans ACXMODEFORMATLIST(s)
Un pilote peut choisir de ne pas exposer les listes de format de mode sur sa broche de niveau inférieur. Si les listes de format de mode ne sont pas disponibles sur une broche de pont de niveau inférieur, un utilisateur (via le panneau de contrôle du son) ou une autre entité logicielle ne peut pas contrôler/spécifier directement le format audio de cette broche et des flux associés. Voici quelques scénarios dans lesquels ces listes ne sont pas nécessaires :
Circuits de streaming uniquement qui peuvent être connectés à un circuit DSP, à un circuit CODEC ou directement à l'appareil audio. Ces circuits déplacent simplement les données d'un point A à un point B sans les modifier. Ces circuits ne modifient pas la fréquence d'échantillonnage des données du ou des flux entrants/sortants. Dans ce cas, les listes de format de mode sont associées à la broche de niveau supérieur.
Circuits à flux unique sans éléments modifiant le taux d'échantillonnage entrant/sortant. Le circuit d'un appareil audio USB en est un exemple. Dans ce cas, les listes de format de mode sont associées à la broche de niveau supérieur.
L'absence de liste de format de données implique que le format de données du flux provenant de cette broche est compatible avec l'un des formats de données de la broche de niveau supérieur du circuit connecté.
Broches de pont de niveau inférieur avec ACXMODEFORMATLIST(s)
Un pilote peut choisir d'exposer des listes de format de mode sur ses broches de niveau inférieur. Si les listes de format de mode sont disponibles sur une broche de pont de niveau inférieur, un utilisateur (via le panneau de contrôle du son) ou une autre entité logicielle peut directement contrôler/spécifier le format audio de cette broche et des flux associés.
Voici quelques scénarios valables dans lesquels ces listes de format de mode sont utilisées :
- Circuits DSP - normalement, ce type de circuits prend en charge plusieurs flux fonctionnant à des taux d'échantillonnage différents, ces flux sont convertis en interne à un taux d'échantillonnage commun et mélangés avant que les données ne passent au circuit suivant. La liste des formats de données contrôle/spécifie le taux d'échantillonnage final (pour ce circuit).
Lorsque la liste des formats de données est présente, ces formats de données doivent correspondre aux échantillons de format de données dans la broche de niveau supérieur de la broche du circuit suivant. Notez que les modes n'ont pas besoin de correspondre, voir la discussion sur les modes dans les sections ci-dessous.
Les listes de formats de niveau inférieur permettent à l'utilisateur/à la couche supérieure de contrôler le format du flux résultant. Dans ce cas, la valeur par défaut de la liste est le taux d'échantillonnage utilisé jusqu'à ce qu'une action explicite soit entreprise pour changer le format sur cette broche.
Pour plus d'informations sur les listes de format, consultez l'en-tête acxdataformat.h.
Broches de pont Uplevel
Les broches de pont Uplevel sont les broches qui reçoivent des données d'un module logiciel (render) ou qui lui envoient des données (capture) directement ou indirectement. Ce type de broches doit être associé à des ACXMODEFORMATLISTs. Ces broches de pont ont un type 'AcxPinQualifierBridgeA'.
Le diagramme précédent peut également être utilisé pour montrer le flux de données de rendu et de capture entre une broche de streaming, deux circuits et un appareil.
Utilisation des broches [Bridge] sans ACXMODEFORMATLIST(s)
Les points de terminaison sans liste de format de mode ne sont pas une combinaison valide et il en résulte un point de terminaison mal configuré. Le point de terminaison n'est pas visible du point de vue de l'utilisateur.
Broches Uplevel [Bridge] avec ACXMODEFORMQATLIST(s)
Les broches Uplevel doivent toujours avoir une ou plusieurs ACXMODEFORMATLISTs. Les listes de format de mode spécifient toutes les fréquences d'échantillonnage possibles pour un mode et sa fréquence d'échantillonnage par défaut. Des modes différents peuvent avoir des ensembles différents de taux d'échantillonnage. La fréquence d'échantillonnage par défaut est la fréquence d'échantillonnage préférée pour ce mode.
Modes et circuits
Les broches Uplevel des circuits à flux unique ou des circuits à flux multiples peuvent prendre en charge une ou plusieurs listes de formats de mode. Les circuits à flux unique ont un mode actif à la fois, tandis que les circuits à flux multiples peuvent avoir deux flux ou plus fonctionnant en même temps, avec la possibilité d'utiliser des modes différents.
Mappage des modes
Cette section présente brièvement les modes standard et explique pourquoi le mappage de mode est utilisé.
Mode RAW : le flux/circuit n'applique aucun effet au flux (à l'exception, éventuellement, du volume, du mute et des contraintes de sécurité telles que la protection des haut-parleurs).
Mode DEFAULT : le circuit applique un effet par défaut.
<mode_name> mode
DEFAULT mode : le flux/circuit applique des effets spécifiques au mode <mode_name> sélectionné.
Les broches de diffusion en continu doivent obligatoirement prendre en charge le mode brut et/ou le mode par défaut. Il est facultatif pour les broches de diffusion en continu de prendre en charge n'importe quel autre mode<mode_name> modes
.
Dans un point de terminaison composite, il est possible que le circuit de niveau supérieur prenne en charge plusieurs modes et que les circuits de niveau inférieur ne prennent en charge que le mode RAW et/ou DEFAULT.
Exemple dans un point de terminaison à deux circuits :
La broche de niveau inférieur du circuit de niveau supérieur prend en charge les modes et les formats associés m1{f1,f2} et m2{f3,f4}, ce qui signifie que le flux de la broche a un format f1 ou f2 lorsque m1 est utilisé, ou un format f3 ou f4 lorsque m2 est utilisé. Cela suppose que le circuit de niveau supérieur est un circuit à flux unique.
La broche de niveau supérieur du circuit de niveau inférieur prend en charge le mode par défaut{f1,f2,f3}.
Dans ce cas, le mode du flux est converti du mode <nom_mode> au mode par défaut tout en conservant les mêmes taux d'échantillonnage.
m1/f1 vers > défaut/f1
m1/f2 vers > défaut/f2
m2/f3 vers > défaut/f3
Entrée non valide : m2/f4 vers > Aucun
Le mappage des modes est effectué par le pilote à l'aide d'ACX. Dans le tableau ci-dessus, la dernière entrée n'est pas valide, la broche descendante du circuit de niveau supérieur devrait supprimer l'option m2/f4 pour ses formats pris en charge. Notez que cela aurait pu se produire dans le sens inverse, c'est-à-dire que la broche de niveau inférieur du circuit de niveau supérieur aurait pu supporter également f4 et f5. Dans ce cas, default-f4 était supporté mais default-f5 ne l'était pas. Dans ce cas, c'est la broche de niveau supérieur du circuit de niveau inférieur qui est responsable de ne pas répertorier m?/f5 comme option de sa liste. Les sections suivantes expliquent ce processus.
Négociations sur le format
Avant que l'ACX n'active les interfaces audio des circuits composant l'appareil composite, il s'assure que les circuits peuvent négocier le mode/format des données audio. ACX effectue cette notification aux circuits en invoquant le callback composite initialize sur tous les circuits de l'appareil composite. La séquence va du niveau inférieur (côté appareil) au niveau supérieur (côté système). Les circuits ont la possibilité de mettre à jour leurs formats pendant cette phase.
Affichage du panneau de contrôle du format de l'appareil
La logique actuelle du panneau de contrôle du format de l'appareil affiche la liste des formats de l'appareil de la manière suivante :
- Si l'appareil audio prend en charge un élément de moteur audio, la liste des formats de données affichée dans le panneau de contrôle est la liste des formats de données de l'appareil, c'est-à-dire la liste des formats de données attachée à la broche downlevel (qui est connectée à la broche de sortie de l'élément de moteur audio).
- Si l'appareil audio ne prend pas en charge un élément de moteur audio, la liste des formats de données affichée dans le panneau de contrôle est la liste des formats de données de la broche de streaming, c'est-à-dire la liste des formats de données attaqués à la broche de niveau supérieur.
Création automatique de flux de niveau inférieur multi-circuits
ACX utilise le ou les objets ACXSTREAMBRIDGE associés à une broche de pont de niveau inférieur pour propager automatiquement la requête de création de flux aux circuits distants.
Lorsqu'une application cliente crée un flux, cette requête est d'abord reçue par une broche de streaming. L'ACX notifie la requête de création de flux au pilote de l'épingle de flux via le rappel fourni, spécifié au moment de la création du circuit. Dans le rappel, le pilote crée un objet ACXSTREAM représentant le flux, puis renvoie le contrôle à l'ACX. Lorsque l'ACX reçoit le contrôle, il vérifie s'il doit transférer cette requête de création au circuit suivant (de niveau inférieur). En option, le pilote peut rediriger la requête de création vers le circuit suivant (de niveau inférieur) avant de revenir de son rappel de création de flux. Cette dernière option permet au pilote d'effectuer toutes les opérations de post-traitement après que les circuits de niveau inférieur ont eu la possibilité de traiter leurs requêtes de création.
ACX utilise la logique par défaut suivante pour la création de flux :
- S'il n'y a pas de broche de pont de niveau inférieur, tout est fait.
- Si le pilote a déjà associé manuellement le flux à un ACXSTREAMBRIDGE, tout est fait.
- Si la broche de pont de niveau inférieur n'a pas d'ACXSTREAMBRIDGE pour le MODE spécifié, la requête est rejetée.
- ACX ajoute le nouveau flux que le pilote a créé avec l'ACXSTREAMBRIDGE récupéré.
L'ACXSTREAMBRIDGE agit comme un multi-in/single-out. Tant qu'il y a un flux entrant, ACXSTREAMBRIDGE maintient un flux sortant présent. Le flux sortant n'est supprimé que lorsque le dernier flux entrant est supprimé. ACXSTREAMBRIDGE utilise les ACXDATAFORMATLISTs associées à la broche de pont de niveau inférieur lorsqu'il décide du mode et du format à utiliser pour le circuit distant.
ACXSTREAMBRIDGE utilise la logique suivante pour sélectionner le mode et le format de données du flux de sortie :
Si le MODE du flux sortant n'est pas spécifié, vérifiez s'il existe une liste de formats "par défaut".
Si le MODE du flux de sortie n'est pas spécifié et que la liste des formats "par défaut" n'est pas présente, vérifiez s'il existe une liste de formats "bruts".
Si MODE est NULL_GUID, vérifiez s'il existe une liste de formats associée au MODE du premier flux entrant.
Si MODE est spécifié, vérifiez s'il existe une liste de formats pour ce MODE.
Si une liste de formats est trouvée, le format par défaut est obtenu à partir de la liste de formats.
Si le format n'est pas trouvé, ACXSTREAMBRIDGE utilise le format du premier flux entrant.
ACXSTREAMBRIDGE construit une requête de création de flux à l'aide de l'ACXTARGETSTREAM en utilisant le MODE et le format de données récupérés comme suit :
- Si le MODE a été spécifié, c'est ce MODE qui est utilisé.
- Si MODE était NULL_GUID, le MODE du premier flux est utilisé.
- Sinon, aucun mode n'est utilisé.
ACX prend soin de supprimer/fermer le flux cible lorsque le dernier flux entrant est supprimé.
Une autre tâche du ACXSTREAMCIRCUIT est de propager automatiquement l'état d'un flux le long de la chaîne de diffusion.
Un pilote a la possibilité de désactiver la création de ponts de flux à distance du circuit par défaut en appelant AcxCircuitInitDisableDefaultStreamBridgeHandling ou en associant manuellement l'objet ACXSTREAM à un ACXSTREAMBRIDGE avant de renvoyer le contrôle à l'ACX. Dans ce dernier cas, le flux distant est créé avant que le pilote ne retourne la fonction de rappel EVT_ACX_CIRCUIT_CREATE_STREAM 'create-stream'.
Pour les circuits utilisant plusieurs broches de capture/rendu, comme host/offload/loopback/kws, c'est-à-dire lorsque l'élément audio-engine est pris en charge, le pilote doit créer un pont de flux sans spécifier de mode(s) d'entrée, et ajouter manuellement les objets ACXSTREAM entrants au pont de flux lors du traitement de la fonction de rappel create-stream.
Pour plus d'informations sur la création d'un pont de flux, voir :
Propagation automatique de l'état des flux multicircuits vers les flux de niveau inférieur
ACXSTREAMBRIDGE propage automatiquement une requête d'état de flux vers les circuits distants. Lorsque l'état d'un flux change, l'ACXSTREAMBRIDGE calcule l'état mixte du flux sortant et envoie cette nouvelle requête d'état de flux au flux distant à l'aide de l'ACXTARGETSTREAM.
L'ACXSTREAM et l'ACXSTREAMBRIDGE utilisent la logique suivante :
Dans ces scénarios, les états des flux de niveau supérieur sont modifiés en premier :
- Afficher && à partir de Stop->Run
- Capturer && à partir de Run->Stop
- Autre && à partir de Run->Stop
Modifiez en dernier les états des flux de niveau supérieur dans les scénarios suivants :
- Afficher && à partir de Run->Stop
- Capturer && à partir de Stop->Run
- Autre && à partir de Stop->Run
Les pilotes ont la possibilité d'inverser cet ordre via un paramètre de configuration.
Remarque
Un pilote/circuit/flux doit toujours réussir les transitions de flux de la marche à l'arrêt. En revanche, il est permis à un pilote d'échouer à l'inverse, c'est-à-dire de passer de l'arrêt à l'exécution.
Voir aussi
Vue d’ensemble des extensions de classe audio ACX