- 创建DirectSound对象(LPDIRECTSOUND)
- 设置协作级别
- 创建声音缓冲(LPDIRECTSOUNDBUFFER, DSBUFFERDESC, WAVEFORMATEX)
- 把声音数据写入声音缓冲(类似于写入DD中的后备缓冲,只是有两个按照降序排列的指针)
- 播放声音
- 停止声音
- 控制音量(-10000 – 0,其实也就是设置衰减程度)
- 调整频率(100 – 100000 Hz)
- 调整声道平衡(最左:-10000, 最右:10000)
以上这些步骤都是比较固定的,其中难点在于4,声音数据那里来?当然我们可以自己乱写一些数据(我就写过一个正弦波形到缓冲区中让DirectSound播放,其结果就是虐待耳朵),但是最常用的就是从一个已有的WAV文件导入。但是问题是WAV的读取非常的复杂,比BMP文件复杂得多。但是我们可以使用一些已经有的函数。对于WAV文件格式的研究我想暂时搁浅一下。好,如果不算这个问题,那么DS的使用就基本没有问题了。适当调用7-9的步骤可以播放出来一些声音上的特效。
这一章不是我学习DirectX的重点,所以我并没有投入学得太多,这里就都简要介绍一下。
DirectMusic
DirectMusic是整个DirectX中纯的COM最初出现在DirectX 6.0中,也是最复杂的,也是最强大的。以下介绍一下如何用DirectMusic来播放一个MIDI文件。
DirectMusic创建步骤:
- 初始化COM
- 创建一个演奏对象(IDirectMusicPerformance)
- 给演奏对象增加端口(IDirectMusicPort)
- 加载一个MIDI段(IDirectMusicLoader)
- 播放MIDI(由演奏对象IDirectMusicPerformance控制)
- 停止MIDI
- 检查MIDI段状态
- 释放一个MIDI段
这些步骤确实非常复杂,很多都是需要直接调用COM中的函数,而不是DirectMusic提供的。但是它给我们播放MIDI文件带来了统一和方便,DirectMusic为我们作了一切。另外需要注意的是DirectMusic如此只能播放一个MIDI文件,也就是当你播放另外一个MIDI的时候,前一个会自动停止。而不象DirectSound中那样可以同时播放多个WAV。
关于DirectSound和DirectMusic就说这些吧,真的是非常非常少,甚至漏掉了很多东西,但是少并不表示他简单,而事实正是声音部分是最复杂的,但是我不想涉及太多声音的问题,我只是想先照顾画面:)