DirectSound是DirectXAudio的一个较底层的部件,提供了丰富的接口函数,实现.wav格式的波形声音数据的播放控制。
简介
与一般的WindowsAPI提供的声音播放函数不同,DirectSound可实现多个声音的混合播放。DirectSound可充分使用声卡的内存资源,同时也提供了3D声效算法,模拟出真实的3D立体声。
DirectSound的开发比较简单,本章将详细介绍DirectSound各个接口函数基础。
创建对象
要取得次
缓冲区,首先需要创建一个IDirectSound8接口对象。为此,调用DirectX
API函数提供的DirectSoundCreate8进行创建。该函数用到DSound.h和Dsound.lib文件,如下是它的使用原型。
HRESULT DirectSoundCreate8(LPCGUID lpcGuidDevice, //声卡设备全局标志,一般是NULL,表示默认的声卡LPDIRECTSOUND8 * ppDS8, //返回的IDirectSound8接口
对象指针LPUNKNOWN pUnkOuter //必须为NULL,因为集合不被支持)
直观地说,IDirectSound8对象代表声卡设备。下面是利用DirectSoundCreate8函数创建IDirectSound8对象的示例代码。
协调级别
总述
IDirectSound声卡设备创建出来以后,需要调用DirectX
API函数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
可写主缓冲区,此时次缓冲区就不可能进行播放处理,即不能将次缓冲区的数据送进混声器,再输出到主缓冲区上。这是最完全控制声音播放的方式,意味着声卡的
混音器被弃置,需要自行处理声音混合。
主缓冲区
设备级别设置为DSSCL_NORMAL,将自动分配一块声卡内存作为主
缓冲区,并使用
双声道、8bit和22kHz方式进行声音播放。因此,主缓冲区一般是现成的,可略去在声卡内存中再进行主缓冲区的创建分配。
如果需要设置主缓冲区的新播放格式,则可调用IDirectSound8接口的CreateSoundBuffer函数,从声卡内存中分配出缓冲区。当然,此时不能再使用DSSCL_NORMAL方式的设备协调级别,因为该协调级别不允许进行主缓冲区的格式修改。
次缓冲区
次缓冲区用来装入实际的声音数据,因此,必须根据实际的声音文件大小,创建一个相应大小的次缓冲区。