Остановка цикла SoundPlayer на локальном уровне

Я работаю над настройкой будильника, который появляется в виде диалога с несколькими параметрами звукового файла, из которых пользователь может выбрать. У меня проблема с созданием звукового проигрывателя на местном уровне, который я могу закрыть кнопкой. У меня проблема в том, что звук закрывается, когда я закрываю форму, потому что SoundPlayer не существует в событии нажатия кнопки.

вот что у меня есть:

 void callsound()
    {
        if (SoundToggle == 0) // if sound enabled
        {

            if ((SoundFile == 0) && (File.Exists(@"attention.wav")))
            {
                System.Media.SoundPlayer alarm = new System.Media.SoundPlayer(@"attention.wav");
                alarm.PlayLooping();
            }
       if ((SoundFile == 1) && (File.Exists(@"aahh.wav")))
            {
                System.Media.SoundPlayer alarm = new System.Media.SoundPlayer(@"aahh.wav");
                alarm.PlayLooping();
            }
     }

private void button1_Click(object sender, EventArgs e)
    {
        //alarm.Stop();  Only works if SoundPlayer declared at class level
        this.Close();
    }

Есть ли способ, которым я могу сделать то, что я хочу сделать, объявив экземпляры SoundPlayer, где я нахожусь? Или есть способ объявить это на уровне класса и при этом иметь возможность изменять звуковой файл в зависимости от пользовательских настроек?

3 ответа

Почему это проблема? В любом случае SoundPlayer не поддерживает одновременное воспроизведение более одного звука. Переместите его в область видимости, переопределите событие OnFormClosing, проблема решена.

public partial class Form1 : Form {
  private System.Media.SoundPlayer alarm;

  protected override void OnFormClosing(CancelEventArgs e) {
    if (alarm != null) alarm.Stop();
  }
}

Ты можешь попробовать:

SoundMixer.stopAll();

или же

SoundMixer.soundTransform = new SoundTransform(0);

Класс SoundMixer управляет глобальным звуком, поэтому он должен останавливать все в одной песочнице безопасности.

Используя Powershell, я играл с WAV-файлами и запускал повторяющийся цикл, используя следующее:

$Playwav = new-object ('Media.SoundPlayer') $playpath1 
$Playwav.PlayLooping()

Я остановил цикл в PowerShell IDE с помощью Run Section (F8):

$Playwav = new-object ('Media.SoundPlayer') $playpath1 
$Playwav.PlayLooping()
$Playwav.stop()

FWIW,.wav в моем примере был FPS Doug takethatbitch.wav. Так что безудержная петля заставила меня смеяться.

Надеюсь это поможет.

Другие вопросы по тегам