Vue d’ensemble de l’ACP
Cette section décrit l’interface de programmation de l’ACP. La bibliothèqueacphal (acphal.lib) définit l’ensemble d’API du Scalable Hardware Audio Processing Engine (SHAPE). Le Microsoft Game Development Kit (GDK) inclut également un ensemble d’utilitaires audio et de code source pour vous aider à préparer les données audio en vue de leur utilisation avec SHAPE. Les en-têtes des utilitaires définissent les éléments suivants :
- Les structures de contexte pour chaque format de données pris en charge
- Un ensemble complet de fonctions permettant de lire et d’écrire dans ces contextes
- Flowgraphs
- Utilitaires DMA
- Utilitaires du compresseur EQ
- Utilitaires de filtre de volume
- Utilitaires PCM
- Utilitaires SRC
- Utilitaires XMA
- Valeurs cibles
- Sécurité des threads
- Recommandations pour l’utilisation du SRC avec des données PCM et XMA
- Mise en pause et reprise d’un titre
Flowgraphs
Pour utiliser SHAPE, un titre crée généralement un flowgraph SHAPE. Pour une description d’une autre solution, consultez la section Utilitaires XMA. Un flowgraph SHAPE est un tableau de commandes (une par bloc SHAPE) accompagné de données de contexte qui décrivent l’ordre des opérations des différents blocs et les données sur lesquelles ils opèrent. L’ACP utilise les données du flowgraph pour planifier correctement les opérations au sein des blocs SHAPE. Le titre est chargé de construire le flowgraph et de le soumettre à l’ACP. Pour construire un flowgraph, utilisez ShapeFlowGraph (méthodes utilitaires de flowgraph). Dans les figures suivantes, les blocs verts représentent les composants SHAPE, les blocs cyan correspondent au matériau source et les cercles jaunes étiquetés sont les tampons de mixage matériels.- Sons 3D
- Frontal d’un moteur audio logiciel
- Rendu audio
- Analyse des flowgraphs
- Mise à jour des flowgraphs
- Flowgraphs multiples
Sons 3D
Figure 1. Deux voix, chacune panoramiquée entre deux sorties, avec un envoi vers une sortie commune.
Frontal d’un moteur audio logiciel
Figure 2. Un frontal de base pour un moteur logiciel. Potentiellement, toutes les voix qui utilisent ce modèle utiliseraient la même structure.
Rendu audio
Pour effectuer le rendu audio- Créez un flowgraph semblable à ceux présentés dans les exemples précédents, qui définit le graphe audio à traiter.
- Créez des structures de contexte qui définissent comment et quoi le flowgraph va traiter.
-
Utilisez la méthode SubmitCommand pour soumettre le flowgraph à l’ACP. Selon les paramètres de
SubmitCommand, le flowgraph est traité une seule fois puis supprimé, ou traité à chaque trame audio. -
Le titre est chargé de mettre à jour les données de contexte pour chaque trame audio à l’aide des commandes
ACP_COMMAND_UPDATE_*_CONTEXT, ou en synchronisant correctement les mises à jour avec le traitement du flowgraph et en mettant à jour manuellement les contextes.- ACP_COMMAND_UPDATE_DMA_CONTEXT
- ACP_COMMAND_UPDATE_EQCOMP_CONTEXT
- ACP_COMMAND_UPDATE_FILTVOL_CONTEXT
- ACP_COMMAND_UPDATE_PCM_CONTEXT
- ACP_COMMAND_UPDATE_SRC_CONTEXT
- ACP_COMMAND_UPDATE_XMA_CONTEXT
ACP_COMMAND_TYPE_UPDATE_*_CONTEXT pour mettre à jour un petit nombre de contextes par trame audio. L’utilisation de ces commandes pour mettre à jour un grand nombre de contextes n’est pas efficace, car une grande quantité de données de contexte doit être copiée et transmise à l’ACP, en plus du traitement des commandes. Si vous souhaitez mettre à jour un grand nombre de contextes, un titre doit modifier les données de contexte puis soumettre des flowgraphs non persistants à l’ACP, ou tirer parti de la commande ACP_COMMAND_TYPE_START_FLOWGRAPH et du paramètre waitForStart de la commande ACP_COMMAND_LOAD_SHAPE_FLOWGRAPH pour suspendre le traitement jusqu’à ce que le contexte soit mis à jour. Lorsque le flowgraph a terminé son traitement, les contextes peuvent de nouveau être mis à jour.
Une troisième solution pour mettre à jour les contextes consiste à utiliser un processus de double mise en mémoire tampon. Le titre peut mettre à jour la seconde copie des contextes pendant le traitement du flowgraph, puis permuter les contextes au début d’une trame audio.
Analyse des flowgraphs
L’ACP met fin à l’analyse des flowgraphs persistants à la fin de la trame audio, qui est une trame audio ACP limitée à 2,667 ms. Si un titre dispose d’un flowgraph dont le traitement occupe 75 % d’une trame audio, mais que le titre ne laisse le traitement démarrer qu’à 30 % de la trame audio, les parties du flowgraph qui n’ont pas été analysées sont purgées. Le flowgraph lui-même n’est pas modifié. Dans ce cas, l’ACP envoie le messageACP_MESSAGE_TYPE_FLOWGRAPH_TERMINATED si le titre s’est inscrit pour recevoir les messages. Pour déterminer quelles commandes n’ont pas été insérées dans les files d’attente SHAPE internes, le titre doit examiner l’indicateur queued de la commande de flowgraph.
Les flowgraphs non persistants sont généralement traités jusqu’à leur terme, quel que soit le moment de leur soumission. L’une des exceptions est le blocage d’une ou plusieurs commandes en raison de l’indisponibilité des données sources ou d’une mauvaise utilisation de l’indicateur disabled. Un titre peut soumettre un flowgraph non persistant à tout moment au cours d’une trame audio ACP et avoir la certitude (à l’exception de quelques cas limites) qu’il sera terminé. L’avantage est qu’un titre n’a pas besoin d’être parfaitement synchrone avec l’horloge audio, tant qu’il continue de traiter les flowgraphs dans l’intervalle de trame audio ACP de 2,667 ms. Le risque est qu’un titre provoque des coupures audio s’il ne soumet pas ses flowgraphs de manière régulière ou si les flowgraphs nécessitent plus de 2,667 ms.
Voici un résumé de la durée de vie des flowgraphs.
- Un flowgraph persistant reste actif sur l’ACP jusqu’à ce qu’il soit remplacé par la soumission d’un nouveau flowgraph ou d’un flowgraph null, ce qui le supprime effectivement.
- L’ACP commence à traiter un flowgraph persistant au début d’une trame audio, sauf si le client demande à l’ACP d’attendre une commande de démarrage.
- L’ACP arrête de traiter un flowgraph persistant peu avant la fin de la trame audio, même s’il n’a pas été entièrement traité.
- Un flowgraph non persistant n’est actif que jusqu’à ce qu’il soit terminé, puis il est supprimé.
- Un flowgraph non persistant reste actif d’une trame audio à l’autre. Il n’est supprimé qu’une fois terminé.
Le traitement des commandes n’est pas lié à l’analyse des flowgraphs. L’ACP recherche en permanence de nouvelles commandes et les traite aussi vite que possible pendant qu’il analyse un flowgraph ou effectue d’autres tâches.
Mise à jour des flowgraphs
Les options de mise à jour des flowgraphs sont semblables à celles de mise à jour des contextes décrites précédemment. La règle de base est la même : ne mettez pas à jour les flowgraphs pendant leur traitement. Vous pouvez utiliser trois stratégies pour mettre à jour les flowgraphs.- Utilisez des flowgraphs non persistants, reconstruisez-les si nécessaire et soumettez-les au début de la trame audio. Un titre peut réutiliser le même flowgraph autant de fois que nécessaire. Si le flowgraph ne change pas, le titre n’a pas besoin de le reconstruire. Vous pouvez également appliquer la double mise en mémoire tampon à cette approche en construisant un nouveau flowgraph pendant le traitement de l’ancien. Lors de leur reconstruction, les flowgraphs peuvent non seulement être construits de zéro, mais leurs sections peuvent aussi être stockées et liées selon les besoins en définissant de manière appropriée les ID des tampons de mixage.
-
Utilisez des flowgraphs persistants et ne les reconstruisez et remplacez que lorsque des modifications sont nécessaires. La double mise en mémoire tampon fonctionne ici aussi. L’ACP peut fonctionner librement si vous n’utilisez pas le paramètre
waitForStartde ACP_COMMAND_LOAD_SHAPE_FLOWGRAPH. L’ACP commence à traiter le flowgraph dès le début de la trame audio, juste après le traitement des commandes associées à cette trame audio. Vous pouvez également définir le paramètrewaitForStartpour empêcher le traitement du flowgraph jusqu’à l’envoi de la commandeACP_COMMAND_TYPE_START_FLOWGRAPH. Cela n’affecte pas directement les mises à jour des flowgraphs, mais permet une légère amélioration de la synchronisation. -
Utilisez l’indicateur
disableddes commandes de flowgraph pour désactiver des parties d’un flowgraph. Par exemple, un flowgraph maître peut être construit, mais seules les sections nécessaires sont activées à chaque exécution. Cette option doit être combinée avec l’option 1 ou 2 pour transmettre le nouveau flowgraph à l’ACP. Notez que l’ACP ne parcourt actuellement pas le flowgraph pour rechercher les blocs orphelins. Un titre doit désactiver des chemins complets dans le flowgraph (et pas seulement les premiers nœuds). Sinon, les commandes SHAPE bloquent temporairement le matériel. Ces blocages peuvent être simples, comme un bloc unique qui ne peut pas être traité et qui est supprimé à faible coût. Ils peuvent aussi être suffisamment graves pour bloquer une voix entière.
ACP_MESSAGE_TYPE_FLOWGRAPH_COMPLETED pour gérer les mises à jour, l’ACP peut rester inactif pendant une période prolongée entre le moment où l’ACP ajoute le message à la file d’attente des messages et celui où le titre appelle PopMessage. N’utilisez pas cette approche pour gérer les mises à jour : maintenez l’ACP actif.
Flowgraphs multiples
Un titre peut traiter plusieurs flowgraphs par trame audio si leurs besoins combinés ne dépassent pas les capacités du matériel. L’avantage est qu’un titre peut exécuter plusieurs moteurs audio, middleware comme personnalisés, ou découper leur analyse en blocs plus faciles à gérer. L’inconvénient est que le matériel SHAPE ne fonctionne pas aussi efficacement dans ce mode. Pour atteindre le débit maximal de SHAPE, chaque bloc SHAPE doit être occupé à 100 %, ce qui est impossible lorsque plusieurs flowgraphs sont traités. Un seul flowgraph peut être chargé par client ACP. Si un client soumet un nouveau flowgraph, celui-ci remplace le flowgraph existant. Un titre qui doit prendre en charge plusieurs flowgraphs doit soit disposer de clients distincts pour chaque type de flowgraph (chaque client ayant ses propres files d’attente de commandes et de messages), soit attendre qu’un flowgraph soit terminé avant d’en soumettre un nouveau. La prise en charge de plusieurs flowgraphs est conçue pour être utilisée par plusieurs clients, et non par un seul. Cela permet à un moteur middleware de soumettre son flowgraph et au titre de soumettre un flowgraph distinct pour un traitement personnalisé supplémentaire. Pour chaque client ACP requis par le titre, créez une instance de l’interfaceIACPHAL.
Comme toutes les ressources ACP et SHAPE sont partagées entre tous les clients (en particulier les tableaux de contextes), les clients doivent coordonner l’allocation et le partage de ces ressources.
Utilitaires DMA
Incluez les utilitaires Direct Memory Access (DMA) du fichier ShapeDMAContext.h. Les utilitaires suivants opèrent sur une structure SHAPE_DMA_CONTEXT. Pour plus d’informations, consultez ShapeDmaContext (méthodes utilitaires DMA).Utilitaires du compresseur EQ
Incluez les utilitaires EQCOMP du fichier ShapeEqCompContext.h. Ces utilitaires opèrent sur une structure SHAPE_EQCOMP_CONTEXT. Pour plus d’informations, consultez ShapeEqCompContext (méthodes utilitaires EQCOMP).Utilitaires de filtre de volume
Incluez les utilitaires de filtre de volume du fichier ShapeFiltVolContext.h. Ces utilitaires opèrent sur une structure SHAPE_FILTVOL_CONTEXT. Pour plus d’informations, consultez ShapeFiltVolContext (méthodes utilitaires FLTVOL).Utilitaires PCM
Incluez les utilitaires Pulse Code Modulation (PCM) du fichier ShapePCMContext.h. Ces utilitaires opèrent sur une structure SHAPE_PCM_CONTEXT. Pour plus d’informations, consultez ShapePcmContext (méthodes utilitaires PCM).Utilitaires SRC
Incluez les utilitaires Sample Rate Convertor (SRC) du fichier ShapeSRCContext.h. Ces utilitaires opèrent sur une structure SHAPE_SRC_CONTEXT. Pour plus d’informations, consultez ShapeSrcContext (méthodes utilitaires SRC).Utilitaires XMA
Incluez les utilitaires XMA du fichier ShapeXMAContext.h. Ces utilitaires opèrent sur une structure SHAPE_XMA_CONTEXT. Pour plus d’informations, consultez ShapeXmaContext (méthodes utilitaires XMA). Les capacités de décodage XMA de l’émulation matérielle sont limitées. Pour plus de détails, consultez la rubrique sur la structure SHAPE_XMA_CONTEXT. Un titre peut utiliser des données XMA sans utiliser de flowgraphs, mais les données doivent toujours passer par l’ACP à l’aide des commandes ACP_COMMAND_TYPE présentées dans le tableau suivant.
À l’aide de ces commandes, un titre peut utiliser l’ACP HAL de la XBOX One de manière presque identique à la façon dont il utilise le XMA HAL de la XBOX 360, selon l’ordre d’opérations suivant.
- Remplissez le ou les contextes avec les données pertinentes : tampons, décalages, etc.
- Activez les contextes.
-
Mettez à jour les contextes. Si le contexte est désactivé, le titre peut en modifier directement le contenu. Si le contexte est activé, le titre peut d’abord le désactiver ou utiliser la commande
ACP_COMMAND_TYPE_UPDATE_XMA_CONTEXT, ce qui peut être plus efficace, car l’ACP se charge de la désactivation, de l’attente et de la mise à jour.
Valeurs cibles
Les valeurs cibles pouvant être définies dans les fonctions utilitaires représentent les valeurs finales du paramètre à la fin de la trame audio. Par exemple, la structure SHAPE_FILTVOL_CONTEXT contient des valeurs pourgain et gainTarget. Pendant le traitement de la trame, le gain est calculé par interpolation linéaire à l’aide de l’équation suivante.
gain est égal à gainTarget.
Les paramètres cibles peuvent être définis pour l’ACP comme indiqué dans le tableau suivant.
Sécurité des threads
Les méthodes de l’interface IACPHAL et les méthodes ACPHAL sont thread-safe. Si l’appel ApuCreateHeap est effectué, le tas est utilisé par tous les threads. Les fonctions utilitaires suivantes ne sont pas thread-safe. Toutefois, leur code source est fourni. Si nécessaire, vous pouvez les rendre thread-safe. La méthode habituelle consiste à utiliser des objets de section critique.- ShapeFlowGraph (flowgraph)
- ShapeDmaContext (DMA)
- ShapeEqCompContext (EQCOMP)
- ShapeFiltVolContext (FLTVOL)
- ShapePcmContext (PCM)
- ShapeSrcContext (SRC)
- ShapeXmaContext (XMA)
Recommandations pour l’utilisation du SRC avec des données PCM et XMA
Le tableau suivant présente les recommandations pour l’utilisation du bloc SRC avec des données PCM et XMA.Lorsque l’un de ces scénarios est terminé, la commande SRC est
SHAPE_SRC_COMMAND_TYPE_STOP_IMMEDIATE.Mise en pause et reprise d’un titre
Un titre doit pouvoir être mis en pause et repris, par exemple lorsque l’utilisateur le fait passer en mode contraint. Pour mettre en pause et reprendre lorsque vous codez directement pour le matériel SHAPE à l’aide deIAcpHal, faites simplement en sorte que le titre cesse de soumettre des commandes. Les commandes déjà soumises se terminent normalement et peuvent remplir la file d’attente des messages.
Si un titre utilise des flowgraphs persistants, il doit charger un flowgraph null pour arrêter le traitement. Ce processus diffère de la mise en pause et de la reprise lorsque vous codez à l’aide de XAudio2. Pour plus d’informations, consultez la vue d’ensemble de XAudio2.
Documentation de référence de l’API
- Acphal (contenu de l’API)
- Shapedmacontext (contenu de l’API)
- Structures
- Shapeeqcompcontext (contenu de l’API)
- Structures
- Shapefiltvolcontext (contenu de l’API)
- Structures
- Shapeflowgraph (contenu de l’API)
- Shapepcmcontext (contenu de l’API)
- Structures
- Shapesrccontext (contenu de l’API)
- Structures
- Shapexmacontext (contenu de l’API)
- Structures
- apu (contenu de l’API)
- Fonctions
