DirectSound是DirectXAudio的一个较底层的部件,提供了丰富的接口函数,实现.wav格式的波形声音数据的播放控制。
directsound_DirectSound -DirectSound
DirectMusic和DirectSound比较
DirectSound是DirectXAudio的一个较底层的部件,提供了丰富的接口函数,实现.wav格式的波形声音数据的播放控制。
与一般的WindowsAPI提供的声音播放函数不同,DirectSound可实现多个声音的混合播放。DirectSound可充分使用声卡的内存资源,同时也提供了3D声效算法,模拟出真实的3D立体声。
DirectSound的开发比较简单,本章在详细介绍DirectSound各个接口函数基础上,
directsound_DirectSound -创建IDirectSound8对象
要取得次缓冲区,首先需要创建一个IDirectSound8接口对象。为此,调用DirectXAPI函数提供的DirectSoundCreate8进行创建。该函数用到dsound.h和dsound.lib文件,如下是它的使用原型。
HRESULTWINAPIDirectSoundCreate8
(
LPCGUIDlpcGuidDevice,//声卡设备全局标志,一半是NULL,表示默认的声卡
LPDIRECTSOUND8*PPDS8,//返回的IDirectSound8接口对象指针
LPUNKNOWNpUnkOuter//必须为NULL
);
直观地说,IDirectSound8对象代表声卡设备。下面是利用DirectSoundCreate8函数创建IDirectSound8对象的示例代码。
directsound_DirectSound -设置设备的协调级别
IDirectSound声卡设备创建出来以后,需要调用DirectXAPI函数SetCooperativeLevel,进一步设置设备的协调级别,以决定声卡设备以哪种方式与Windows其他程序分享。
HRESULTSetCooperativeLevel
(
HWNDhwnd,//窗口句柄
DWORDdwLevel//协调级别
);
参数hwnd为当前应用程序的窗口句柄。dwLevel参数为协调级别,具有如下的几个取值。
四个协调级别分别是:?
DSSCL_EXCLUSIVE
对于DirectX8.0以上版本,此标志与DSSCL_PRIORITY具有相同的作用。对于以前的版本,此标志设置声卡设备为当前程序独占。
DSSCL_PRIORITY
具有优先设置DirectSound设备的权限。例如,可调用IDirectSoundBuffer8接口SetFormat函数这只主次缓冲区的播放形式。在此标志下,DirectSound必然是独占的,否则不可能重新设置播放格式,因为其他使用该设备的程序是不知道新格式的。
DSSCL_NORMAL
正常的协调层级标志,其他程序可共享声卡设备进行播放。此标志下,主缓冲区的播放格式不允许修改,而且会默认地在声卡内存中申请到一个8bit和22KHz的单声道主缓冲区。
DSSCL_WRITEPRIMARY
可写主缓冲区,此时次缓冲区就不可能进行播放处理,即不能将次缓冲区的数据送进混声器,再输出到主缓冲区上。这是最完全控制声音播放的方式,意味着声卡的混音器被弃置,需要自行处理声音混合。
directsound_DirectSound -Primary主缓冲区的创建
设备级别设置为DSSCL_NORMAL,将自动分配一块声卡内存作为主缓冲区,并使用双声道、8bit和22kHz方式进行声音播放。因此,主缓冲区一般是现成的,可略去在声卡内存中再进行主缓冲区的创建分配。
如果需要设置主缓冲区的新播放格式,则可调用IDirectSound8接口的CreateSoundBuffer函数,从声卡内存中分配出缓冲区。当然,此时不能再使用DSSCL_NORMAL方式的设备协调级别,因为该协调级别不允许进行主缓冲区的格式修改。
directsound_DirectSound -Secondary次缓冲区的创建
次缓冲区用来装入实际的声音数据,因此,必须根据实际的声音文件大小,创建一个相应大小的次缓冲区。