C#中使用DirectX编程
我感觉声音的播放比较简单。我们从播放声音开始。为什么我这么觉得?我也不知道。
这里是展示最最最最最简单的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);
5.接下来就可以播放啦。第一个参数表示优先级别,0是最低的。第2个参数是播放方式,这里是循环播放。
buf.Play(0,BufferPlayFlags.Looping);
6.由于命令行程序没有消息循环,执行完代码就退出了,所以,我们需要暂停程序。
Console.Read();
7.关键的部分已经完了,这里只是交代一下刚才的那个倒霉的new UF() 是什么东西。这个完全是为了应付SetCooperativeLevel的参数要求。我不知道这样做有什么附作用(各位如果因此把声卡烧了…………^_^|||)
class UF:Form{}
8.代码写完啦~~~。下面可以编译了,这里编译比较复杂点。
csc /r:directX/MicroSoft.DirectX.dll;directX/Microsoft.Directx.DirectSound.dll dxsnd.cs
这里,我把2个DLL文件放在当前目录的directx目录下(这个是我自己建的,你只需要指出这2个文件的位置就可以了。)
顺便把我的目录结构说明一下:
|
|--dxsnd.cs
|--snd.wav
|--<directx>
|
|--MicroSoft.DirectX.dll
|--Microsoft.Directx.dll
下面是完整代码:
//dxsnd.cs
using 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{}
}
}
相关文章:

40+场面试,100%通过率,我想分享的14条经验
来源 | 陈同学在搬砖头图 | 下载于视觉中国大家好,我是陈同学,首先来一个简单的自我介绍和个人的经历分享。我的本科和硕士均就读于哈工大,在研究生期1年时间内自学操作系统、计算机网络、C、数据结构等,累计学习30本书、500博客文…

云端卫士架构师讲DDoS攻击的智能防御之道
DDoS即分布式拒绝服务攻击,这是一场关乎资源的较量,攻击者通过自己控制的大量僵尸主机,向目标设施(服务器、运营商网络和基础架构等)发起洪水猛兽般的流量型攻击,或是连绵不绝的应用型攻击。 如果将受害者比…

C#中方法参数的四种类型
C#中方法的参数有四种类型:-值参数:不含任何修饰符。方法中的形参是实参的一份拷贝,形参的改变不会影响到内存中实参的的值,实参是安全的。-引用参数:以ref修饰符声明。传递的参数实…

赠书 | 算力时代,用 Python 来快速解决复杂问题
Python作为一种编程语言,拥有简洁、高效的表达能力。与此同时,Python语言环境中还配备各种软件库,即模块。结合实际问题,选择适当的模块,便可生成简单、快速、正确的程序。书中列举了一些数值计算的简单例题࿰…

用for实现Go的while和do...while
Go的while和do...while实现 Go语言没有while和do...while语法,我们可以通过for实现:即break在业务代码执行前相当与while,break在业务代码执行后相当do...while while for {if condition {break}xxxxxxxx } do...while for {xxxxxxxxif cond…

DTCC:数据库安全重点在数据拷贝过程中
本文讲的是DTCC:数据库安全重点在数据拷贝过程中,2017年5月11日-13日,2017中国数据库技术大会于北京国际会议中心盛大开幕。作为国内最受关注的数据库技术大会,本届大会以“数据驱动价值发现”为主题,汇集多个领域的百…

Log4J配置方式Java工程测试
2019独角兽企业重金招聘Python工程师标准>>> Log4J配置方式 1、 导入jar包 Commons-logging .jarLog4j-1.2.17.jar2、 编写log4j.properties 文件 ############## ############################## 优先级 INFO ,输出到console_log 和filelog 两个位置 log4j.root…

C#“装箱”(boxing)与“拆箱”(unboxing)
装箱和拆箱:任何值类型、引用类型可以和object(对象)类型之间进行转换。装箱转换是指将一个值类型隐式或显式地转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型(interface-type)…

无人机、IoT 设备都有漏洞?专访以色列老牌安全企业Check Point | 拟合
从无序中寻找踪迹,从眼前事探索未来。2021 年正值黄金十年新开端,CSDN 以中立技术社区专业、客观的角度,深度探讨中国前沿 IT 技术演进,推出年度重磅企划栏目——「拟合」,通过对话企业技术高管大咖,跟踪报…

sql server 在占用服务器内存居高不下怎么办【转】
在管理一个测试服务器的时候,内存使用率居高不下,在资源管理器中查看到 sql server 2008 占用了80%的系统资源,于是找到了一下资料,并解决了Sql Server 2008 占用内存过大的问题。 转自百度经验http://jingyan.baidu.com/article…

C# checked、unchecked操作符
checked和unchecked操作符用于整型算术运算时控制当前环境中的溢出检查。下列运算参与了checked和unchecked检查(操作数均为整数):1) 预定义的++和――一元运算符。2) 预定义的-一…

TPAMI 2021 | 深度赋智AutoDL系列竞赛世界冠军方案首次公开
导读:「深度赋智」斩获NeurIPS-AutoDL 2019系列竞赛总决赛世界冠军,在图像/音频/视频/文本/表格不同场景的十个数据集上稳定获得八项第一和均分第一。为共同推动AutoDL技术的快速发展,冠军方案的技术细节首次公开,最新相关论文已被…

转: 如何实现jQuery的Ajax文件上传
【PHP文件上传】 在开始之前,我觉得是有必要把通WEB上传文件的原理简单说一下的。实际上,在这里不管是PHP,JSP,还是ASP处理上传的文件,其实都是WEB早已把文件上传到服务器了,我们只是运用上传处理函数来处理…

