说同时播放两首音乐有点不妥,因为这样没什么意义。今天我想说的是在播放背景音乐的同时,可以播放音效,类似于游戏中的声音。我们都知道在游戏中不仅有背景音乐,还有各种特殊的声音,其实就是音效啦。我在做课程设计时,正好也需要实现类似游戏的这种功能,心想这应该不难吧,做了才知道并非易事。

起初我是用System.Media.SoundPlayer来同时播放两首音乐,结果总是只听到一首歌的声音,网上查了下,

原来System.Media.SoundPlayer是不能同时播放两首歌曲的(注:我开了两个线程来播放也是不行)。既然不行,那只好寻找其它方法了,找了很久,网上的资料零零散散,具体介绍的没有一个(至少我没发现)。

经过努力,我实现了用C#在播放背景音乐的同时可以播放音效。我实现的思路如下:

1)用System.Media.SoundPlayer 来播放背景音乐

2)用Microsoft.DirectX.DirectSound 来播放音效(其实吧,按网上的说法,用DirectSound来同时播放两首音乐是完全可以的,这个我没有测试,有兴趣的童鞋不妨一试)


实现过程如下:

1)音乐资源文件的添加和System.Media.SoundPlayer的使用,请看我以下这篇文章,这里不再敖述。

http://blog.csdn.net/friendan/article/details/8209413


2)这里主要介绍Microsoft.DirectX.DirectSound的使用方法

我测试时使用的DirectX版本为DirectX 10,其下载地址为:

http://download.microsoft.com/download/F/1/7/F178BCE4-FA19-428F-BB60-F3DEE1130BFA/DXSDK_Feb10.exe

下载DirectX 10,然后安装完DirectX 10后,我们就可以进到VS2008中对其进行引用了。


展开-->>解决方案资源管理器-->>TestCSharp(这是我的解决方案的名称,请灵活应变)-->>引用-->右键-->添加引用

//截图如下



//在添加引用窗口中选择浏览,然后找到以下目录:

C:\Windows\Microsoft.NET\DirectX for Managed Code\1.0.2902.0

找到以上目录后,在该目录里面找到以下连个dll文件,将它们添加到工程中来

1.)Microsoft.DirectX.DirectSound.dll 2.)Microsoft.DirectX.dll

//呵呵,这两个dll文件我已经上传到网上了,下载地址为:
http://download.csdn.net/download/friendan/4804057

//截图如下



//添加完后,引用中就会出现Microsoft.DirectX.DirectSound.dllMicrosoft.DirectX.dll

如下图所示:


接下来我们就可以写代码来用Microsoft.DirectX.DirectSound来播放音效或音乐了。

//我程序截图如下



程序代码如下(别忘了引入命名空间:using Microsoft.DirectX.DirectSound)

//程序启动时...
        private void Form1_Load(object sender, EventArgs e)
        {
            System.Reflection.Assembly assembly;
            System.Media.SoundPlayer sp;
            assembly = System.Reflection.Assembly.GetExecutingAssembly();
            sp = new System.Media.SoundPlayer(global::TestCSharp.Properties.Resources.bkMusic);
            sp.PlayLooping();  
        }

        //按钮【播放音效】
        private void btnPlay_Click(object sender, EventArgs e)
        {
            SecondaryBuffer secBuffer;//缓冲区对象  
            Device secDev;//设备对象  
            secDev = new Device();
            secDev.SetCooperativeLevel(this, CooperativeLevel.Normal);//设置设备协作级别  
            secBuffer = new SecondaryBuffer(global::TestCSharp.Properties.Resources.YinXiao, secDev);//创建辅助缓冲区  
            secBuffer.Play(0, BufferPlayFlags.Default);//设置缓冲区为默认播放 
        }







本文转载:CSDN博客