c#

位置:IT落伍者 >> c# >> 浏览文章

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


发布日期:2018年05月23日
 
在C#中利用DirectX实现声音播放

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

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

准备工作

安装了DirectX SDK(有个DLL文件)这里我们只用到MicroSoftDirectXdll 和 MicrosoftDirectxDirectSounddll

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

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

引入DirectX 的DLL文件的名字空间

using MicrosoftDirectX;

using MicrosoftDirectXDirectSound;

建立设备在我们导入的MicrosoftDirectXDirectSound空间中有个Device的类这个是表示系统中的声音设备

Device dv=new Device();

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

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

dvSetCooperativeLevel((new UF())CooperativeLevelPriority);

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

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

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

SecondaryBuffer buf=new SecondaryBuffer(@sndwavdv);

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

bufPlay(BuffERPlayFlagsLooping);

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

ConsoleRead();

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

class UF:Form{}

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

csc /r:directX\MicroSoftDirectXdll;directX\MicrosoftDirectxDirectSounddll dxsndcs

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

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

|

|dxsndcs

|sndwav

|<directx>

|

|MicroSoftDirectXdll

|MicrosoftDirectxdll

下面是完整代码

//dxsndcs

using System;

using MicrosoftDirectX;

using MicrosoftDirectXDirectSound;

using SystemWindowsForms;

namespace test

{

class test

{

public static void Main(string [] args)

{

Device dv=new Device();

dvSetCooperativeLevel((new UF())CooperativeLevelPriority);

SecondaryBuffer buf=new SecondaryBuffer(@sndwavdv);

bufPlay(BufferPlayFlagsLooping);

ConsoleReadLine();

}

class UF:Form{}

}

}               

上一篇:Visual Basic.NET和GDI+共创图标编辑器

下一篇:C#编程让Outlook乖乖交出帐户密码(1)