今天写的这篇博文源于之前上半年自己接过的一个项目,我答应过我的一些兄弟,会将这两年自己接项目的一些经验写到博客里,但是出于对客户商业利益的考虑,我不能把项目源码全部公开,只能帮助大家整理一些知识,希望大家谅解。。。
客户的需求是这样的,做一个声卡混音程序,实现将音箱要播放的声音和话筒输入的声音合成为输入,主要是用于嵌入式音频播放产品,所以大家以后见了音效特别好的产品不要相信销售人员的忽悠。。。“我们的产品音效好是用了XXX高科技材料,觉得处于国际领先水平。。。”,他们口中所谓的“高科技”,其实都是在软件上做了文章而已。
其实要实现这样的一个功能其实并不难,但我当时其实也是第一次做这样的程序(国内这个东西确实很好有人做过),心里也没底,但是凭借我扎实的基础,再加上我在图书馆泡了一天之后,我很快就有了思路。。。主要有两种方法可以实现:1.可以使用DirectXsound接口做.将输出缓冲区音频叠加到输入缓冲区;2.可以调用ASIO音频驱动,网上有好的教程,大家可以参考http://bbs3.driverdevelop.com/read.php?tid=111697
这两个方案都是只能基于wince系统的,linux下我暂时没有找到一个很好的方案,但是最终我还是选择了第一个,因为毕竟图书馆关于direct的开发资料比较多,开发难度相对来说容易控制,但由于我不能公布全部代码,只能在这里梳理一下重要的几个知识点和程序中需要用到的API。
其实我不怕大家嘲笑,在做这个项目之前我一直以为directx就只做3D处理的,但是在图书馆查了多媒体处理技术的相关书籍之后,才知道自己有多么无知。DirectX是由很多API组成的,按照性质分类,可以分为四大部分,显示部分、声音部分、输入部分和网络部分。显示部分担任图形处理的关键,分为Direct Draw(DDraw)和Direct 3D(D3D),前者主要负责2D图像加速。它包括很多方面:我们播放mpg、DVD电影、看图、玩小游戏等等都是用的DDraw,你可以把它理解成所有 划线的部分都是用的DDraw。后者则主要负责3D效果的显示,比如CS中的场景和人物、FIFA中的人物等等,都是使用了DirectX的Direct 3D。声音部分中最主要的API是DirectSound,除了播放声音和处理混音之外,还加强了3d音效,并提供了录音功能,我所接的这个项目就是利用了DirectSound来解决的。。
API调用方面的话主要掌握3个方面,1.对音频缓冲区的操作,2.对创建辅助缓冲区,3利用directx实现混音程序,这三方面的书籍,dirextx的技术书籍我相信应该都有,园子里也有人写过相关的介绍http://www.cnblogs.com/top5/ 只要学会调用这三方面的API,做相关的音频项目自然会便觉得很方便,不是什么高科技,在这里我不想贴代码来忽悠大家,这东西又不是我自创的,花个几十元钱去亚马逊买本书大家都能学会,熟练以后,去游戏公司应聘的话,月薪7K应该不成问题。
我写博客注重一些项目经验和设计思路,这样才能够助新手快速培养独立完成项目的思路,因为我不是职业程序员,从事的工作也是电气领域的工作,不会和大家抢工作,我接私活第一是为了接触各个领域方面的技术,拓展自己的专业视野,我大致了解一下开发流程即可,因为没有必要过于深入,因为国内所有领域说句老实话,核心技术都是国外的,除了一些逆向分析的黑客高手和一些科研工作者,一般人都很难了解,也没有这个时间,对于我这样一个业余的技术个体户来讲,我只要按时完成客户给我的项目,能保证产品就可以了,暂时不会研究的那么深入,不过等过个几年,等我的团队日益成熟了,也许会做自己的独立产品。。。。自己独立接项目的另一个好处就是可以积累一定的社会人脉,让社会来认可我的专业水平,我一直觉得做技术(不光是计算机,电气、机械等其他专业领域一样)和球星踢球很像,个人水平一旦被社会得到认可,身价自然水涨船高了,和比自己水平高一点的人一起做项目,技术能力自然很容易提高。。。
学习和工作,无论全职还是兼职,都是为了更好的生活,何必在乎形式呢。。。。。