C# 同时播放两个声音#
我正在创建一个WP7应用程序,它需要在循环背景音乐上播放各种声音效果(按按钮)。按下按钮1可启动背景音乐,并循环播放。当我按下按钮3(触发音效)时,第一次按下时,音效会覆盖在背景音乐上。但是,当我再次按下按钮3时,背景音乐停止。我不明白为什么会发生这种事!?我已经在下面粘贴了代码的相关部分。非常感谢您的帮助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
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保留在它自己的变量中。现在可以完美地工作,并且有意义。非常感谢。