Обнаружение и реагирование на изменения уровня звука системой
Узнайте, как обнаруживать и реагировать на изменения уровня звука системой. Начиная с Windows 10 версии 1803, ваше приложение может определять, когда система снижает или отключает уровень звука потоков звукозаписи и воспроизведения вашего приложения. Например, система может отключить потоки приложения, когда оно переходит в фоновый режим.
Дополнительные сведения о захвате звука с помощью класса MediaCapture см. в разделе Базовые фото, видео и аудиозапись с помощью MediaCapture. Сведения о воспроизведении звука с помощью MediaPlayerсм. в разделе TBD.
Класс AudioStateMonitor позволяет вам зарегистрироваться, чтобы получать уведомление, когда система изменяет громкость потока захвата или отрисовки звука. Получите экземпляр AudioStateMonitor для мониторинга потоков аудиозахвата путем вызова CreateForCaptureMonitoring. Чтобы получить экземпляр для мониторинга потоков рендеринга звука, вызовите CreateForRenderMonitoring. Зарегистрируйте обработчик события SoundLevelChanged для каждого монитора, чтобы получать уведомления, когда система изменяет уровень аудио для соответствующей категории потока.
AudioStateMonitor captureAudioStateMonitor;
AudioStateMonitor renderAudioStateMonitor;
captureAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoring();
captureAudioStateMonitor.SoundLevelChanged += CaptureAudioStateMonitor_SoundLevelChanged;
renderAudioStateMonitor = AudioStateMonitor.CreateForRenderMonitoring();
renderAudioStateMonitor.SoundLevelChanged += RenderAudioStateMonitor_SoundLevelChanged;
В обработчике SoundLevelChanged для потока записи вы можете проверить свойство SoundLevel передатчика AudioStateMonitor, чтобы определить новый уровень звука. Обратите внимание, что поток записи никогда не должен быть уменьшен или автоматически понижен системой. Он всегда должен быть отключен или переключен на максимальную громкость. Если аудиопоток отключен, можно остановить запись. Если аудиопоток восстанавливается до полной громкости, вы можете снова начать захват.
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();
}
}
Связанные разделы
Windows developer