我用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
如果你需要多声音,那么你必须使用以下技术之一:
WPF/MediaPlayer=System.Windows.Media.MediaPlayer();打开然后播放
DirectX/DirectSound
XNA/SoundEffect
我一直在为同样的问题而挣扎。。。。。
简单的答案是你不能。在任何给定的过程中,该系统将只允许一个通道进入声音接口。因此,当您开始一个新的声音时,前一个声音将终止。
有许多解决方案,主要使用Direct-X或Media Player。然而,我发现这两种解决方案都不简单,也不健壮,因为你依赖于用户的机器来安装正确的东西。
然而,我找到了一个快速而简单的解决方案。
我在我的应用程序中添加了一个特殊的"钩子",这样当我使用适当的命令行参数运行它时,它所做的就是同步播放特定的声音并退出。然后,我使用进程对象用适当的参数启动应用程序的另一个实例。。嘿,很快。。多种声音。
如果你的应用程序被配置为自动成为一个实例,你需要禁用它,并用一点代码替换它,以检测另一个实例并退出。
另一种选择是在应用程序包中添加一个小的exe,它只完成声音部分。
我知道这听起来不是很"纯粹",但实际上,你真正想用你的代码做的就是启动一个临时的后台进程来播放声音。这个过程是windows原生函数还是您自己创建的,其实并不重要。