Compartilhar via


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 ou silencia o nível de áudio de um fluxo de áudio que seu aplicativo está usando. Você pode receber notificações para fluxos de captura e renderização, para um dispositivo de áudio e categoria de áudio específicos ou para um objeto MediaPlayer que seu aplicativo está usando para reprodução de mídia. Por exemplo, o sistema pode diminuir ou "diminuir" o nível de reprodução de áudio quando um alarme está tocando. O sistema silenciará seu aplicativo quando ele for para o segundo plano se o aplicativo não tiver declarado a funcionalidade backgroundMediaPlayback no manifesto do aplicativo.

O padrão para lidar com 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 áudio para o chat do jogo. Um método de fábrica é chamado para obter um monitor de estado de áudio associado ao fluxo de captura de áudio do chat do jogo do dispositivo de comunicação padrão. Em seguida, um manipulador é registrado para o evento SoundLevelChanged , que será gerado quando o nível de áudio do fluxo associado for 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, verifique a propriedade SoundLevel do remetente AudioStateMonitor passado para o manipulador para determinar qual é o novo nível de áudio para o fluxo. Neste exemplo, o aplicativo para de capturar áudio quando o nível de som é silenciado e retoma a captura quando o nível de áudio retorna ao volume máximo.

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 como capturar áudio com MediaCapture, consulte Captura básica de foto, vídeo e áudio com MediaCapture.

Cada instância da classe MediaPlayer tem um AudioStateMonitor associado a ela que você pode usar para detectar quando o sistema altera o nível de volume do conteúdo que está sendo reproduzido no momento. Você pode decidir lidar com as alterações de estado de áudio de forma diferente, dependendo do tipo de conteúdo que está sendo reproduzido. Por exemplo, você pode decidir pausar a reprodução de um podcast quando o áudio for reduzido, 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 o uso MediaPlayer, confira Reproduzir áudio e vídeo com MediaPlayer.