Partager via


Détecter et répondre aux modifications au niveau audio par le système

Découvrez comment détecter et répondre aux modifications de niveau audio par le système. À compter de Windows 10, version 1803, votre application peut détecter quand le système diminue ou désactive le niveau audio de la capture audio et des flux de rendu audio de votre application. Par exemple, le système peut couper le son des flux audio de votre application lorsqu’elle passe en arrière-plan.

Pour en savoir plus sur la capture audio à l’aide de la classe MediaCapture , consultez la capture photo, vidéo et audio de base avec MediaCapture. Pour plus d’informations sur la lecture audio à l’aide de MediaPlayer, consultez Lire l’audio et la vidéo avec MediaPlayer.

La classe AudioStateMonitor vous permet de vous inscrire pour recevoir un événement lorsque le système modifie le volume d’une capture audio ou d’un flux de rendu. Obtenez une instance d’AudioStateMonitor pour surveiller les flux de capture audio en appelant CreateForCaptureMonitoring. Obtenez une instance pour surveiller les flux de rendu audio en appelant CreateForRenderMonitoring. Inscrivez un gestionnaire à l’événement SoundLevelChanged de chaque moniteur pour recevoir une notification lorsque l’audio de la catégorie de flux correspondante est modifié par le système.

AudioStateMonitor captureAudioStateMonitor;
AudioStateMonitor renderAudioStateMonitor;
captureAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoring();
captureAudioStateMonitor.SoundLevelChanged += CaptureAudioStateMonitor_SoundLevelChanged;

renderAudioStateMonitor = AudioStateMonitor.CreateForRenderMonitoring();
renderAudioStateMonitor.SoundLevelChanged += RenderAudioStateMonitor_SoundLevelChanged;

Dans le gestionnaire SoundLevelChanged pour le flux de capture, vous pouvez vérifier la propriété SoundLevel de l’expéditeur AudioStateMonitor pour déterminer le nouveau niveau sonore. Notez qu’un flux de capture ne doit jamais être abaissé ou « atténué » par le système lui-même. Il ne doit jamais être désactivé ou rebasculé vers le volume complet. Si le flux audio est désactivé, vous pouvez arrêter une capture en cours. Si le flux audio est restauré en volume complet, vous pouvez recommencer la capture.

bool isCapturingAudio = false;
bool capturingStoppedForAudioState = false;

private void CaptureAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    switch (sender.SoundLevel)
    {
        case SoundLevel.Full:
            if (capturingStoppedForAudioState)
            {
                MyStartAudioCapture();
                capturingStoppedForAudioState = false;
            }
            break;
        case SoundLevel.Muted:
            if (isCapturingAudio)
            {
                MyStopAudioCapture();
                capturingStoppedForAudioState = true;
            }
            break;
        case SoundLevel.Low:
            // This should never happen for capture
            Debug.WriteLine("Unexpected audio state.");
            break;
    }
}

L’exemple de code suivant illustre une implémentation du gestionnaire SoundLevelChanged pour le rendu audio. Selon votre scénario d’application et le type de contenu que vous jouez, vous pouvez suspendre la lecture audio lorsque le niveau sonore est réduit.

bool contentIsPodcast; 
private void RenderAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    if ((sender.SoundLevel == SoundLevel.Full) ||
        (sender.SoundLevel == SoundLevel.Low && !contentIsPodcast))
    {
        m_mediaPlayer.Play();
    }
    else if ((sender.SoundLevel == SoundLevel.Muted) ||
         (sender.SoundLevel == SoundLevel.Low && contentIsPodcast))
    {
        // Pause playback if we�re muted or if we�re playing a podcast and are ducked
        m_mediaPlayer.Pause();
    }
}

Capture photo, vidéo et audio de base avec MediaCapture