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



我用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();

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

谢谢你,Filippo

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

如果你需要多声音,那么你必须使用以下技术之一:

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

DirectX/DirectSound

XNA/SoundEffect

我一直在为同样的问题而挣扎。。。。。

简单的答案是你不能。在任何给定的过程中,该系统将只允许一个通道进入声音接口。因此,当您开始一个新的声音时,前一个声音将终止。

有许多解决方案,主要使用Direct-X或Media Player。然而,我发现这两种解决方案都不简单,也不健壮,因为你依赖于用户的机器来安装正确的东西。

然而,我找到了一个快速而简单的解决方案。

我在我的应用程序中添加了一个特殊的"钩子",这样当我使用适当的命令行参数运行它时,它所做的就是同步播放特定的声音并退出。然后,我使用进程对象用适当的参数启动应用程序的另一个实例。。嘿,很快。。多种声音。

如果你的应用程序被配置为自动成为一个实例,你需要禁用它,并用一点代码替换它,以检测另一个实例并退出。

另一种选择是在应用程序包中添加一个小的exe,它只完成声音部分。

我知道这听起来不是很"纯粹",但实际上,你真正想用你的代码做的就是启动一个临时的后台进程来播放声音。这个过程是windows原生函数还是您自己创建的,其实并不重要。

相关内容

  • 没有找到相关文章

最新更新