Detectar e responder a alterações de estado de áudio

A partir do Windows 10, versão 1803, seu aplicativo pode detectar quando o sistema reduz o nível ou silencia o nível de áudio de um stream de áudio usado pelo aplicativo. Você pode receber notificações de captura e renderizar fluxos para um dispositivo de áudio e categoria de áudio específico ou para um objeto MediaPlayer que o aplicativo está usando para reprodução de mídia. Por exemplo, o sistema pode reduzir ou "ignorar", o nível de reprodução de áudio quando um alarme está tocando. O sistema ativa o mudo do aplicativo quando entra em segundo plano caso não tenha declarado a funcionalidade backgroundMediaPlayback no manifesto.

O padrão para processar alterações de estado de áudio é o mesmo para todos os fluxos de áudio com suporte. Primeiro, crie uma instância da classe AudioStateMonitor. No exemplo a seguir, o aplicativo está usando a classe MediaCapture para capturar o áudio para chat de jogo. Um método de fábrica é chamado para obter um monitoramento de estado do áudio associado ao fluxo de captura de áudio de chat do jogo do dispositivo de comunicação padrão. Em seguida, um manipulador é registrado para o evento SoundLevelChanged, que pode ser acionado quando o nível de áudio do stream associado é alterado pelo sistema.

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

No manipulador de eventos SoundLevelChanged, marcar a propriedade SoundLevel do remetente AudioStateMonitor passada para o manipulador para determinar qual é o novo nível de áudio do fluxo. Neste exemplo, o aplicativo para de capturar áudio quando o nível de som é desligado e retoma a captura quando o nível de áudio retorna ao volume 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 obter mais informações sobre a captura de áudio com MediaCapture, consulte Captura de foto, vídeo e áudio básica com MediaCapture.

Cada instância da classe MediaPlayer tem um AudioStateMonitor associado para uso na detecção de alterações de nível de volume do conteúdo reproduzido no momento pelo sistema. Você pode optar por manipular alterações de estado de áudio de forma diferente dependendo do tipo de conteúdo reproduzido. Por exemplo, você pode decidir pausar a reprodução de um podcast quando o áudio é abaixado, mas continuar a reprodução se o conteúdo for 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 obter mais informações sobre como usar MediaPlayer, consulte Reproduzir áudio e vídeo com MediaPlayer.