Windows-Phone-7:检查是否正在播放soundEffectInstance的实例

时间:2011-08-14 11:01:09

标签: c# silverlight windows-phone-7 audio

我有一个控制音效的按钮。单击按钮时,声音应该开始播放。如果在声音仍然播放时单击它,它应该停止声音。如果在声音停止播放后单击它,声音应该再次开始播放。

我试过这个,但是我错误地使用了SoundState方法,因为它不起作用:

public void playGenericSound(string fileName)
{
    if (playingSound.State != SoundState.Playing)
    {
        using (var stream = TitleContainer.OpenStream(fileName))
        {
            var effect = SoundEffect.FromStream(stream);
            playingSound = effect.CreateInstance();
            FrameworkDispatcher.Update();
            playingSound.Play();
        }
    }
    else
    {
        playingSound.Stop();
    }
}

有什么想法吗? 提前谢谢了! 将

2 个答案:

答案 0 :(得分:2)

对于XNA应用:

更新()方法中,检查音效的 playingSound.State 字段,如果播放已停止,则播放另一个。

对于Silverlight:

这部分有点棘手,因为 SoundEffectInstance 被设计为XNA的一部分。例如,您可以使用Timer创建自己的循环,并在事件处理程序中添加状态检查逻辑。

第二个想法是使用一个计时器,其间隔设置为播放声音的持续时间,并添加一个标志,如 bool isPlaying 。当您第一次播放时,将 isPlaying 标志设置为 true 并启动计时器。在计时器处理程序中,将 isPlaying 标志设置为 false 。每次按下按钮,都会检查 isPlaying 标志。换句话说,制作自己的游戏状态逻辑。

您可以结合使用这些方法。

答案 1 :(得分:0)

我想我会在我正在为某人工作的程序中发布我所做的事情。

// Play Audio File and allow stop
        if (new Rectangle(rV.X, rV.Y, rect.Width, rect.Height).Contains(mosX, mosY) && mouseClick)
        {
            if (driversmeeting.State != SoundState.Playing && !globalAudioPlaying)
            {
                globalAudioPlaying = true;
                driversmeeting.Play();
            }
            else if (driversmeeting.State == SoundState.Playing)
            {
                driversmeeting.Stop();
                globalAudioPlaying = false;
            }
        }