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