Partager via


Récupération d’une erreur de Invalid-Device

La plupart des méthodes dans WASAPI retournent le code d’erreur AUDCLNT_E_DEVICE_INVALIDATED si le périphérique de point de terminaison audio utilisé par l’application cliente ne devient pas valide. Ce code d’erreur indique que l’appareil de point de terminaison a été débranché, ou que le matériel audio ou les ressources matérielles associées ont été reconfigurés, désactivés, supprimés ou rendus indisponibles. Souvent, l’application peut récupérer à partir de cette erreur.

Notes

Pour plus d’informations sur la récupération d’erreurs d’appareil non valides lors de l’utilisation d’API d’audio spatial (ISAC), consultez Récupération d’une erreur de Invalid-Device (son spatial)

La stratégie qu’une application doit utiliser pour récupérer à partir d’une erreur de AUDCLNT_E_DEVICE_INVALIDATED dépend des techniques suivantes utilisées par l’application pour sélectionner un appareil de point de terminaison audio :

  • Sélectionnez toujours le périphérique de rendu audio ou de capture par défaut.
  • Sélectionnez un appareil de point de terminaison audio spécifique.

Dans ce dernier cas, soit l’application sélectionne automatiquement un appareil spécifique en fonction des exigences internes, soit elle permet à l’utilisateur de sélectionner explicitement un appareil dans une liste d’appareils disponibles.

Une application qui utilise l’appareil par défaut peut tenter de récupérer à partir d’une erreur AUDCLNT_E_DEVICE_INVALIDATED comme suit :

  1. Libérez l’interface IAudioClient et toutes les autres interfaces WASAPI qu’elle a acquises sur l’appareil.
  2. Appelez la méthode IMMDeviceEnumerator::GetDefaultAudioEndpoint pour obtenir le périphérique audio par défaut actuel.
  3. Essayez d’activer IAudioClient sur le périphérique audio par défaut.

En suivant les étapes précédentes, l’application a tendance à répondre de manière appropriée, quelle que soit la cause de l’erreur AUDCLNT_E_DEVICE_INVALIDATED. Si la reconfiguration de l’appareil par défaut a provoqué l’erreur (par exemple, si l’utilisateur a modifié le format de flux utilisé par l’appareil), ces étapes, si elles réussissent, permettent à l’application de continuer à utiliser le même appareil. Si l’utilisateur a désactivé ou supprimé l’appareil utilisé par l’application et qu’un autre appareil est disponible pour assumer le rôle d’appareil par défaut, l’application peut continuer à utiliser le nouvel appareil par défaut. Dans les deux cas, l’application s’adapte automatiquement sans nécessiter l’intervention de l’utilisateur.

Une application qui sélectionne un appareil spécifique peut tenter de récupérer à partir de l’erreur AUDCLNT_E_DEVICE_INVALIDATED comme suit :

  1. Libérez l’interface IAudioClient et toutes les autres interfaces WASAPI qu’elle a acquises sur l’appareil.
  2. Essayez d’activer une interface IAudioClient sur le même appareil.
  3. Si l’étape 2 échoue, l’application peut, en option, inviter l’utilisateur à sélectionner un autre appareil.

L’étape 2 peut réussir si l’appareil utilisé par l’application a été reconfiguré, mais pas désactivé ou supprimé. Si elle réussit, l’étape 2 permet à l’application de continuer automatiquement à utiliser le même appareil sans nécessiter l’intervention de l’utilisateur. L’étape 3 est appropriée si l’application permet à l’utilisateur de sélectionner explicitement un autre appareil après que l’utilisateur a désactivé ou supprimé l’appareil précédemment utilisé.

Une application peut déterminer plus précisément la cause d’une erreur d’appareil non valide en s’inscrivant pour recevoir une notification lorsqu’une session perd sa connexion à un appareil. Pour activer cette notification, l’application implémente une interface IAudioSessionEvents et appelle la méthode IAudioSessionControl::RegisterAudioSessionNotification pour inscrire l’interface. Lorsqu’une erreur d’appareil non valide provoque la déconnexion de la session, WASAPI appelle la méthode IAudioSessionEvents::OnSessionDisconnected dans l’interface inscrite. Par le biais de cette méthode, WASAPI informe l’application de la raison de la déconnexion. Dans Windows Vista, l’appel OnSessionDisconnected identifie les raisons suivantes :

  • L’utilisateur a supprimé le périphérique de point de terminaison audio.
  • Le service audio Windows s’est arrêté.
  • Le format de flux préféré a changé pour l’appareil auquel la session audio est connectée.
  • L’utilisateur s’est déconnecté de la session WTS (Terminal Windows Services) dans laquelle la session audio s’exécutait. Pour plus d’informations sur les sessions WTS, consultez la documentation du Kit de développement logiciel (SDK) Windows.
  • La session WTS dans laquelle la session audio s’exécutait a été déconnectée.
  • La session audio (en mode partagé) a été déconnectée pour rendre le périphérique de point de terminaison audio disponible pour une connexion en mode exclusif.

En réponse à l’événement de déconnexion, WASAPI ferme tous les flux qui appartiennent à la session. Si une application tente par la suite d’accéder à un flux fermé via une méthode WASAPI telle que IAudioClient::GetCurrentPadding, la méthode échoue et retourne le code d’erreur AUDCLNT_E_DEVICE_INVALIDATED.

Un autre avantage de la réception de notifications via l’interface IAudioSessionEvents est que les notifications arrivent de manière asynchrone. Ainsi, même lorsque le flux n’est pas en cours d’exécution, l’application reçoit toujours une notification en temps opportun des erreurs d’appareil non valides qui peuvent empêcher l’exécution du flux.

Gestion des flux