Compartilhar via


Detectar e responder a alterações no nível de áudio pelo sistema

Saiba como detectar e responder a alterações no nível de áudio pelo sistema. A partir do Windows 10, versão 1803, seu aplicativo pode detectar quando o sistema reduz ou silencia o nível de áudio dos fluxos de renderização de áudio e captura de áudio do aplicativo. Por exemplo, o sistema pode silenciar os fluxos do aplicativo quando ele entra em segundo plano.

Para saber mais sobre como capturar áudio usando a classe MediaCapture , consulte a captura básica de foto, vídeo e áudio com MediaCapture. Para obter informações sobre a reprodução de áudio usando o MediaPlayer, consulte Reproduzir áudio e vídeo com o MediaPlayer.

A classe AudioStateMonitor permite que você se registre para receber um evento quando o sistema modifica o volume de uma captura de áudio ou fluxo de renderização. Obtenha uma instância do AudioStateMonitor para monitorar fluxos de captura de áudio chamando CreateForCaptureMonitoring. Obtenha uma instância para monitorar fluxos de renderização de áudio chamando CreateForRenderMonitoring. Registre um manipulador para o evento SoundLevelChanged de cada monitor a ser notificado quando o áudio da categoria de fluxo correspondente for alterado pelo sistema.

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

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

No manipulador SoundLevelChanged para o fluxo de captura, você pode verificar a propriedade SoundLevel do remetente AudioStateMonitor para determinar o novo nível de som. Observe que um fluxo de captura nunca deve ser reduzido ou "abaixado", pelo sistema. Ele deve ser apenas silenciado ou alternado de volta para o volume total. Se o fluxo de áudio estiver mudo, você poderá interromper uma captura em andamento. Se o fluxo de áudio for restaurado para o volume completo, você poderá começar a capturar novamente.

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

O exemplo de código a seguir ilustra uma implementação do manipulador SoundLevelChanged para renderização de áudio. Dependendo do cenário do seu aplicativo e do tipo de conteúdo que você está reproduzindo, pode ser desejável pausar a reprodução de áudio quando o nível de som for reduzido.

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

Captura básica de foto, vídeo e áudio com MediaCapture