C# 同时播放两个声音#

C# 同时播放两个声音#,c#,windows,visual-studio-2010,windows-phone-7,C#,Windows,Visual Studio 2010,Windows Phone 7,我正在创建一个WP7应用程序,它需要在循环背景音乐上播放各种声音效果(按按钮)。按下按钮1可启动背景音乐,并循环播放。当我按下按钮3(触发音效)时,第一次按下时,音效会覆盖在背景音乐上。但是,当我再次按下按钮3时,背景音乐停止。我不明白为什么会发生这种事!?我已经在下面粘贴了代码的相关部分。非常感谢您的帮助 public partial class MainPage : PhoneApplicationPage { SoundEffect soundEffect; Stream

我正在创建一个WP7应用程序,它需要在循环背景音乐上播放各种声音效果(按按钮)。按下按钮1可启动背景音乐,并循环播放。当我按下按钮3(触发音效)时,第一次按下时,音效会覆盖在背景音乐上。但是,当我再次按下按钮3时,背景音乐停止。我不明白为什么会发生这种事!?我已经在下面粘贴了代码的相关部分。非常感谢您的帮助

public partial class MainPage : PhoneApplicationPage
{
    SoundEffect soundEffect;
    Stream soundfile;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
    }



    static protected void LoopClip(SoundEffect soundEffect)
    {
        {
        SoundEffectInstance instance = soundEffect.CreateInstance();
        instance.IsLooped = true;
        FrameworkDispatcher.Update();
        instance.Play();
        }
    }

    public void PlaySound(string soundFile)
    {
        using (var stream = TitleContainer.OpenStream(soundFile))
        {

            var effect = SoundEffect.FromStream(stream);
            effect.Play();
        }
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        soundfile = TitleContainer.OpenStream("BackgroundMusic.wav");
        soundEffect = SoundEffect.FromStream(soundfile);  
        LoopClip(soundEffect);
    }


    private void button3_Click(object sender, RoutedEventArgs e)
    {
        PlaySound("sound3.wav");
    }

}

}

您需要从单独的线程播放每个声音

这里似乎发生的是不同的
Play
方法调用相互干扰,因为它们在同一个线程中


试着把背景音乐放在一个单独的线程中,看看这是否解决了你在问题中提到的问题。如果是这样的话,也可以将其他实例分开。

如果您总是使用实例,那么这应该是可行的,因此将您的代码更改为此,这样应该可以解决问题:

public partial class MainPage : PhoneApplicationPage
{   

    SoundEffectInstance loopedSound = null;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
    }

    static protected void LoopClip(SoundEffect soundEffect)
    {
        loopedSound = soundEffect.CreateInstance();
        loopedSound.IsLooped = true;
        loopedSound.Play();
    }

    public void PlaySound(string soundFile)
    {
        SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(soundFile, UriKind.Relative)).Stream);
        SoundEffectInstance instance = sound.CreateInstance();
        instance.Play();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(@"BackgroundMusic.wav", UriKind.Relative)).Stream); 
        LoopClip(sound);
    }


    private void button3_Click(object sender, RoutedEventArgs e)
    {
        PlaySound("sound3.wav");
    }

}

上面的示例假设您的声音文件设置为Build Action=Content,并且位于顶级目录中。

您是否尝试过线程或后台工作程序?这与我在Java中经常遇到的情况完全相反……谢谢。你能给我一些关于如何启动新线程的详细信息吗?我以前没有做过,似乎无法编译它。[线程背景线程=新线程(新线程开始(LoopClip));根据注释中的代码,您应该改为使用
threadbackgroundthread=new Thread(new parameteriedthreadstart(LoopClip))
或类似的工具,并使用
parameteriedthreadstart
提供的工具传入参数(
soundEffect
)“LoopClip与委托匹配时没有重载。“我能够使用ThreadStart调用一个非参数化函数,然后调用LoopClip。然而,当程序运行时,我仍然有相同的原始问题。。我应该在button1\u Click或其他地方创建新线程吗?非常感谢!不幸的是,我刚刚尝试了你的代码,我遇到了相同的原始问题——在按钮3被点击超过2次后背景音乐停止(第一次点击按钮3效果很好。)@sv77你是对的。我运行了我的代码并复制了您的问题。我已经更新了我的代码,现在应该可以为您工作了。关键是将循环的soundeffectinstance保留在它自己的变量中。现在可以完美地工作,并且有意义。非常感谢。