Windows 声音处理编程(基于winmm.dll)(1)

来源:互联网 发布:邮件客户端软件 编辑:程序博客网 时间:2024/05/24 00:51

本学期选了一门《声音识别技术》,第一个作业,教授让编写一个程序,获取声卡数据,并存储成本地文件,要求使用winmm.dll中的函数。基于此,查阅了相关资料和winmm.dll的API,实现了程序,符合要求,在此留个记录。

首先,对winmm.dll的API需要有个大致的了解,刚好,在百度百科中有winmm.dll词条,可以先查阅一下,大致知道这个dll的作用,参考:http://baike.baidu.com/view/663607.htm

第二步,为了查询某个函数的使用方法,可以在Windows Dev center里搜索函数的声明(MSDN中也能查到),例如我想查midiInGetNumDevs函数的使用办法,可以在http://msdn.microsoft.com/en-us/library/windows/desktop/dd798456(v=vs.85).aspx 得到。

第三步,由于我的程序是C#做的,而midiInGetNumDevs函数是用C++写的,这存在C++和C#数据类型匹配的问题。网上有一个比较方便的小工具,Pinvoke.net插件,关于Pinvoke.net的说明,网站上这样说:PInvoke.net is primarily a wiki, allowing developers to find, edit and add PInvoke* signatures, user-defined types, and any other information related to calling Win32 and other unmanaged APIs from managed code (written in languages such as C# or VB.NET).  Pinvoke.net是一个wiki,开发人员可以查询,编辑或者增加PInvoke 的特征(一些函数API),用户自定义类型和其它调用Win32和非托管的API的相关信息,并被C# 和VB所使用。网页地址:http://www.pinvoke.net/ 同时可以下载插件安装在Visual Studio 上,便于开发。

第四步,在C#中创建dll中对应的结构体。例如,当使用midiInGetDevCaps时,dll中定义的接口为:MMRESULT midiInGetDevCaps(UINT_PTR uDeviceID,LPMIDIINCAPS lpMidiInCaps,UINT cbMidiInCaps); 使用Pinvoke,获得的对应C#函数写法为:[DllImport("winmm.dll", SetLastError = true)] private static extern uint midiInGetDevCaps(uint uDeviceID, out [MIDIINCAPS] caps, uint cbMidiInCaps); ,其中MIDIINCAPS是所要重新构造的结构体,同样,通过Pinvoke可以查询到在C#中对应的结构体写法:http://www.pinvoke.net/default.aspx/Structures/MIDIINCAPS 。

通过以上四个步骤,就能在C#中调用winmm.dll中大部分的函数了。以上是准备工作,接下来的日志中继续介绍详细开发的过程。

原创粉丝点击