Mybatis遍历查询 ——foreach
第一步: 在xxxMapper接口中添加一个函数,返回一个list,这里的参数是一个integer类型的集合 public List<Emp> findEmpByList(Param("list") List<Integer> list); 第二步: 在xxxMapper.xml 中添加statement…

C#中如何获取注册表信息
实现方式:利用Microsoft.win32类提供的注册表类访问系统注册表获取ODBC数据服务列表。 具体实现: Microsoft.win32提供了RegistryKey类,用来访问系统的注册表。 ///定义注册表子Path string strRegPath "SOFTWARE/ODBC/ODBC.INI…

用 Python 实现隐身,我可以 | 文末福利
作者 | 李秋键头图 | 下载于视觉中国出品 | AI 科技大本营(ID:rgznai100)引言:视频和图像的隐身术是指在视频或者图像中中,在没有任何输入遮罩的情况下,通过框选目标体,使得程序实现自动去除视频中的文本叠…

改变myeclipse北京颜色
经常用 MyEclipse 写代码,时间久了会觉得白色的背景颜色很刺眼,于是乎便想要换一种柔和些的颜色来缓解视力疲劳,那么怎么样来修改 MyEclipse 代码编辑区域的背景颜色呢? 依次展开菜单 Window >> Preferences >> Gener…

redis 代理工具Predixy安装部署
PredixyPredixy 是一款高性能全特征redis代理,支持redis-sentinel和redis-cluster特性高性能并轻量级支持多线程多平台支持:Linux、OSX、BSD、Windows(Cygwin)支持Redis Sentinel,可配置一组或者多组redis支持Redis Cluster支持redis阻塞型命…

超级详细的 Python 数据分析指南
来源 | 算法进阶头图 | 下载于视觉中国前言:数据分析是通过明确分析目的,梳理并确定分析逻辑,针对性的收集、整理数据,并采用统计、挖掘技术分析,提取有用信息和展示结论的过程,是数据科学领域的核心技能。…

C#实现-移位加密
/* Filename: encrypt_string.cs Author : zhanghua Date : 2005-08-11 Fuction : input a strig and encrypt a string 加密后的字符串的第一个字符是原先字符串的最后一个字符, 其余的每一个字符是对应的原字符串中的前一个字符的值…

oracle相关操作
查看用户系统权限:select * from dba_sys_privs;select * from session_privs;select * from user_sys_privs;查看用户对象权限:select * from dba_tab_privs;select * from all_tab_privs;select * from user_tab_privs;修改数据库密码:alte…

Ansible批量安装mysql数据
1.构建安装目录mkdir -p /ansible/roles/mysql/{defaults,files,handlers,meta,tasks,templates,vars}defaults 默认寻找路径tasks 存放playbooks路径files 存放文件和脚本,copy模块文件搜索路径templates 模版存放路径handlers notify调用部分playbook存放路径vars…

C#在客户端和服务端操作Excel文件
一、在客户端把数据导入到Excel文件步骤1、创建Excel application对象,打开或生成Excel文件//服务端创建StringBuilder对象System.Text.StringBuilder sbnew System .Text .StringBuilder (); //指定客户端执行语言sb.Append ("<Script LanguageVBScript&g…

oracle数据库同步交换的方法
oracle数据同步方案与实现:如何在两个oracle服务器之间交换数据?来源:无忧模板 作者:网络编辑 更新时间:2010-08-09 18:10 点击:次 方案一:建立两个数据库之间的DATA_LINK,直接将新数据写入另一数据库方案二:使用SQL *…

让语音助手听懂方言,这个数据集能搞定
来源 | HyperAI超神经头图 | 来源于网络 侵删方言是语音识别技术发展中必须要迈过去的坎儿,那么如何让模型能够听懂和理解方言呢?使用优质的数据集是一种的方法,本文将介绍一个经典的方言录音数据集 TIMIT。随着科技的成熟,语音识…

Django内置Admin
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有:依赖APP:django.contrib.authdjango.contrib.contenttypesdjango.contrib.messagesdjango.contrib.sessions模板的context_processors:django.cont…

Puppet扩展篇1-自定义fact结合ENC(hirea)的应用实践
零基础学习Puppet自动化配置管理系列文档在大量节点加入Puppet之后,你至少会面临两个比较大的问题:1、由于节点数的增多,site.pp文件必然会编写更多的节点条目,以及节点包含的类。假设你用Puppet管理500个节点,存在三种…

C#WinForm制作异形窗体/控件
制作异形窗体或控件的思路一般都是想办法生成一个region,然后设置给指定的窗口或控件。生成region的方法有很多,最常用的就是从一幅图片生成,把该图片中的透明色部分“抠”掉,剩下的部分作为一个region。设置窗口或控件的region可…

谷歌提出纯 MLP 构成的视觉架构,无需卷积、注意力 !
来源 | 迈微AI研习社责编 | 寇雪芹头图 | 下载于视觉中国当前,卷积神经网络(CNN)和基于自注意力的网络(如近来大火的 ViT)是计算机视觉领域的主流选择,但研究人员没有停止探索视觉网络架构的脚步。近日&…

HttpApplication事件ASP.NET页面周期
学习吧少年........................... 修改中........... 当一次请求到达IIS 1、http.sys将请求发送到指定的应用程序池。 2、应用程序池再将请求交给池中的工作进程(w3wp.exe), 3、w3wp.exe根据请求URL的后缀,决定加载那个ISAP…