在WindowForms应用程序中播放两个(或更多).wav声音

时间:2016-06-08 17:48:51

标签: c# winforms soundplayer

我使用Win Forms应用程序在C#中制作了一种俄罗斯方块游戏。 我希望程序在游戏过程中循环播放.wav文件,而另一个简短的.wav文件只是偶尔但与“主”声音平行。

我在开头宣布:

SoundPlayer sp;
SoundPlayer sp2;

然后在FormLoad事件中:

private void Form1_Load(object sender, EventArgs e)
{
  ...
  sp2 = new SoundPlayer(".../tetris.wav");
  sp2.PlayLooping();
  ...
}

然后,只要一排块消失,我就想发射炸弹声:

sp = new SoundPlayer(".../bomb.wav");
sp.Play();

问题是:当第二个声音被触发时,第一个(主)声音停止。我认为这是一个线程问题,但我不知道如何解决这个问题。

谢谢你,菲利普

2 个答案:

答案 0 :(得分:0)

不,这不是一个线程问题! SoundPlayer仅支持同时播放一个音频。

如果您需要多声音,则必须使用以下技术之一:

WPF / MediaPlayer = System.Windows.Media.MediaPlayer();打开然后播放

的DirectX / DirectSound的

XNA / SoundEffect中

答案 1 :(得分:0)

我一直在努力解决同样的问题......

简短的回答是你不能。系统将仅允许在任何给定过程中一个声道到声音接口。因此,当您开始播放新声音时,前一个声音将终止。

有许多解决方法主要使用Direct-X或Media-Player。但是,我发现这些解决方案既不简单也不健壮,因为您依赖于用户计算机来安装正确的东西。

然而,我找到了解决问题的快速而简单的方法。

我添加了一个特殊的" hook"我的应用程序,以便当我使用适当的命令行参数运行它时,它所做的就是同步播放特定声音并退出。然后我使用进程对象用适当的参数启动应用程序的另一个实例..并且嘿presto ..多个声音。

如果您的应用程序配置为自动成为单个实例,则需要将其禁用并用一些代码替换它以检测另一个实例并退出。

另一种方法是在您的应用程序包中添加一个小的exe,它只是简单地执行声音部分。

我知道它听起来不是很纯粹"但是实际上,你真正尝试用你的代码开始一个临时的后台进程来播放声音。如果该过程是Windows本机功能或您自己制作的功能,那么这并不重要。