Passer au contenu principal
Cette rubrique présente une brève procédure pas à pas d’utilisation de la manipulation audio en temps réel. Game Chat 2 vous offre la possibilité de vous insérer dans le pipeline audio du clavardage pour inspecter et manipuler les données audio du clavardage des utilisateurs. Cela peut être utile pour appliquer des effets audio intéressants aux voix des utilisateurs en jeu. Dans Game Chat 2, l’interaction avec le pipeline de manipulation audio s’effectue au moyen d’objets de flux audio qui peuvent être interrogés pour obtenir des données audio. Contrairement à l’utilisation de rappels, ce modèle vous permet d’inspecter ou de manipuler l’audio sur le thread de traitement qui vous convient le mieux.

Initialisation du pipeline de manipulation audio

Par défaut, Game Chat 2 n’active pas la manipulation audio en temps réel. Pour l’activer, l’application doit spécifier les formes de manipulation audio qu’elle souhaite activer dans chat_manager::initialize en définissant le paramètre audioManipulationMode. Actuellement, les formes de manipulation audio suivantes sont prises en charge; elles figurent dans l’énumération game_chat_audio_manipulation_mode_flags.
  • game_chat_audio_manipulation_mode_flags::none : désactive la manipulation audio. Il s’agit de la configuration par défaut. Dans ce mode, l’audio du clavardage circule sans interruption.
  • game_chat_audio_manipulation_mode_flags::pre_encode_stream_manipulation : active la manipulation audio avant encodage. Dans ce mode, tout l’audio du clavardage généré par les utilisateurs locaux passe par le pipeline de manipulation audio avant d’être encodé. Même si l’application se contente d’inspecter les données audio du clavardage sans les manipuler, il lui incombe toujours de renvoyer à Game Chat 2 les mémoires tampons audio non modifiées afin qu’elles puissent être encodées et transmises.
  • game_chat_audio_manipulation_mode_flags::post_decode_stream_manipulation : active la manipulation audio après décodage. Dans ce mode, tout l’audio du clavardage reçu des utilisateurs distants passe par le pipeline de manipulation audio après avoir été décodé par le destinataire, mais avant d’être restitué. Même si l’application se contente d’inspecter les données audio du clavardage sans les manipuler, il lui incombe toujours de mixer et de renvoyer à Game Chat 2 les mémoires tampons audio non modifiées afin qu’elles puissent être restituées.

Traitement des changements d’état des flux audio

Game Chat 2 fournit des mises à jour de l’état des flux audio au moyen de structures game_chat_stream_state_change. Ces mises à jour indiquent quel flux a été mis à jour et de quelle manière. Ces mises à jour peuvent être interrogées au moyen de la paire de méthodes chat_manager::start_processing_stream_state_changes() et chat_manager::finish_processing_stream_state_changes(). Elles fournissent toutes les dernières mises à jour d’état des flux audio en file d’attente, sous la forme d’un tableau de pointeurs vers des structures game_chat_stream_state_change. Les applications doivent parcourir le tableau et traiter chaque mise à jour de manière appropriée. Une fois toutes les mises à jour game_chat_stream_state_change disponibles traitées, ce tableau doit être renvoyé à Game Chat 2 via chat_manager::finish_processing_stream_state_changes(). C’est ce qu’illustre l’exemple suivant.

Manipulation des données audio du clavardage avant encodage

Game Chat 2 donne accès aux données audio du clavardage des utilisateurs locaux avant encodage au moyen de la classe pre_encode_audio_stream.

Durée de vie des flux

Lorsqu’une nouvelle instance de pre_encode_audio_stream est prête à être utilisée par l’application, elle est fournie au moyen d’une structure game_chat_stream_state_change dont le champ state_change_type est défini sur game_chat_stream_state_change_type::pre_encode_audio_stream_created. Une fois ce changement d’état du flux renvoyé à Game Chat 2, le flux audio devient disponible pour la manipulation audio avant encodage. Lorsqu’un pre_encode_audio_stream existant devient indisponible pour la manipulation audio, l’application en est informée au moyen d’une structure game_chat_stream_state_change dont le champ state_change_type est défini sur game_chat_stream_state_change_type::pre_encode_audio_stream_closed. C’est l’occasion pour l’application de commencer à nettoyer les ressources associées à ce flux audio. Une fois ce changement d’état du flux renvoyé à Game Chat 2, le flux audio devient indisponible pour la manipulation audio avant encodage. Lorsque toutes les ressources d’un pre_encode_audio_stream fermé ont été restituées, le flux est détruit et l’application en est informée au moyen d’une structure game_chat_stream_state_change dont le champ state_change_type est défini sur game_chat_stream_state_change_type::pre_encode_audio_stream_destroyed. Toutes les références ou tous les pointeurs vers ce flux doivent être nettoyés. Une fois ce changement d’état du flux renvoyé à Game Chat 2, la mémoire du flux audio devient non valide.

