Windows编程 DirectSound DirectMusic 音效和音乐
版本:VS2015 语言:C++
最近项目遭遇变故,公司随意开人,导致原本要出包的项目现在乱七八糟。现在不知道未来会怎么样……
我们Windows上2D的编程今天是最后一课了,没有听错,2D完结,接下来就是3D了,书已经准备好了,就等我回去去取,有没有点小兴奋呢?嘛,我现在是还没有接触过3D引擎啦,不过等学完再去看看Unreal岂不也是美哉。
今天要讲的是在dx中演奏音乐和音效,没看这个章节前,我一直认为音乐和音效的区别主要是播发时间长短的问题,实际一看,这里面十分的玄妙。
有一点先说一下,相比于图形技术的更新换代,音乐技术没有发生过多大的变化,dx3开始一直到dx7的时候,都是使用dx3的接口。直到dx8才把Sound和Music整合成了Audio。
那么音乐(Music)和音效(Sound)究竟有什么区别呢?
所谓Sound,专业点来说就是数字化的数码声音。比如你买了个麦克风,你干吼几下,然后录音软件把你的声音记录成了一个文件,那个文件就是音效了(很渗人啊)。
而Music是合成音,直接取缔了录音的阶段,用户直接编入数据,让音频发生库发出数据所代表的音乐。
文件格式上来说,Sound代表格式是WAV,而Music是MIDI。
了解了这一些就知道为什么要分成DSound和DMusic了。好了下面是一个实际的程序,先我们使用老接口的Sound来播放一个音效。
申明一下,这里工程中的基础代码是上一节使用过代码,有需要的玩家可以看一下dxinput的内容。
首先需要引入dsound.lib和winmm.lib,但后者是windows部分用于读取媒体文件,所以只需要使用vs自带的lib就OK了。
然后引入头文件#include <mmsystem.h> #include "dsound.h"这两个。
环境搞定之后,下面是编写一些全局代码,做一些准备工作:
LPDIRECTSOUND lpds; //dx音效对象
DSBUFFERDESC dsbd; //音效缓存描述// WAV文件读入后存放的类
typedef struct pcm_sound_typ
{LPDIRECTSOUNDBUFFER dsbuffer;int state;int rate;int size;int id;
}pcm_sound, *pcm_sound_ptr;#define SOUND_NULL 0
#define SOUND_LOADED 1const int MAX_SOUNDS = 10; //最多存放音效的数量
pcm_sound sound_fx[MAX_SOUNDS]; //所有的音效
然后我们要实现的效果就是在游戏初始化的时候读取一个文件,并播放,我看了一下就选wind.wav这个风的音效(不知道从哪录的,怪渗人的)。
下面是初始化并播放的代码:
// 开始创建音效对象
if (DirectSoundCreate(NULL, &lpds, NULL)!=DS_OK)
{popMessage(TEXT("创建音效对象失败"));return 0;
}if (FAILED(lpds->SetCooperativeLevel(main_window_handle, DSSCL_NORMAL))) //设置普通的协作等级
{popMessage(TE