导读
如何发出声音?我们首先需要了解pocket pc机器的硬件体系结构。我们有双声道设备(立体声模式)用来播放wave音频。不过有的设备只有一个声道(单音的模式)。如果我们有双声道,那么声音电路能生产的音频范围可以从8khz到44hkz。如果每条声道能分别地工作,我们便能产生简单的动态的声音。不幸地是技术上这是不可能的。
我们使用api函数messagebeep(...)可以制造出声音。它听上去与windows的典型的系统报警声音一样。它可以被应用到一些小的简单游戏中,这是在游戏中产生声音或音响效果的最容易和最安全的方法。同时还可以减小你的游戏的文件大小。<source listing 1, messagebeep> nyi
在pocket pc上使游戏发出声音的另外的一个容易的方法是使用api函数playsound(...)。它可以用来录制和播放音频。因此你可以使用它给你的游戏增加声音,但你需要有外部的音频文件资源。音频文件的扩展名是“wav”。 它还可以被用来实现录制数字的音频好象录音机软件。你可以从许多地方找到合适的声音资源。在windows目录,在pocket pc系统中都有预装的一些声音。我们也能使用他们,象闹钟声、错误提示声等等。<source listing 2, playsound> nyi
playsound(...) 应用程序接口可以播放来自外部的wave文件和内在的wave资源,系统会将他们放到内存中(运行时刻产生)。 它有一些播放模式的的选择,例如,循环播放或顺序播放。
sndplaysnd(...) 是一个playsound(...)的子集。它少了一些播放选择但是因此有获得了速度。它也可以通过外部的wave文件向游戏提供声音,并且播放的声音文件在win.ini文件中进行了注册。<source listing 3, sndplaysound> nyi
使用标准的api播放声音有一个主要的问题;当一个新声音播放时,前一个会停止。这在一般的游戏程序中可能算不上问题。可一个好的游戏,需要动态的产生声音,什么时候需要,什么时候便产生,声音出现完全取决于游戏的进行状态。我们怎样达到这种效果呢?
使用pgsnd.dll
我们可以使用windows多媒体扩展系统(mmsystem)来解决低级的播放音频api带来的问题。方法很简单,我们利用混频器引擎技术实现实时的数字混频。因为代码太复杂了。关于这个我不准备多将。但我们提供一个免费混频的引擎pgsnd.dll,你可以从网站下载栏目下载它。我们同时提供使用它的免费许可证。
在使用这个库之前,你需要调用pg_waveinit(…) 应用程序接口函数。它将接管设备的声音系统。因此你将不能使用任何标准的声音api例如sndplaysound(…)。
当你正在运行着一个应用时,你希望切换任务(使用另外一个应用程序),你的程序将失去焦点,但是并没有停止,仍然在运行。此时系统已经被pg_waveinit(…)钩住,你将没有办法实现在新的应用程序使用wav。怎么办呢?我们可以这样做当你的应用失去焦点或停止活动时,windows将自动地发送wm_activate消息到应用程序窗口。wparam将显示你的应用程序是处在停止还是激活的状态。然后可以用pg_waveactivate(…) 解决这个问题。
ex:wm_activate:
pg_waveactivate((bool)wparam);
break;
pgsnd.dll的作用是对插槽/声道进行分配。当游戏需要的声音时,就指定插槽数。然后将声音发出到硬件输出设备。装载声音可以到任何插槽,pg_waveload(…)函数被用来处理这个任务。如果你装载新声音到任何已经存在的插槽,先前的声音将自动地被删除并且被新的代替。
ex:pg_waveload(g_hinst, 1000, 0); // load wave to slot 0
..
pg_waveplay(0,false); // start to play wave from slot 0
有两个函数可以用来管理声音插槽, 他们是:
ex:pg_wavesetchannelvalume(…)
pg_wavestop(…)
音量控制: 有三种音量控制类型; 主音量,所有的音乐音量,单独声道的音量。
最后在退出你前应用前,你需要手工解下wave设备。如果你不这样做,声音将不能生产直到你已经重新启动你的机器。有些时候你的程序需要在退出之前就调用pg_waveclose (…)函数来解下设备,这也许会产生意想不到的事情或者在你的程序中产生一个错误。你同样需要重新启动机器来再次产生声音。
这个反初始化操作最好的位置是在退出应用程序之前。
ex:while(getmessage(....))
{
translatemessage(&msg);
dispatchmessage(&msg);
}
pg_waveclose();
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器