Utilisateurs des flux

La liste des utilisateurs associés à un flux peut être inspectée à l’aide de pre_encode_audio_stream::get_users().

Formats audio

Le format audio des mémoires tampons que l’application récupère auprès de Game Chat 2 peut être inspecté à l’aide de pre_encode_audio_stream::get_pre_processed_format(). Le format audio avant traitement est mono. L’application doit s’attendre à traiter des données représentées sous forme de flottants 32 bits, d’entiers 16 bits et d’entiers 32 bits. L’application doit indiquer à Game Chat 2 le format audio des mémoires tampons manipulées qu’elle lui soumet pour encodage et transmission, à l’aide de pre_encode_audio_stream::set_processed_format(). Les formats traités des flux audio avant encodage doivent respecter les conditions préalables suivantes.
  • Le format doit être mono.
  • Le format doit être PCM flottant 32 bits, PCM entier 32 bits ou PCM entier 16 bits.
  • La fréquence d’échantillonnage du format doit respecter les conditions préalables propres à sa plateforme. XBOX One ERA et XBOX Series X|S prennent en charge les fréquences d’échantillonnage de 8 kHz, 12 kHz, 16 kHz et 24 kHz. La plateforme Windows universelle (UWP) pour XBOX One et le PC Windows prennent en charge les fréquences d’échantillonnage de 8 kHz, 12 kHz, 16 kHz, 24 kHz, 32 kHz, 44,1 kHz et 48 kHz.

Récupération et soumission de l’audio avant encodage

Les applications peuvent interroger les flux audio avant encodage pour connaître le nombre de mémoires tampons disponibles à traiter, à l’aide de pre_encode_audio_stream::get_available_buffer_count(). Ces informations peuvent être utilisées si l’application souhaite retarder le traitement audio jusqu’à ce qu’un nombre minimal de mémoires tampons soit disponible. Seules 10 mémoires tampons sont mises en file d’attente sur chaque flux audio avant encodage, et les retards audio introduisent une latence dans le pipeline audio. Nous recommandons aux applications de vider leurs flux audio avant encodage avant que plus de 4 mémoires tampons ne soient en file d’attente.

Récupération des mémoires tampons audio avec get_next_buffer()

Les applications peuvent récupérer des mémoires tampons audio d’un flux audio avant encodage à l’aide de pre_encode_audio_stream::get_next_buffer(). De nouvelles mémoires tampons audio sont disponibles en moyenne toutes les 40 ms. Les mémoires tampons retournées par cette méthode doivent être libérées au moyen de pre_encode_audio_stream::return_buffer() une fois leur utilisation terminée. Un maximum de 10 mémoires tampons en file d’attente ou non restituées peut exister à un instant donné pour un flux audio avant encodage. Une fois cette limite atteinte, les nouvelles mémoires tampons capturées à partir de la source audio de l’utilisateur sont abandonnées jusqu’à ce que certaines des mémoires tampons en attente soient restituées.

Soumission des mémoires tampons audio avec submit_buffer()

Les applications peuvent retourner leurs mémoires tampons audio inspectées et manipulées à Game Chat 2 pour encodage et transmission à l’aide de pre_encode_audio_stream::submit_buffer(). Game Chat 2 prend en charge la manipulation audio sur place et hors place. Les mémoires tampons soumises à pre_encode_audio_stream::submit_buffer() ne sont pas nécessairement les mêmes que celles récupérées auprès de pre_encode_audio_stream::get_next_buffer(). La confidentialité et les privilèges de ces mémoires tampons soumises sont appliqués en fonction des utilisateurs associés à ce flux. Toutes les 40 ms, les 40 ms d’audio suivantes de ce flux sont encodées et transmises. Pour éviter les coupures audio, les mémoires tampons d’un audio qui doit être entendu en continu doivent être soumises à ce flux à un rythme constant.

Contextes de flux

Les applications peuvent gérer des valeurs de contexte personnalisées de la taille d’un pointeur sur les flux audio avant encodage à l’aide de pre_encode_audio_stream::set_custom_stream_context() et de pre_encode_audio_stream::custom_stream_context(). Ces contextes de flux personnalisés sont utiles pour établir des correspondances entre les flux audio de Game Chat 2 et des données auxiliaires, par exemple les métadonnées des flux et l’état du jeu.

Exemple

Voici un exemple simplifié de bout en bout de l’utilisation des flux audio avant encodage dans une trame de traitement audio.

