Обнаружение изменения состояния звука и реагирование на него
Начиная с Windows 10 версии 1803, ваше приложение может определить, когда система снижает или отключает уровень звука аудиопотока, используемого приложением. Вы можете получать уведомления об отслеживании и отрисовке потоков, для определенной звуковой и звуковой категории или для объекта MediaPlayer, используемого для воспроизведения мультимедиа. Например, система может снизить или "утка", уровень воспроизведения звука при звоне сигнализации. Система отключит приложение при переходе в фоновом режиме, если приложение не объявило функцию backgroundMediaPlayback в манифесте приложения.
Шаблон обработки изменений состояния звука одинаков для всех поддерживаемых звуковых потоков. Сначала создайте экземпляр класса AudioStateMonitor. В следующем примере приложение использует класс MediaCapture для записи звука для игрового чата. Метод фабрики вызывается для получения монитора состояния звука, связанного с потоком аудиозахвата игрового чата устройства связи по умолчанию. Затем обработчик регистрируется для события SoundLevelChanged , которое будет возникать при изменении уровня звука для связанного потока системой.
AudioStateMonitor gameChatAudioStateMonitor;
string deviceId = Windows.Media.Devices.MediaDevice.GetDefaultAudioCaptureId(Windows.Media.Devices.AudioDeviceRole.Communications);
gameChatAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoringWithCategoryAndDeviceId(MediaCategory.GameChat, deviceId);
gameChatAudioStateMonitor.SoundLevelChanged += GameChatSoundLevelChanged;
В обработчике событий SoundLevelChanged проверьте свойство SoundLevel отправителя AudioStateMonitor, переданное обработчику, чтобы определить, какой новый уровень звука для потока имеется. В этом примере приложение перестает записывать звук, когда уровень звука отключен и возобновляет запись, когда уровень звука возвращается в полный громкость.
private void GameChatSoundLevelChanged(AudioStateMonitor sender, object args)
{
switch (sender.SoundLevel)
{
case SoundLevel.Full:
StartAudioCapture();
break;
case SoundLevel.Muted:
StopAudioCapture();
break;
case SoundLevel.Low:
// Audio capture should never be "ducked", only muted or full volume.
Debug.WriteLine("Unexpected audio state change.");
break;
}
}
Дополнительные сведения о захвате звука с помощью MediaCapture см. в разделе "Базовый" фото, видео и аудиозапись с помощью MediaCapture.
Каждый экземпляр класса MediaPlayer связан с ним AudioStateMonitor , с которым можно определить, когда система изменяет уровень громкости воспроизводимого содержимого. Вы можете решить обрабатывать изменения состояния звука по-разному в зависимости от типа воспроизводимого содержимого. Например, вы можете приостановить воспроизведение подкаста при снижении звука, но продолжить воспроизведение, если содержимое является музыкой.
bool isPodcast;
bool isPausedDueToAudioStateMonitor;
private void AudioStateMonitor_SoundLevelChanged(Windows.Media.Audio.AudioStateMonitor sender, object args)
{
if ((sender.SoundLevel == SoundLevel.Full) || (sender.SoundLevel == SoundLevel.Low && !isPodcast))
{
if (isPausedDueToAudioStateMonitor)
{
mediaPlayer.Play();
isPausedDueToAudioStateMonitor = false;
}
}
else if ((sender.SoundLevel == SoundLevel.Muted) ||
(sender.SoundLevel == SoundLevel.Low && isPodcast))
{
if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
{
mediaPlayer.Pause();
isPausedDueToAudioStateMonitor = true;
}
}
}
Дополнительные сведения об использовании MediaPlayer см. в статье "Воспроизведение звука и видео" с помощью MediaPlayer.