多媒体程序设计是一个名不符实的词组,其道理就是多媒体程序设计包含着广泛的可能性,它尤其包括了Wave音频、MIDI音频、AVI视频和动画等。不要将多媒体程序设计与游戏程序设计混淆了。
游戏设计自然包含多媒体。但是比起简单的声音视频应用程序,它包含多媒体就更多了。接下来我在Delphi多媒体设计中利用Delphi提供的工作做一些工作。
Windows API播放Wave文件(Wave Audio with the Windows API)
通常关于Windows API函数谈论不多,因为大多数时候,VCL提供了比API更好的工作方法。然而,在包房WAVE文件时,没有比Win32 API的PlaySound函数更简单的。利用这个函数处理WAVE文件时非常容易的。首先需要做的就是把MmSystem单元增加到用户单元的uses列表中,然后用适当的参数调用PlaySound:
PlaySound('test.wav', 0, SND_FILENAME or SND_ASYNC);
非常简单是不是?如大家所看到的,PlaySound的第一个参数是用来指定播放的音频文件,最后一个参数用来决定声音如何播放的标志。当播放硬盘上的WAVE文件时,指定SND_FILENAME作为最后一个参数。SND_ASYNC(异步播放)参数的意思是播放声音开始用户立刻获得其他操作权,如果不写这个参数,声音将会播放完成后用户获得操作权。
为此,特别编写了一个简单的范例,点击按钮后,播放音乐,弹出对话框,提示你是否终止音乐,如下图:
PlaySound函数也可以播放系统声音和磁盘文件,要播放系统声音,指定声音别名作为第一个参数给PlaySound,而把SND_ALIAS最为标志参数,例如:
PlaySound('WindowsLogon', 0, SND_ALIAS or SND_ASYNC);
这段代码播放与Windows启动事件相关联的系统声音,具体的系统事件声音的别名可在注册表中查找。
Note
注册表中HKEY_CURRENT_USER\AppEvents下存储着系统事件声音设置,在下面还有“EventLabels”和“Schemes”两个子键。子键 EventLabels-储存了每个事件的标识及名称,而子键Schems则关联了每个事件和声音,它下边有“Apps”和“Name”两个子键, “Apps”子键下储存了系统事件的声音设定,一般每个事件下有两个子键“.Current”指当前的声音设置文件位置和“.Default”指默认的声音文件的位置。“Name”子键储存了声音配音方案的名称。
也为系统声音编写了小范例,如下图,点击按钮后,播放系统启动的声音。
如果所要求的声音未能找到,Windows将会发出缺省声音(若有缺省值则为叮声),可以通过制定SND_NODEFAULT标志来禁止Windows发出缺省声音。例如,若想要播放系统声音,但若找不到系统声音,不要发出缺省声音,可以试试这段代码:
PlaySound('找不到', 0, SND_ALIAS or SND_ASYNC or SND_NODEFAULT);
注意:SND_ALIAS、SND_ASYNC和SND_NODEFAULT之间用or连接。
Note
Win32 API的MessageBeep函数也能通过索引值来发出系统声音。MessageBeep的调用很简单,只有一个参数,如下:
MessageBeep(MB_OK);实例代码中,点击下列两个按钮,测试听听,学会MessageBeep的用法。
处理PlaySound函数时有两个其他的标志非常重要:
- SND_ASYNC标志规定异步发声,当使用该标志时,声音开始播放,并马上返回控制调用程序。意思是,声音的播放,不影响应用程序的其他操作。
- SND_SYNC标志规定同步发声,知道声音播放完毕后才返回给调用程序。该标志为PlaySound 函数缺省标志。
还有许多其他的标志可用来控制怎样用PlaySound播放声音。详情请自行参看Win32联机帮助中PlaySound部分。
以上代码均在Delphi 7中测试通过,示例代码下载:多媒体程序设计.rar