Остановка цикла SoundPlayer на локальном уровне - PullRequest
0 голосов
/ 27 мая 2010

Я работаю над настройкой будильника, который появляется в виде диалога с несколькими параметрами звукового файла, из которых пользователь может выбирать. У меня проблема с созданием звукового проигрывателя на местном уровне, который я могу закрыть кнопкой. У меня проблема в том, что звук закрывается, когда я закрываю форму, потому что 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 ]

1 голос
/ 27 мая 2010

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

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

  protected override void OnFormClosing(CancelEventArgs e) {
    if (alarm != null) alarm.Stop();
  }
}
0 голосов
/ 05 октября 2017

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

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

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

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

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

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

0 голосов
/ 27 мая 2010

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

SoundMixer.stopAll();

или

SoundMixer.soundTransform = new SoundTransform(0);

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

...