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

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 determinado dispositivo de áudio e categoria de áudio ou para um objeto MediaPlayer que seu aplicativo está usando para reprodução de mídia. Por exemplo, o sistema pode reduzir, ou "atenuar", o nível de reprodução de áudio quando um alarme está soando ou quando outro aplicativo abre um fluxo de áudio de comunicação (como uma chamada VoIP).

Note

No desktop, a atenuação de áudio é acionada quando o sistema detecta um fluxo de áudio de comunicação ativo, por exemplo, uma chamada usando a categoria AudioRenderCategory.Communications. O comportamento é controlado pela guia Communications no painel de configurações de som Windows. Alguns aplicativos de comunicação (como o Microsoft Teams) gerenciam sua própria mixagem de áudio e podem não acionar a redução automática do volume em nível de sistema.

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 chat de jogo. Um método de fábrica é invocado para obter um monitor de estado do áudio associado ao fluxo de captura de áudio do chat de jogo do dispositivo de comunicação padrão. Em seguida, um manipulador é registrado para o evento SoundLevelChanged , que é gerado quando o nível de áudio do fluxo associado é alterado pelo sistema.

AudioStateMonitor gameChatAudioStateMonitor;
// Create an AudioStateMonitor for game chat capture on the default communications device
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 passada para o manipulador para determinar o novo nível de áudio do fluxo. Neste exemplo, o aplicativo interrompe a captura de áudio quando o nível de som é silenciado 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:
            // Resume audio capture
            break;
        case SoundLevel.Muted:
            // Stop audio capture
            break;
        case SoundLevel.Low:
            // Audio capture should never be "ducked", only muted or full volume.
            break;
    }
}

Para obter mais informações sobre como capturar áudio com MediaCapture, consulte a captura básica de foto, vídeo e áudio com MediaCapture.

Cada instância da classe MediaPlayer tem um AudioStateMonitor associado a ele 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 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(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 o MediaPlayer, consulte Reproduzir áudio e vídeo com o MediaPlayer.