Manipulation des données audio du clavardage après décodage

Game Chat 2 donne accès aux données audio du clavardage après décodage au moyen des classes post_decode_audio_source_stream et post_decode_audio_sink_stream. Cela signifie que les utilisateurs peuvent manipuler l’audio des utilisateurs distants de manière distincte pour chaque destinataire local de l’audio du clavardage.

Sources et récepteurs

Contrairement au pipeline avant encodage, le modèle de traitement des données audio après décodage est réparti entre deux classes : post_decode_audio_source_stream et post_decode_audio_sink_stream. L’audio décodé des utilisateurs distants peut être récupéré à partir d’objets post_decode_audio_source_stream, manipulé, puis envoyé à des objets post_decode_audio_sink_stream pour être restitué. Cela permet l’intégration entre le pipeline de traitement audio après décodage de Game Chat 2 et des intergiciels audio utiles.

Durée de vie des flux

Lorsqu’une nouvelle instance de post_decode_audio_source_stream ou de post_decode_audio_sink_stream est prête à être utilisée par l’application, elle est fournie au moyen d’une structure game_chat_stream_state_change dont le champ state_change_type est défini sur game_chat_stream_state_change_type::post_decode_audio_source_stream_created ou game_chat_stream_state_change_type::post_decode_audio_sink_stream_created, respectivement. Une fois ce changement d’état du flux renvoyé à Game Chat 2, le flux audio devient disponible pour la manipulation audio après décodage. Lorsqu’un post_decode_audio_source_stream ou un post_decode_audio_sink_stream existant devient indisponible pour la manipulation audio, l’application en est informée au moyen d’une structure game_chat_stream_state_change dont le champ state_change_type est défini sur game_chat_stream_state_change_type::post_decode_audio_source_stream_closed ou game_chat_stream_state_change_type::post_decode_audio_sink_stream, respectivement. C’est l’occasion pour l’application de commencer à nettoyer les ressources associées à ce flux audio. Une fois ce changement d’état du flux renvoyé à Game Chat 2, le flux audio devient indisponible pour la manipulation audio après décodage. Pour les flux sources, cela signifie qu’aucune autre mémoire tampon n’est mise en file d’attente pour être manipulée. Pour les flux récepteurs, cela signifie que les mémoires tampons soumises ne sont plus restituées. Lorsque toutes les ressources d’un post_decode_audio_source_stream ou d’un post_decode_audio_sink_stream fermé ont été restituées, le flux est détruit et l’application en est informée au moyen d’une structure game_chat_stream_state_change dont le champ state_change_type est défini sur game_chat_stream_state_change_type::post_decode_audio_source_stream_destroyed ou game_chat_stream_state_change_type::post_decode_audio_sink_stream_destroyed, respectivement. Toutes les références ou tous les pointeurs vers ce flux doivent être nettoyés. Une fois ce changement d’état du flux renvoyé à Game Chat 2, la mémoire du flux audio devient non valide.

Utilisateurs des flux

La liste des utilisateurs distants associés à un flux source après décodage peut être inspectée à l’aide de post_decode_audio_source_stream::get_users(). La liste des utilisateurs locaux associés à un flux récepteur après décodage peut être inspectée à l’aide de post_decode_audio_sink_stream::get_users().

Formats audio

Le format audio des mémoires tampons que l’application récupère auprès de Game Chat 2 peut être inspecté à l’aide de post_decode_audio_source_stream::get_pre_processed_format(). Le format audio avant traitement est toujours mono, PCM entier 16 bits. L’application doit indiquer à Game Chat 2 le format audio des mémoires tampons manipulées qu’elle lui soumet pour restitution, à l’aide de post_decode_audio_sink_stream::set_processed_format(). Les formats traités des flux récepteurs audio après décodage doivent respecter les conditions préalables suivantes.
  • Le format doit comporter moins de 64 canaux.
  • Le format doit être PCM entier 16 bits (optimal), PCM entier 20 bits (dans un conteneur 24 bits), PCM entier 24 bits, PCM entier 32 bits ou PCM flottant 32 bits (format préféré après le PCM entier 16 bits).
  • La fréquence d’échantillonnage du format doit être comprise entre 1 000 et 200 000 échantillons par seconde.

Récupération et soumission de l’audio après décodage

Les applications peuvent interroger les flux sources audio après décodage pour connaître le nombre de mémoires tampons disponibles à traiter, à l’aide de post_decode_audio_source_stream::get_available_buffer_count(). Ces informations peuvent être utilisées si l’application souhaite retarder le traitement audio jusqu’à ce qu’un nombre minimal de mémoires tampons soit disponible. Seules 10 mémoires tampons sont mises en file d’attente sur chaque flux source audio après décodage, et les retards audio introduisent une latence dans le pipeline audio. Nous recommandons aux applications de vider leurs flux audio après décodage avant que plus de 4 mémoires tampons ne soient en file d’attente.

