Поделиться через


Обнаружение изменения состояния звука и реагирование на него

Начиная с 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.