停止SoundPlayer播放

时间:2012-10-14 23:37:55

标签: c# winforms

我正在尝试创建自己的小音板来播放WAV文件。现在播放不是问题,但我想要一种方法来停止播放(如果需要)。我想到了一个停止按钮,但不知道如何做到这一点。所以我想过使用一个循环,但它似乎不起作用。只是想知道是否有人可以帮助我在哪里出错或者如果这只是一种失败的方式,那么如果你能告诉我一个更好的方式。 :)

    private void button1Sound(object sender, MouseEventArgs e)
    {
        int i = 0;
        SoundPlayer simpleSound = new SoundPlayer(@"file.wav");

        while (i == 0)
        {
            simpleSound.Play();
            i++;
        }

        if (i >= 1)
        {
            simpleSound.Stop();
        }
    }

我还想过做一个ELSE IF,但这也行不通。我试过了:

    private void button1Sound(object sender, MouseEventArgs e)
    {
        int i = 0;
        SoundPlayer simpleSound = new SoundPlayer(@"file.wav");

        if (i == 0)
        {
            simpleSound.Play();
            i++;
        }
        else if (i > 1)
        {
            simpleSound.Stop();
        }
    }

2 个答案:

答案 0 :(得分:3)

因为您已在空白中添加了int i = 0,所以每次调用该事件时,i将始终为 0 。因此,将i纳入虚空之外会更好。

 int i = 0;
 SoundPlayer simpleSound = new SoundPlayer(@"file.wav"); //Thanks to @Wanabrutbeer

 private void button1Sound(object sender, MouseEventArgs e)
    {


        if (i == 0)
        {
            simpleSound.Play();
            i++;
        }

       else if (i >= 1)
        {
            simpleSound.Stop();
            i--;
        }
    }

通知:班级SoundPlayer仅播放 .wav 文件。如果您想播放其他媒体文件,例如 .mp3,.mpeg等... ,请改用MediaPlayer

谢谢,

我希望这会有所帮助:)

答案 1 :(得分:2)

编辑 - 编辑代码片段以显示使用异步负载

试试这段代码:

private System.Media.SoundPlayer sound;
private bool isPlaying = false;
private System.Drawing.Image playimage = System.Drawing.Image.FromFile(@"playimage");
private System.Drawing.Image stopimage = System.Drawing.Image.FromFile(@"stopimage");

private void playstopbutton_Click(object sender, EventArgs e)
{
    Button btn = (sender as Button);
    if (isPlaying)
    {
        sound.Stop();
        isPlaying = false;
        btn.Text = "Play";
        btn.Image = playimage;
    }
    else if (sound.IsLoadCompleted)
    {
        sound.Play();
        isPlaying = true;
        btn.Text = "Stop";
        btn.Image = stopimage;
    }
    else
    {
        btn.Enabled = false;
        if (sound == null) sound = new System.Media.SoundPlayer(@"wavefile");
        sound.LoadCompleted += new AsyncCompletedEventHandler(sound_LoadCompleted);
        sound.LoadAsync();
    }
}

private void sound_LoadCompleted(object sender, AsyncCompletedEventArgs e)
{
    this.playstopbutton.Text = "Stop";
    this.playstopbutton.Image = playimage;
    this.playstopbutton.Enabled = true;
    isPlaying = true;
    sound.Play();
}

您可能遇到的问题是声音的范围仅在方法内部,它需要是类范围,因此每次处理相同的实例声音。从技术上讲,如果在单击处理程序之外声明SoundPlayer,则使用shuold工作的int方法。此外,用于跟踪播放状态的任何变量都需要存在于处理程序方法之外,以便每次单击操作都保持该值。