Récupération des mémoires tampons audio avec get_next_buffer()

Les applications peuvent récupérer des mémoires tampons audio d’un flux source audio après décodage à l’aide de post_decode_audio_source_stream::get_next_buffer(). De nouvelles mémoires tampons audio sont disponibles en moyenne toutes les 40 ms. Les mémoires tampons retournées par cette méthode doivent être libérées au moyen de post_decode_audio_source_stream::return_buffer() une fois leur utilisation terminée. Un maximum de 10 mémoires tampons en file d’attente ou non restituées peut exister à un instant donné pour un flux source audio après décodage. Une fois cette limite atteinte, les nouvelles mémoires tampons décodées provenant de l’utilisateur distant sont abandonnées jusqu’à ce que certaines des mémoires tampons en attente soient restituées.

Soumission des mémoires tampons audio avec submit_buffer()

Les applications peuvent retourner leurs mémoires tampons inspectées et manipulées à Game Chat 2, au moyen des flux récepteurs audio après décodage, pour restitution à l’aide de post_decode_audio_sink_stream::submit_mixed_buffer(). Game Chat 2 prend en charge la manipulation audio sur place et hors place. Les mémoires tampons soumises à post_decode_audio_sink_stream::submit_mixed_buffer() ne sont pas nécessairement les mêmes que celles récupérées auprès de post_decode_audio_source_stream::get_next_buffer(). Toutes les 40 ms, les 40 ms d’audio suivantes de ce flux sont restituées. Pour éviter les coupures audio, les mémoires tampons d’un audio qui doit être entendu en continu doivent être soumises à ce flux à un rythme constant.

Confidentialité et mixage

En raison du modèle source-récepteur du pipeline après décodage, il incombe à l’application de mixer les mémoires tampons récupérées à partir des objets post_decode_audio_source_stream et de soumettre les mémoires tampons mixées aux objets post_decode_audio_sink_stream pour restitution. Cela signifie également qu’il incombe à l’application d’effectuer ce mixage en appliquant correctement la confidentialité et les privilèges. Game Chat 2 fournit post_decode_audio_sink_stream::can_receive_audio_from_source_stream() pour rendre l’interrogation de ces informations simple et efficace.

Indicateurs de clavardage

La manipulation audio après décodage n’affecte pas l’état de l’indicateur de clavardage de chaque utilisateur. Par exemple, lorsqu’un utilisateur distant est rendu muet, l’audio est tout de même fourni à l’application. Toutefois, l’indicateur de clavardage de cet utilisateur distant indique toujours qu’il est muet. Lorsqu’un utilisateur distant parle, son audio est fourni. L’indicateur de clavardage indique alors qu’il parle, que l’application fournisse ou non un mixage audio contenant l’audio de cet utilisateur. Pour plus d’informations sur l’interface utilisateur et l’indicateur de clavardage, consultez Utilisation de Game Chat 2. Si des restrictions supplémentaires propres à l’application sont utilisées pour déterminer quels utilisateurs sont présents dans un mixage audio, il incombe à l’application de tenir compte de ces mêmes restrictions lorsqu’elle lit les indicateurs de clavardage fournis par Game Chat 2.

Contextes de flux

Les applications peuvent gérer des valeurs de contexte personnalisées de la taille d’un pointeur sur les flux audio après décodage à l’aide des méthodes post_decode_audio_source_stream::set_custom_stream_context et post_decode_audio_source_stream::custom_stream_context. Ces contextes de flux personnalisés sont utiles pour établir des correspondances entre les flux audio de Game Chat 2 et des données auxiliaires, par exemple les métadonnées des flux et l’état du jeu.

Exemple

Voici un exemple simplifié de bout en bout de l’utilisation des flux audio après décodage dans une trame de traitement audio.

Durée de vie des utilisateurs du clavardage

L’activation de la manipulation audio en temps réel affecte la durée de vie des utilisateurs du clavardage. Si chat_manager::remove_user(chatUserX) est appelée, l’objet chat_user pointé par chatUserX reste valide jusqu’à ce que tous les flux audio qui référencent chatUserX aient été détruits. Prenons le scénario suivant.

Documentation de référence de l’API

Voir aussi

Présentation de Game Chat 2 Utilisation de l’API C++ de Game Chat 2 Sommaire de l’API (GameChat2) Microsoft Game Development Kit
Dernière modification le 8 octobre 2026