Considérations relatives à l’implémentation du routage de flux
Dans Windows 7, les API de plateforme de haut niveau qui utilisent des API Audio de base, telles que Media Foundation, DirectSound et Les API Wave, implémentent la fonctionnalité de routage de flux en gérant le basculement de flux d’un appareil existant vers un nouveau point de terminaison audio par défaut. Les applications multimédias qui utilisent ces API utilisent le comportement de routage de flux sans aucune modification de la source. Les clients WASAPI directs peuvent utiliser les notifications envoyées par les composants Core Audio et implémenter la fonctionnalité de routage de flux.
Les clients WASAPI directs (applications multimédias qui utilisent DIRECTEMENT WASAPI) reçoivent les notifications de session audio et de nouvel appareil envoyées par les composants Audio principaux. Le comportement de la fonctionnalité de routage de flux est défini par la façon dont l’application gère ces notifications.
L’API MMDevice et la session audio envoient des notifications sur les changements d’état de l’appareil et les modifications de session aux clients WASAPI sous la forme de rappels. Pour obtenir ces notifications, le client doit inscrire son implémentation d’IMMNotificationClient et D’IAudioSessionEvents. Pour plus d’informations, consultez Notifications pertinentes pour le routage de flux.
Dans le scénario de casque USB décrit dans Routage de flux, une application lit un flux audio et utilise MMDeviceAPI et WASAPI pour restituer le flux sur le périphérique de rendu par défaut, Haut-parleur. Lorsque l’appareil par défaut est modifié, l’application reçoit une notification IMMNotificationClient . L’application reçoit également des notifications IAudioSessionEvents indiquant que l’utilisateur a supprimé l’appareil de point de terminaison audio ou que le format du flux a changé pour l’appareil auquel la session audio est connectée. À la réception des notifications, l’application arrête la diffusion en continu vers le point de terminaison de l’orateur et rouvre le flux pour le rendu sur le point de terminaison par défaut actuel, le casque.
En réponse à ces notifications, le client peut rouvrir le flux sur le nouvel appareil par défaut dans le nouveau format sélectionné par l’utilisateur.
Gestion des flux
La liste suivante récapitule les étapes qu’un client WASAPI doit effectuer pour fournir la fonctionnalité de basculement de flux.
Attendez la notification IMMNotificationClient appropriée. Si l’appareil est l’appareil par défaut, la notification IMMNotificationClient::OnDefaultDeviceChanged est reçue.
Si un nouvel appareil est disponible, obtenez une référence au point de terminaison du nouvel appareil. Appelez IMMDeviceEnumerator::GetDefaultAudioEndpoint pour le nouvel appareil par défaut. Si le nouvel appareil n’est pas l’appareil par défaut, vous pouvez récupérer l’appareil en appelant IMMDeviceEnumerator::GetDevice. Pour plus d’informations, consultez Obtention du point de terminaison d’appareil pour le routage de flux.
Attendez la valeur IAudioSessionEvents::OnSessionDisconnected avec la valeur de raison.
Notes
Étant donné que toutes ces opérations sont asychrones, l’ordre dans lequel l’application reçoit les notifications de changement d’appareil et de déconnexion de session ne peut pas être prédit. L’application doit implémenter la gestion des notifications pour recevoir ces notifications dans n’importe quel ordre. Toutefois, en règle générale, l’application reçoit la valeur AudioSessionDisconnect avant la notification de changement d’appareil par défaut.
Évaluez la valeur de la raison et déterminez si le flux doit être transféré vers un autre point de terminaison audio ou s’il doit être réinitialisé avec un nouveau format.
Arrêtez la diffusion en continu vers l’ancien appareil par défaut si la raison indique que le flux doit être réacheminé vers le nouvel appareil par défaut.
Effectuez des calculs de mappage de position.
Ouvrez le flux sur le nouvel appareil et transférez toutes les informations d’état.
Reprendre la diffusion en continu sur le nouvel appareil par défaut.
Gérez le départ de l’ancien appareil par défaut.
Pour que l’opération de basculement de flux semble transparente, elle doit être effectuée aussi rapidement que possible. Cela dépend des performances des composants impliqués dans la réinitation du flux sur le nouvel appareil.
Considérations relatives au mappage de position
Lorsque l’application reçoit les notifications IMMNotificationClient et IAudioSessionEvents , elle peut acheminer les flux existants vers le nouvel appareil par défaut. Lorsqu’un flux audio existant est interrompu et ouvert sur le nouvel appareil, le rendu sur le nouvel appareil doit commencer à l’emplacement où le flux a été arrêté sur l’ancien appareil. Pour ce faire, l’application doit avoir la dernière position connue de l’appareil pour calculer la position de début sur le nouvel appareil. Par exemple, cette position peut être utilisée comme décalage delta pour le mappage de position suivant. Lorsque le flux démarre le rendu, la nouvelle position de l’appareil peut être réapplique à la position de l’appareil mis en cache.
Les étapes suivantes résument le processus d’une transition de flux fluide.
- Mettre en cache la dernière position de l’appareil du flux sur l’ancien appareil.
- Arrêtez le flux sur l’ancien appareil.
- Effectuez des calculs de remapping pour obtenir la nouvelle position.
- Commencez à afficher le flux sur le nouvel appareil.
- Relâchez l’ancien flux.
Pendant la transition, l’application doit s’assurer que l’horloge ne sort pas de la synchronisation, ce qui entraîne des flux audio et vidéo non synchronisés. Cela peut se produire si les exemples vidéo continuent de s’afficher pendant que le flux audio est acheminé vers le nouvel appareil. L’application doit mettre en cache la position d’horloge pour le calcul de remapping et s’assurer que les exemples vidéo ne sont pas rendus tant que le flux audio n’est pas rouvert sur le nouvel appareil, de sorte que lorsque le clip reprend le rendu, les flux audio et vidéo sont synchronisés. Dans certains cas, lorsque le temps de présentation pour le rendu des images vidéo est basé sur l’horloge audio, il suffit d’arrêter le flux audio jusqu’à ce que le changement de flux soit terminé et qu’aucune autre implémentation de mappage de position pour le flux vidéo n’est nécessaire pour la synchronisation vidéo audio.
Si, lors du rendu, IAudioRenderClient::GetBuffer retourne une erreur, car l’ancien appareil est perdu, l’application n’a pas besoin d’arrêter l’ancien flux, car l’opération de streaming est déjà terminée. Pour plus d’informations sur la gestion de cette erreur, consultez Récupération à partir d’une erreur de Invalid-Device.
Rubriques connexes