次の方法で共有


システムによるオーディオ レベルの変更を検出して対応する

システムによるオーディオ レベルの変更を検出して対応する方法について説明します。 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 を使用して、基本的な写真、ビデオ、およびオーディオをキャプチャする