Остановка цикла 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. Так что безудержная петля заставила меня смеяться.
Надеюсь это поможет.