Compartir a través de


Detectar y responder a cambios de estado de audio

A partir de Windows 10, versión 1803, la aplicación puede detectar cuándo el sistema reduce omuta el nivel de audio de una secuencia de audio que usa la aplicación. Puedes recibir notificaciones para las secuencias de captura y representación, para un determinado dispositivo de audio y categoría de audio, o para un objeto MediaPlayer que tu aplicación usa para la reproducción multimedia. Por ejemplo, el sistema puede bajar o "pato", el nivel de reproducción de audio cuando una alarma suena. El sistema silenciará la aplicación cuando entre en segundo plano si la aplicación no ha declarado la funcionalidad backgroundMediaPlayback en el manifiesto de la aplicación.

El patrón para controlar los cambios de estado de audio es el mismo para todas las secuencias de audio admitidas. En primer lugar, cree una instancia de la clase AudioStateMonitor. En el ejemplo siguiente, la aplicación usa la clase MediaCapture para capturar audio para el chat del juego. Se llama a un método de fábrica para obtener un monitor de estado de audio asociado a la secuencia de captura de audio de chat del juego del dispositivo de comunicaciones predeterminado. A continuación, se registra un controlador para el evento SoundLevelChanged , que se generará cuando el sistema cambie el nivel de audio de la secuencia asociada.

AudioStateMonitor gameChatAudioStateMonitor;
string deviceId = Windows.Media.Devices.MediaDevice.GetDefaultAudioCaptureId(Windows.Media.Devices.AudioDeviceRole.Communications);
gameChatAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoringWithCategoryAndDeviceId(MediaCategory.GameChat, deviceId);
gameChatAudioStateMonitor.SoundLevelChanged += GameChatSoundLevelChanged;

En el controlador de eventos SoundLevelChanged , compruebe la propiedad SoundLevel del remitente AudioStateMonitor pasado al controlador para determinar cuál es el nuevo nivel de audio de la secuencia. En este ejemplo, la aplicación deja de capturar audio cuando se silencia el nivel de sonido y reanuda la captura cuando el nivel de audio vuelve al volumen completo.

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;
    }
}

Para obtener más información sobre cómo capturar audio con MediaCapture, consulta Captura básica de fotos, vídeos y audio con MediaCapture.

Cada instancia de la clase MediaPlayer tiene un AudioStateMonitor asociado a él que puedes usar para detectar cuándo cambia el nivel de volumen del contenido que se está reproducndo actualmente. Puede decidir controlar los cambios de estado de audio de forma diferente en función del tipo de contenido que se reproduce. Por ejemplo, puedes decidir pausar la reproducción de un podcast cuando se reduce el audio, pero continuar reproduciendo si el contenido es música.

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;
        }
    }

}

Para obtener más información sobre cómo usar MediaPlayer, consulte Reproducción de audio y vídeo con MediaPlayer.