1. 简单百科
  2. directsound

directsound

DirectSound是DirectXAudio的一个较底层的部件,提供了丰富的接口函数,实现.wav格式的波形声音数据的播放控制。

简介

与一般的WindowsAPI提供的声音播放函数不同,DirectSound可实现多个声音的混合播放。DirectSound可充分使用声卡的内存资源,同时也提供了3D声效算法,模拟出真实的3D立体声。

DirectSound的开发比较简单,本章将详细介绍DirectSound各个接口函数基础。

创建对象

要取得次缓冲区,首先需要创建一个IDirectSound8接口对象。为此,调用DirectXAPI函数提供的DirectSoundCreate8进行创建。该函数用到DSound.h和Dsound.lib文件,如下是它的使用原型。

HRESULT DirectSoundCreate8(

LPCGUID lpcGuidDevice, //声卡设备全局标志,一般是NULL,表示默认的声卡

LPDIRECTSOUND8 * ppDS8, //返回的IDirectSound8接口对象指针

LPUNKNOWN pUnkOuter //必须为NULL,因为集合不被支持

)

直观地说,IDirectSound8对象代表声卡设备。下面是利用DirectSoundCreate8函数创建IDirectSound8对象的示例代码。

协调级别

总述

IDirectSound声卡设备创建出来以后,需要调用DirectXAPI函数SetCooperativeLevel,进一步设置设备的协调级别,以决定声卡设备以哪种方式与Windows其他程序分享。HRESULTSetCooperativeLevel

(

HWNDhwnd,//窗口句柄

DWORDdwLevel//协调级别

);

参数hwnd为当前应用程序的窗口句柄。dwLevel参数为协调级别,具有如下的几个取值。

?

DSSCL_EXCLUSIVE

对于DirectX 8.0以上版本,此标志与DSSCL_PRIORITY具有相同的作用。对于以前的版本,此标志设置声卡设备为当前程序独占。

DSSCL_PRIORITY

具有优先设置DirectSound设备的权限。例如,可调用IDirectSoundBuffer8接口SetFormat函数这只主次缓冲区的播放形式。在此标志下,DirectSound必然是独占的,否则不可能重新设置播放格式,因为其他使用该设备的程序是不知道新格式的。

DSSCL_NORMAL

正常的协调层级标志,其他程序可共享声卡设备进行播放。此标志下,主缓冲区的播放格式不允许修改,而且会默认地在声卡内存中申请到一个8bit和22KHz的单声道主缓冲区。

DSSCL_WRITEPRIMARY

可写主缓冲区,此时次缓冲区就不可能进行播放处理,即不能将次缓冲区的数据送进混声器,再输出到主缓冲区上。这是最完全控制声音播放的方式,意味着声卡的混音器被弃置,需要自行处理声音混合。

主缓冲区

设备级别设置为DSSCL_NORMAL,将自动分配一块声卡内存作为主缓冲区,并使用双声道、8bit和22kHz方式进行声音播放。因此,主缓冲区一般是现成的,可略去在声卡内存中再进行主缓冲区的创建分配。

如果需要设置主缓冲区的新播放格式,则可调用IDirectSound8接口的CreateSoundBuffer函数,从声卡内存中分配出缓冲区。当然,此时不能再使用DSSCL_NORMAL方式的设备协调级别,因为该协调级别不允许进行主缓冲区的格式修改。

次缓冲区

次缓冲区用来装入实际的声音数据,因此,必须根据实际的声音文件大小,创建一个相应大小的次缓冲区。

参考资料


Warning: Invalid argument supplied for foreach() in /www/wwwroot/newbaike.com/id.php on line 280