如何发出声音?我们首先需要了解Pocket PC机器的硬件体系结构。我们有双声道设备(立体声模式)用来播放WAVE音频。不过有的设备只有一个声道(单音的模式)。如果我们有双声道,那么声音电路能生产的音频范围可以从8KHz到44HKz。如果每条声道能分别地工作,我们便能产生简单的动态的声音。不幸地是技术上这是不可能的。
我们使用API函数MessageBeep(...)可以制造出声音。它听上去与Windows的典型的系统报警声音一样。它可以被应用到一些小的简单游戏中,这是在游戏中产生声音或音响效果的最容易和最安全的方法。同时还可以减小你的游戏的文件大小。
字串4
在Pocket PC上使游戏发出声音的另外的一个容易的方法是使用API函数PlaySound(...)。它可以用来录制和播放音频。因此你可以使用它给你的游戏增加声音,但你需要有外部的音频文件资源。音频文件的扩展名是“WAV”。 它还可以被用来实现录制数字的音频好象录音机软件。你可以从许多地方找到合适的声音资源。在Windows目录,在Pocket PC系统中都有预装的一些声音。我们也能使用他们,象闹钟声、错误提示声等等。
字串4
PlaySound(...) 应用程序接口可以播放来自外部的Wave文件和内在的wave资源,系统会将他们放到内存中(运行时刻产生)。 它有一些播放模式的的选择,例如,循环播放或顺序播放。
sndPlaySnd(...) 是一个PlaySound(...)的子集。它少了一些播放选择但是因此有获得了速度。它也可以通过外部的wave文件向游戏提供声音,并且播放的声音文件在Win.ini文件中进行了注册。
使用标准的API播放声音有一个主要的问题;当一个新声音播放时,前一个会停止。这在一般的游戏程序中可能算不上问题。可一个好的游戏,需要动态的产生声音,什么时候需要,什么时候便产生,声音出现完全取决于游戏的进行状态。我们怎样达到这种效果呢? 字串8
使用pgsnd.dll
我们可以使用Windows多媒体扩展系统(MMSYSTEM)来解决低级的播放音频API带来的问题。方法很简单,我们利用混频器引擎技术实现实时的数字混频。因为代码太复杂了。关于这个我不准备多将。但我们提供一个免费混频的引擎pgsnd.dll,你可以从网站下载栏目下载它。我们同时提供使用它的免费许可证。
在使用这个库之前,你需要调用pg_WaveInit(…) 应用程序接口函数。它将接管设备的声音系统。因此你将不能使用任何标准的声音API例如sndPlaySound(…)。
当你正在运行着一个应用时,你希望切换任务(使用另外一个应用程序),你的程序将失去焦点,但是并没有停止,仍然在运行。此时系统已经被pg_WaveInit(…)钩住,你将没有办法实现在新的应用程序使用wav。怎么办呢?我们可以这样做当你的应用失去焦点或停止活动时,Windows将自动地发送WM_ACTIVATE消息到应用程序窗口。wParam将显示你的应用程序是处在停止还是激活的状态。然后可以用pg_WaveActivate(…) 解决这个问题。
字串4
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(…) 字串6 pg_WaveStop(…) |
音量控制: 有三种音量控制类型; 主音量,所有的音乐音量,单独声道的音量。
最后在退出你前应用前,你需要手工解下WAVE设备。如果你不这样做,声音将不能生产直到你已经重新启动你的机器。有些时候你的程序需要在退出之前就调用pg_WaveClose (…)函数来解下设备,这也许会产生意想不到的事情或者在你的程序中产生一个错误。你同样需要重新启动机器来再次产生声音。
这个反初始化操作最好的位置是在退出应用程序之前。
Ex:
| while(GetMessage(....)) { TranslateMessage(&msg); DispatchMessage(&msg); } pg_WaveClose(); |
![我要研发网[www.51dev.com]](/templets/images/toplogo.gif)
