다음을 통해 공유


시스템의 오디오 레벨 변화 감지 및 대응

시스템에서 오디오 수준 변경 내용을 감지하고 응답하는 방법을 알아봅니다. Windows 10 버전 1803부터 앱은 시스템이 앱의 오디오 캡처 및 오디오 렌더링 스트림의 오디오 수준을 낮추거나 음소거하는 시기를 감지할 수 있습니다. 예를 들어 시스템이 백그라운드로 전환할 때 앱의 스트림을 음소거할 수 있습니다.

MediaCapture 클래스를 사용하여 오디오를 캡처하는 방법에 대한 자세한 내용은 MediaCapture를 사용하여 기본 사진, 비디오 및 오디오 캡처를 참조하세요. MediaPlayer를 사용한 오디오 재생에 대한 자세한 내용은 MediaPlayer를 사용하여 오디오 및 비디오 재생을 참조하세요.

AudioStateMonitor 클래스를 사용하면 시스템에서 오디오 캡처 또는 렌더링 스트림의 볼륨을 수정할 때 이벤트를 수신하도록 등록할 수 있습니다. CreateForCaptureMonitoring을 호출하여 오디오 캡처 스트림을 모니터링하기 위한 AudioStateMonitor 인스턴스를 가져옵니다. CreateForRenderMonitoring을 호출하여 오디오 렌더링 스트림을 모니터링하는 인스턴스를 가져옵니다. 시스템에서 해당 스트림 범주의 오디오를 변경할 때 알림을 받을 각 모니터의 SoundLevelChanged 이벤트에 대한 처리기를 등록합니다.

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

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

캡처 스트림에 대한 SoundLevelChanged 처리기에서 AudioStateMonitor 발신자의 SoundLevel 속성을 확인하여 새 사운드 수준을 확인할 수 있습니다. 시스템에서 캡처 스트림을 낮추거나 "더킹"해서는 안 됩니다. 음소거하거나 다시 전체 볼륨으로 전환해야 합니다. 오디오 스트림이 음소거되면 진행 중인 캡처를 중지할 수 있습니다. 오디오 스트림이 전체 볼륨으로 복원되면 캡처를 다시 시작할 수 있습니다.

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

다음 코드 예제에서는 오디오 렌더링을 위한 SoundLevelChanged 처리기의 구현을 보여 줍니다. 앱 시나리오와 재생 중인 콘텐츠 유형에 따라 소리 수준이 더킹될 경우 오디오 재생을 일시 중지해야 할 수도 있습니다.

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

MediaCapture를 사용하여 기본 사진, 비디오 및 오디오 캡처