在C#中利用DirectX实现声音播放

2016-02-19 15:53 3 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐在C#中利用DirectX实现声音播放,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

  我感觉声音的播放比较简单。我们从播放声音开始。为什么我这么觉得?我也不知道。

  这里是展示最简单的DirectX播放声音的例子,我尽量省略了无关的代码。最后的代码只有19行,够简单了吧?

  准备工作:

  1.安装了DirectX SDK(有9个DLL文件)。这里我们只用到MicroSoft.DirectX.dll 和 Microsoft.Directx.DirectSound.dll

  2.一个WAV文件。(这样的文件比较好找,在QQ的目录里就不少啊。这里就不多说了。)名字叫SND.WAV,放在最后目标程序的同个目录下面

  开始写程序啦。随便用个UltraEdit就好了。

  1.引入DirectX 的DLL文件的名字空间:

  

using Microsoft.DirectX;using Microsoft.DirectX.DirectSound;

  2.建立设备。在我们导入的Microsoft.DirectX.DirectSound空间中,有个Device的类。这个是表示系统中的声音设备。

  

Device dv=new Device();

  3.设置CooperativeLevel。因为windows是多任务的系统,设备不是独占的,所以在使用设备前要为这个设备设置CooperativeLevel。调用Device的SetCooperativeLevel方法:其中,第一个参数是一个Control,第二个参数是个枚举类型。

  在这个程序中,Control我随便弄了个参数塞进去(很汗吧!)。如果在windows程序中,可以用this代替。第二个参数就是优先级别,这里表示优先播放。

  

dv.SetCooperativeLevel((new UF()),CooperativeLevel.Priority);

  4.开辟缓冲区。对于上面的声音设备,他有个自己的缓冲区,叫主缓冲区。系统中,一个设备有唯一的主缓冲区。由于windows是多任务(又是这个!),所以可以有几个程序同时利用一个设备播放声音,所以每个程序都自己开辟一个二级缓冲区,放自己的声音。

  系统根据各个程序的优先级别,按照相应的顺序分别去各个二级缓冲区中读取内容到主缓冲区中播放。这里,我们为SND.WAV开辟一个缓冲区。

  其中,第一个参数表示文件名(傻瓜都看出来了!),第二个就是需要使用的设备。

  

SecondaryBuffer buf=new SecondaryBuffer(@"snd.wav",dv);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  5.接下来就可以播放啦。第一个参数表示优先级别,0是最低的。第2个参数是播放方式,这里是循环播放。

  

buf.Play(0,BufferPlayFlags.Looping);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  6.由于命令行程序没有消息循环,执行完代码就退出了,所以,我们需要暂停程序。

  

Console.Read();

  7.关键的部分已经完了,这里只是交代一下刚才的那个倒霉的new UF() 是什么东西。这个完全是为了应付SetCooperativeLevel的参数要求。我不知道这样做有什么附作用(各位如果因此把声卡烧了)

  

class UF:Form{}

  8.代码写完啦~~~。下面可以编译了,这里编译比较复杂点。

  

csc /r:directXMicroSoft.DirectX.dll;directXMicrosoft.Directx.DirectSound.dll dxsnd.cs

  这里,我把2个DLL文件放在当前目录的directx目录下(这个是我自己建的,你只需要指出这2个文件的位置就可以了。)

  顺便把我的目录结构说明一下:

  |

  |--dxsnd.cs

  |--snd.wav

  |--directx

  |

  |--MicroSoft.DirectX.dll

  |--Microsoft.Directx.dll

  下面是完整代码:

  

//dxsnd.csusing System;using Microsoft.DirectX;using Microsoft.DirectX.DirectSound;using System.Windows.Forms;namespace test1{ class test {  public static void Main(string [] args)  {   Device dv=new Device();   dv.SetCooperativeLevel((new UF()),CooperativeLevel.Priority);   SecondaryBuffer buf=new SecondaryBuffer(@"snd.wav",dv);   buf.Play(0,BufferPlayFlags.Looping);   Console.ReadLine();  }  class UF:Form{} }}

来源:https://www.tulaoshi.com/n/20160219/1610630.html

延伸阅读
一、 简介 本文将细致地介绍用C#来实现游戏Reversi的完整过程。游戏界面如下图所示。 二、 背景 我最开始写这个程序是为了作为学习C#和.NET编程的一个练习。Reversi-或Othello一是一个相当有趣且相当流行的游戏,它仅要求几个基本元素和简单的游戏规则。所以,它是学习一个新的编程环境的良好选择。 该程序的第一个...
ICMP就是所谓的Internet控制报文协议(Internet Control Message Protocol),在网络中,一般用它来传递差错报文以及其他应注意的信息。ICMP一般被认为是和IP协议同一层的协议,IMCP报文通常被IP层或者更高层的协议(如:TCP或者UDP)使用,ICMP对于互联网以及其他基于IP协议的网络的正常运行起着非常重要的作用。有许多重要的网络程序都是...
代码如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; /// summary /// PlayClass 的摘要说明 /// /summary namespace ...
摘要  想必大家对小榕时光等扫描器都非常熟悉了,有没有自己写一个的冲动。最近微软推实施了.NET战略方案,C#是主推语言,你们是否有兴趣用C#来实现对局域网IP地址的扫描,尝试一下自己写的快乐,那么请跟我来。  正文  1.先介绍一下使用的类:  DNS类:在.net中的System.net命名空间下,主要的功能是从 Internet&...
近一段时间由于项目需要一直专注于UI方面的编程,为了更加友好的将提示信息呈现给用户,我们必须对标准的Windows消息提示窗口进行处理。我们大家在Windows XP下使用U盘、闪存等移动存储设备,当插上或拔下这些设备时任务栏区域都会显示一个淡黄色背景,且具有标注样式的提示窗口弹出来,这样的提示即友善又美观,那么这到底是怎么实现的呢...

经验教程

174

收藏

22
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部