Détecter les changements d’état audio et y répondre
À compter de Windows 10, version 1803, votre application peut détecter quand le système diminue ou désactive le niveau audio d’un flux audio que votre application utilise. Vous pouvez recevoir des notifications pour les flux de capture et de rendu, pour un périphérique audio particulier et une catégorie audio, ou pour un objet MediaPlayer que votre application utilise pour la lecture multimédia. Par exemple, le système peut diminuer, ou « canard », le niveau de lecture audio lorsqu’une alarme sonne. Le système désactive votre application lorsqu’elle passe en arrière-plan si votre application n’a pas déclaré la fonctionnalité backgroundMediaPlayback dans le manifeste de l’application.
Le modèle de gestion des modifications d’état audio est le même pour tous les flux audio pris en charge. Tout d’abord, créez une instance de la classe AudioStateMonitor. Dans l’exemple suivant, l’application utilise la classe MediaCapture pour capturer l’audio pour la conversation de jeu. Une méthode de fabrique est appelée pour obtenir un moniteur d’état audio associé au flux de capture audio de conversation de jeu du périphérique de communication par défaut. Ensuite, un gestionnaire est inscrit pour l’événement SoundLevelChanged , qui sera déclenché lorsque le niveau audio du flux associé est modifié par le système.
AudioStateMonitor gameChatAudioStateMonitor;
string deviceId = Windows.Media.Devices.MediaDevice.GetDefaultAudioCaptureId(Windows.Media.Devices.AudioDeviceRole.Communications);
gameChatAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoringWithCategoryAndDeviceId(MediaCategory.GameChat, deviceId);
gameChatAudioStateMonitor.SoundLevelChanged += GameChatSoundLevelChanged;
Dans le gestionnaire d’événements SoundLevelChanged, vérifiez la propriété SoundLevel de l’expéditeur AudioStateMonitor passée dans le gestionnaire pour déterminer le nouveau niveau audio du flux. Dans cet exemple, l’application arrête de capturer l’audio lorsque le niveau sonore est désactivé et reprend la capture lorsque le niveau audio revient à un volume complet.
private void GameChatSoundLevelChanged(AudioStateMonitor sender, object args)
{
switch (sender.SoundLevel)
{
case SoundLevel.Full:
StartAudioCapture();
break;
case SoundLevel.Muted:
StopAudioCapture();
break;
case SoundLevel.Low:
// Audio capture should never be "ducked", only muted or full volume.
Debug.WriteLine("Unexpected audio state change.");
break;
}
}
Pour plus d’informations sur la capture de l’audio avec MediaCapture, consultez photo de base, vidéo et capture audio avec MediaCapture.
Chaque instance de la classe MediaPlayer a un AudioStateMonitor associé à celui-ci que vous pouvez utiliser pour détecter quand le système modifie le niveau de volume du contenu en cours de lecture. Vous pouvez décider de gérer les modifications d’état audio différemment selon le type de contenu en cours de lecture. Par exemple, vous pouvez décider de suspendre la lecture d’un podcast lorsque l’audio est réduit, mais continuer la lecture si le contenu est de la musique.
bool isPodcast;
bool isPausedDueToAudioStateMonitor;
private void AudioStateMonitor_SoundLevelChanged(Windows.Media.Audio.AudioStateMonitor sender, object args)
{
if ((sender.SoundLevel == SoundLevel.Full) || (sender.SoundLevel == SoundLevel.Low && !isPodcast))
{
if (isPausedDueToAudioStateMonitor)
{
mediaPlayer.Play();
isPausedDueToAudioStateMonitor = false;
}
}
else if ((sender.SoundLevel == SoundLevel.Muted) ||
(sender.SoundLevel == SoundLevel.Low && isPodcast))
{
if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
{
mediaPlayer.Pause();
isPausedDueToAudioStateMonitor = true;
}
}
}
Pour plus d’informations sur l’utilisation de MediaPlayer, consultez Lire des fichiers audio et vidéo avec MediaPlayer.