Rise的自留地

记录生活中的点滴,分享编程技术和游戏开发经验。

0%

写字楼里写字间,写字间里程序员;程序人员写程序,又拿程序换酒钱。
酒醒只在网上坐,酒醉还来网下眠;酒醉酒醒日复日,网上网下年复年。
……
宁愿老死程序间,只要老板多发钱;小车大房不去想,撰个2  k好过年。
若要见识新世面,公务员比程序员;一个在天一在地,而且还比我们闲。
别人看我穿白领,我看别人穿名牌;天生我才写程序,臀大近视肩周炎。

年复一年春光度,度得他人做老板;老板扣我薄酒钱,没有酒钱怎过年。
春光逝去皱纹起,作起程序也委靡;来到水源把水灌,打死不做程序员。
别人笑我忒疯癫,我笑他人命太贱;状元三百六十行,偏偏来做程序员!!

但愿老死电脑间,不愿鞠躬老板前;奔驰宝马贵者趣,公交自行程序员。
若将程员比妓女,一在平地一在天;若将程员比车马,他得驱驰我无闲。
别人笑我忒疯癫,我笑自己命太贱;不见满街漂亮妹,哪个归得程序员。

不想只挣打工钱,那个老板愿发钱;小车大房咱要想,任我享用多悠闲。
比尔能搞个微软,我咋不能捞点钱;一个在天一在地,定有一日乾坤翻。
我在天来他在地,纵横天下山水间;傲视武林豪杰墓,一樽还垒风月山。


电脑面前眼发直,眼镜下面泪茫茫;做梦发财好几亿,从此不用手指忙。
哪知梦醒手空空,老板看到把我训;待到老时眼发花,走路不知哪是家。

各位在此穷抱怨,可知小弟更可怜;俺学编程两年半,至今没赚一分钱。
听说三十是末日,二十三岁在眼前;发誓立志傍微软,渺渺前程对谁言?

 

小农村里小民房,小民房里小民工;小民工人写程序,又拿代码讨赏钱。
钱空只在代码中,钱醉仍在代码间;有钱无钱日复日,码上码下年复年。
但愿老死代码间,不愿鞠躬奥迪前,奥迪奔驰贵者趣,程序代码贫者缘。
若将贫贱比贫者,一在平地一在天;若将贫贱比车马,他得驱驰我得闲。
别人笑我忒疯癫,我笑他人看不穿;不见盖茨两手间,财权富贵世人鉴。


(参考:**  桃花庵歌**         ——唐寅)

桃花坞里桃花庵,桃花庵里桃花仙;桃花仙人种桃树,又摘桃花换酒钱。
酒醒只在花间坐,酒醉还来花下眠;半醒半醉日复日,花开花落年复年。
但愿老死花酒间,不愿鞠躬车马前;车尘马足贵者趣,酒盏花枝贫者缘。
若将贫贱比贫者,一在平地一在天;若将贫贱比车马,他得驱驰我得闲。
别人笑我忒疯癫,我笑他人看不穿;不见五陵豪杰墓,无花无酒锄作田。

了解网络互联

网络是指多台计算机互联以进行数据传输及通信的系统。除了两个或更多的计算机之外,网路还需要有网络互联软件(或一个网路操作系统)、网络适配器以及电缆。网络适配器有各种形状和大小,但是一般都采用调制解调器的形状。实际上,调制解调器就是一个网路适配器,它能够将一台计算机通过世界上最大的网络—互联网连接到数百万台计算机上。

网路模型

网络互联模型有三种基本类型:服务器端、客户端以及点对点。

使用服务器端模型,可以建立一个中央网络互联系统。其他计算机使用客户端模型连接到服务器端后,就可以向服务器端发送数据以及从服务器端接收数据。客户端没有其他客户端的信息,不直接与它们连接,客户端都只知道服务器端的信息,而服务器端则拥有所有客户端的信息以及适合这些客户端之间的路由信息。服务器端和客户端常常成对进行描述,即服务器端/客户端(C/S)模型,但是在使用DirectPlay时,将二者分开是有必要的,因为服务器端和客户端是由两个独立的组件组成的。

点对点(peer-to-peer)这种网络互联模型与服务器端模型或客户端模型正好相反,计算机相互之间直接进行连接。每一台新的计算机加入网络会话中,都会建立一个新的连接,所以每台计算机都能直接连接到其他计算机。连接到网络的时段称为会话,一次会话会有与之相关的属性,如密码、最大连接数等。

游戏厅

可以将游戏厅服务器看作在线玩家的会议大厅,一个游戏厅允许所有玩家登录、通信以及加入他们喜爱的一些游戏。一旦游戏厅服务器连满了玩家,就停止对游戏厅的循环(这样做是为了节省网络带宽)。网络带宽(network bandwidth)指的是一个网络连接能够轻松处理的数据量,高网络带宽连接能比低网路带宽连接更快地处理大量的网络数据。

响应时间和延迟

带宽引出了两个术语:响应时间和延迟。响应时间是完成一个操作所花的时间(越低越好)的量化。延迟是用来描述网络通信的迟滞的术语,即数据从发送到它被接收到所花的时间。

低延迟表示网络数据迅速地被接收。高延迟(最不希望出现的事情)表示网络数据被延迟或者根本没有被发送到。延迟是一个主要问题,特别是使用了互联网时,就必须处理这个问题。

通信协议

网络可以有各种方式进行相互通信,但是要连接到另一个,两个系统都必须采用相同的协议。目前最流行的协议是TCP/IP协议(传输控制协议/Internet协议),它被广泛应用于互联网。通信协议也被称作服务器提供者,无论服务器提供者是一种诸如IPX、TCP/IP的协议,还是一种诸如调制解调器或者串行电缆的设备,都可以把它看作是网络互联的连接体。

TCP/IP协议是一种在网络上传输数据包的方法。它将数据分割成很多小数据包,再加上发送方和接收方的地址以及包的数目,便于重组数据。信息在传输过程中丢失(频繁发生的事情),TCP/IP允许网络重发数据包。当出现延迟时,这些数据包可能以错误的顺序被接收,比如旧的数据包在新的数据包之后到达。好在无需担心,因为TCP/IP会重发丢失的包并且重组无序的包。

寻址

在TCP/IP协议下,一个系统被分配一个由4个数字(0 -255之间)组成的网络地址(IP地址),数字之间用点分割。一个IP地址就像下面这样:

64.120.53.2

IP地址对我们来说不好辨认,但是网络却可以根据每一个数值成功地传递数据。稍加运算就会发现,这4个数字的组合总共可以提供4294967296个可能的地址。为了增加地址数量,网络使用附加的称为端口的地址值,数据被传送到其上。

如果将IP地址比喻成一个邮政室(mailroom),那么该邮政室(IP地址)描述了与网络相连的单个计算机系统,并且该计算机系统只被分配了惟一的IP地址。在邮政室中有很多箱柜(端口),邮件被分类到其中。每一个箱柜(端口)属于一个特定的工作人员(一个特定的应用程序)。一些应用程序可以拥有多个端口,数据只能被一个同相应IP地址以及相应端口所匹配的系统接收。一种称为数据路由器(data router)的设备将接收到的网络数据传送到它所知道的系统,或者将数据传送到另一个网络连接。

DirectPlay概述

要在工程中使用DirectPlay,必须包含DPlay8.h和DPAddr.h,还要链接DPlayX.lib和 DXGuid.lib。

网络对象

使用DirectPlay,需要使用前面提到的网络模型:客户端、服务器端和点对点。每一种网络模型都有自己的接口对象,如下所示:

IDirectPlay8Client:客户端网络对象,连接到一个服务器端。
IDirectPlay8Server:服务器端网络对象,连接多个客户端。
IDirectPlay8Peer:   点对点网络对象,连接客户端于其他客户端。
IDirectPlay8Address:包含(以及构造)网络地址的对象。

要连接到远程网络系统(或主持一次会话),需要使用 IDirectPlay8Address构造一个网络地址,IDirectPlay8Address的惟一用途就是构造并包含单个网络地址。会话指的是主持或加入一个可连接网路系统的时段,终止连接时,会话也就终止了。要主持游戏会话或连接到远程系统,首先需要创建网络对象并给它分配地址。要主持游戏会话,只需要等待其他系统(也就是使用这些系统的人)连接上来即可。连接建立之后,系统就可以和远程系统开始相互传输游戏相关的网络消息, DirectPlay把这些远程系统称作玩家。

将玩家进行分组

在DirectPlay术语中,“玩家”是指通过网络连接到其他计算机的单个连接(通常是一个游戏玩家)。一台计算机可以有多个玩家,但一般只有一个。实际上,服务器端也被标识为玩家,以便于识别。每一个玩家都会接收到一个标识号码(玩家ID),系统使用这个标识号码来将消息传递到每个玩家。这些号码是追踪玩家的惟一可信任方法,所以需要让程序对它们进行相应地处理。

对于大型游戏,可能有成千上万已连接的玩家。为了在游戏中更好地处理这些玩家,可以将一些或所有玩家编制到一些组中。采用组的概念可以减少编程的繁琐,主要原因在于可以将一个游戏区域(比如一张地图或某个级别)中的多个玩家划分为一组,并且一次向整个组发送网络数据,而不是单独发送给各个玩家。使用组还有很多其他原因,但这个原因是最主要的。一个组中包含多少玩家以及创建多少个组完全没有限制,组也可以属于其他组。

带消息的网络互联

消息是分了类的数据包,其中包含简单的结构。每一个消息都有特定的含义,且都有一个与之对应的宏,而且还和所使用的网络模型有关。要接收消息,网络对象必须给自己指定一个回调函数,以便于每次消息到达时进行调用。为了确保得到平滑的数据流,该函数根据数据类型进行分析并尽快地返回。发送消息,需要使用各个网络对象的发送函数。这些函数易于使用,并且提供了许多发送选项,包括保证发送(guaranteed delivery)、安全编码(secure encryption)以及同步或异步发送。

同步与异步

DirectPlay提供的第一个发送选项是同步或异步发送消息的功能,也就是说系统在发出发送数据指定之后交回控制权(异步),还是直到所有的数据都成功发送之后再交回控制权(同步)。很多时候使用异步方法,因为它不会像同步方法那样阻塞系统。

安全性

要引起注意的是任何时候都可能有人在截取并记录游戏的网络数据。因此,就需要采用一种安全的方式编码消息数据,使得那些解码的黑客非常难读懂先前的信息。使用安全网络发送的不好之处在于它会稍稍减慢系统的系统,因为必须在数据发送之前先编码信息,然后在接收到之后进行解码。

保证发送

就像一些快递公司保证送到包裹一样, DirectPlay也能保证送到消息。可以将一组信息标识为保证的,其余确定的就是DirectPlay将一直执行发送操作直到发送成功,以保证将其发送到目标地址(除非断线),使用保证发送是通过在调用函数时指定一个惟一的标志来实现的。保证发送的不好之处在于速度,保证发送在实际的游戏状况下非常慢,游戏采用UDP(用户数据报协议)发送方法,就不用关心数据是否被接收到(和TCP发送方法相反,它保证数据的发送)。

节流

有时系统会因为试图处理流数据而过载,尽管这样, DirectPlay有一个内置的消息节流器,它丢弃了发送队列中低优先级的信息。

使用GUID识别应用程序

如何从众多的网络应用程序中区分出自己的网络应用程序呢?解决这个问题的方法就是给自己的应用程序指定一个惟一的号码,并且只允许使用相同号码的应用程序相互进行连接。这个特殊的号码就是 Windows程序员熟悉的GUID(全局惟一标识符)。创建应用程序之前,花一点时间给它设置一个惟一的GUID,并且保证所有通过网络进行连接的该应用程序使用相同的GUID。

初始化网络对象

无论是服务器端、客户端还是单点对象,使用DirectPlay的第一步都是创建网络对象。要初始化每一个网络模型接口,必须使用CoCreateInstance函数,可能用到的类ID和引用标识符如下所示:

前言:本教程面向对DriectX 9.0有一定了解的读者,主要讲解DirectX 9.0的各个部分的功能及用法。希望对广大的游戏初学者有一定帮助,也好让本人对中国游戏事业的发展做出一些微不足道的贡献。作者:Fabric(由于本人是广东人,写文章难免参杂粤语写法,请见谅)

  简介:ID3DXSpriteDriectX 9.0里面的一个简单模块,在DriectX 9.0帮助文档里面对其功能的描术为:向用户提供一套简单的在屏幕上实现精灵渲染的接口。何为精灵渲染,说白了就是渲染2D画面,ID3DXSprite帮助用户透过简单的操作就能运用DriectX 9.0制作2D游戏(渲染2D图形),ID3DXSprite的功能还包括:帮助用户在3D游戏里面实现公告牌技术。下面,将对如何使用ID3DXSprite作详细分折。

  得到一个ID3DXSprite对像:玩过DriectX的人都知道,干什么前都得先取得一个实例对像,其实只要简单调用D3DX为我们提供的一个函数就可完成:

HRESULT D3DXCreateSprite(
  LPDIRECT3DDEVICE9 pDevice,
  LPD3DXSPRITE * ppSprite
)
这个函数如何调用,不用我解释了吧,碰过DriectX的人都应该知道他里面的意思。
 
渲染准备:DirectX 9.0规定,运用ID3DXSprite渲染2D图形前,应先调用ID3DXSprite::Begin做准备工作,在渲染工作完成之后,调用ID3DXSprite::End做善后工作。格式如下:

g_pSprite->Begin(NULL);

//渲染代码部分。。。。

g_pSprite->End();

其中,ID3DXSprite::Begin接收一个参数,该参数将决定精灵以什么方式进行渲染,该参数可以为以下值之一:

·   D3DXSPRITE_ALPHABLEND

·   D3DXSPRITE_BILLBOARD

·   D3DXSPRITE_DONOTMODIFY_RENDERSTATE

·   D3DXSPRITE_DONOTSAVESTATE

·   D3DXSPRITE_OBJECTSPACE

·   D3DXSPRITE_SORT_DEPTH_BACKTOFRONT

·   D3DXSPRITE_SORT_DEPTH_FRONTTOBACK

·   D3DXSPRITE_SORT_TEXTURE

上面的标志可以合并使用,标志意思可以从其名字中略知一二,而具体用法,后面将在运用到的时候加以介绍

 

渲染:运用ID3DXSprite渲染2D图形其实好简单,只需调用ID3DXSprite::Draw接口,该接口原型如下:

HRESULT Draw(

  LPDIRECT3DTEXTURE9 pTexture,

  CONST RECT * pSrcRect,

  CONST D3DXVECTOR3 * pCenter,

  CONST D3DXVECTOR3 * pPosition,

  D3DCOLOR Color

);

其中 参数一为精灵所用到的纹理。

参数二为要渲染的纹理矩形区域,意思上就像DirectDraw中所说的原位图矩形(指明要将纹理的哪一部分渲染到屏幕上)

参数三要求传入纹理的中心点坐标,如果传入NULL则表明使用默认值,默认值为将纹理的左上角设为中心点。中心点的设定将关系到日后对精灵进行位移,旋转的效果

参数四为精灵在屏幕上的渲染位置,如要在屏幕的(100,100)像素位置渲染精灵,则应传入&D3DXVECTOR3(100.0f, 100.0f, 0.0f),其实参数三加参数四可以简单的理解为DirectDraw中所说的目的地矩形

参数五要求传入一个32位颜色值,在渲染时,纹理上的每一个像素的颜色值将与其进行相乘,得到最后的渲染颜色,如传入0x00000000,相乘后颜色值将为0,所以精灵将以全黑色渲染,这个参数还有一个用处,就是控制精灵的透明值:当用户在调用ID3DXSprite::Begin时传入D3DXSPRITE_ALPHABLEND标志,则表明打开精灵透明渲染功能,此时参数五的高8位用于指明渲染的透明度,例如:要完全不透明的渲染图像,应传入0xffffffff,要完全透明的渲染图像,应传入0x00ffffff

 

精灵位移,缩放,旋转等处理:可以通过调用ID3DXSprite::SetTransform实现,此接口要求传入一个变换矩阵,注意:这里的变换矩阵指的是变换2D平面上的坐标,而非我们平时常用的3D变换矩阵,2D平面变换矩阵应该调用函数D3DXMatrixTransformation2D得到,该函数的使用方法请参照DirectX9.0帮助文件。

 

下面附上部分代码,大概实现效果为:在屏幕的(100,100)坐标处渲染一个2D精灵,该精灵被缩小为原来的十分之一,并附带0.5孤度的旋转,透明度为60%左右

 

//初始化精灵对像

D3DXCreateSprite(g_pDevice, &g_pSprite);

 

g_pDevice->BeginScene();

 

     g_pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL,

         D3DCOLOR_XRGB(0,0,0),1.0f,0L);

 

g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);

 

     //得到2D坐标转换矩阵

     D3DXMatrixTransformation2D(&mat, NULL, 0.0f, &D3DXVECTOR2(0.1f, 0.1f),

         &D3DXVECTOR2(50.0f, 50.0f), 0.5f, &D3DXVECTOR2(100.0f, 100.0f));

     g_pSprite->SetTransform(&mat);

 

     //渲染精灵

     g_pSprite->Draw(g_ptexSprite, NULL, NULL, NULL, 0x99ffffff);

 

g_pSprite->End();

 

g_pDevice->EndScene();

 

g_pDevice->Present(NULL, NULL, NULL, NULL);

加入到MP3的革命中

MP3是一种音频压缩格式,它通过删除或修改音乐中不易被人耳察觉的部分来使音乐更小,占用的存储空间更少。在项目中使用MP3(.MP3文件)需要使用DirectX中的 DirectShow组件,在这个组件的帮助下,只需几行短短的代码,就能使用任意的MP3文件了(DirectShow也支持其他的媒体文件,比如 WMA,AVI,MPG等)。当然要想使用更多的媒体文件,必须已经在操作系统中安装了解码器。

解码器(codec)是一个程序,用于解码或编码一些指定的格式(比如MP3解码器专门解码.MP3文件)。通常可以从发明或者创建这种格式的公司中获取这种格式的解码器。比如,MP3解码器来自于Fraunhofer Insitute。幸运的是,MP3解码器等几种比较流行的解码器已经被集成到操作系统中(比如.mp3,.avi,.mpg等),而无需另外从 internet下载这些格式的解码器了。

要在项目中使用DirectShow,需要包含dshow.h头文件,并且在链接库中加入strmiids.lib。

使用DirectShow

DirectX是一组COM接口组件,DirectShow也不例外,DirectShow中经常使用的组件如下:

IGraphBuilder:  帮助建立滤波图,滤波过滤图是一组对象或接口的集合,用于处理某种媒体文件。
IMediaControl:控制数据在滤波图中的流程,使用该接口控制音乐的回放。
IMediaEvents:   从滤波图中获取事件及通告,当希望知道在滤波图中发生了什么的时候这个对象很有用,比如希望知道一个音乐是否仍然在播放或者已经停止播放。

其中第一个接口IGraphBuilder是比较重要的对象,其他对象都依赖于它,或者靠它创建。它创建滤波器,用于处理媒体问题,另外很多有用的功能也是依靠这个对象。

使用DirectShow播放MP3的第一步是调用 CoCreateInstance函数创建滤波图对象IGraphBuilder。

加载音色库(乐器)

DirectMusic加载器在使用固有文件或者MIDI文件的时候会自动加载默认的音色库。乐器总是被一组一组地使用,很多组乐器音色的集合被称之为DLS音色库(可下载的音乐)。每组乐器使用三个值编号,它们是:最高有效位(most-significant byte,MSB),最低有效位(least-significant byte,LSB)和组编号。

通常播放MIDI文件的乐器组是标准化的,也就是说编号为1的乐器总是钢琴,如果想使用新的钢琴作为乐器,可以从DLS集合中加载。DirectMusic包含了标准的乐器集合,通常称之为GM/GS集合(GM = General MIDI,GS = General Synthesizer),这个集合由日本罗兰(Roland)公司提出,称为MIDI合成器标准。

如果使用新的乐器取代标准MIDI乐器库中的乐器,需要确定该乐器的MSB和LSB为0,否则就需要为乐器库中的每个乐器都尝试新的赋值,以免打乱乐器库乐器排列。如果只想修改音色库中的一对乐器,只需要将它们保存在乐器库中即可。在下次加载DLS的时候,就会自动用新修改的乐器覆盖住内存中的旧乐器。当DLS加载完成的时候,就可以通知DirectMusic使用音色库对音乐进行播放了。

加载DLS音色库,需要从加载器中获取一个IDirectMusicCollection8对象,然后再次使用IDirectMusicLoader8::GetObject加载音色库,但是这一次指定的是音色库对象和音色库文件名。

以下代码演示了如何加载指定的音色库:

使用DirectMusic

在DirectAudio 中,DirectSound负责数字音频方面的处理,而DirectMusic则负责Midi文件(Musical Instrument Data Interface,数字音乐格式,.mid作为文件扩展名),DirectMusic固有音乐文件(.sgt文件)和数字录音设备录制的波形格式文件(.wav文件)等文件的播放操作。

能体现DirectMusic的强大之处是DirectMusic固有文件格式,一首用DirectMusic固有文件格式制作的音乐包括数个小音乐格式,这些样式还能用不同的乐器组合一个接一个地播放。随机的样式和乐器的选取创造出了随时都在改变的音乐,再加上节拍变化,就形成了一个魅力无穷的音乐系统。DirectMusic的另一个特性是可以使用“基调”,就是在正在播放的音乐片段上叠加一段其他音乐,新加入的音乐可以很平滑的融入到原有的音乐中。这在很多时候都有用,比如一个玩家完成了一个目标,可以马上播放一段“获得荣誉”的音乐提示他。

除了传统的音符之外,Midi音乐中可以包含数字音频作为音符,比如枪声、猴子的尖叫、也或者是其他各种各样你觉得奇怪的东西。比如可以在游戏中使用曾经梦想到的最令你心惊胆颤的音乐,而这些MIDI音乐都能完成。使用数字乐谱还有一个巨大的好处,即音乐在所有的计算机上可以发出一致的声音,这点是通过使用统一的DirectSound合成器完成的,当然DirectMusic允许使用 DirectSound接口或者是个人创建的接口。音乐数据使用的合成器通道称为音频通道(Audio Path),你可以获取这个通道,并在普通的DirectSound音频缓冲中播放。

使用Midi文件和 DirectMusic固有文件有共同的好处,那就是可以修改播放的节拍,这也是很有用的特性。有了这个特性,就可以设计随着屏幕动作而加速或者减速的背景音乐。如果游戏进入紧张的时期,就加速节拍,使音乐具有紧张感,如果高潮的活动结束,可以放慢节拍。数字录音设备所录制下来的音乐也是非常丰富多彩的,尽管这种音乐可以拥有非常高的音乐质量,但是这种歌曲不能被修改以便匹配游戏活动,也就是说这些音乐只能保持最开始录制的那个样子,不能有更多的变化,也不能减少里面的元素。

开始使用DirectMusic

使用 DirectMusic的第一步是创建一个主对象,我们把这个对象叫做演奏器对象(performance object),它表现整个音乐系统,第二步创建一个叫加载器(loader object)的对象,加载器加载所有原始的音乐文件。最后必须加载音乐小节到音乐片段对象(segment object)中,多个小节可以被同时加载,并一个接一个地播放,这可以让我们创建更具动态效果的音乐。

DirectMusic并没有提供函数帮助创建或初始化DirectMusic主接口,所以需要自行初始化COM接口,初始化COM接口所调用的第一个函数是CoInitialize。

使用通告

“通告”是一种触发机制,当缓存中播放位置达到某个固定的位置时,就会向程序发出通知。有了通告,就可以知道播放什么时候结束,这种机制在比较长的声音中特别有效。通告使用一个叫做 IDirectSoundNotify8的对象,这个程序的作用就是在音频缓存中标记一个位置,然后触发事件通知应用程序,而应用程序可以通过消息循环或者单独的线程进行处理。

标记的位置可以是一个缓存中的偏移值,也可以是由宏指定的停止标记,这个表示停止的宏是 DSBPN_OFFSETSTOP。并不是任何偏移值都可以用来作为通告发生的位置,这个值必须和音频的数据块对齐,并且通告的偏移必须按照从小到大的顺序排列。偏移值是不能够共享的,如果使用 DSBPN_OFFSETSTOP宏,它必须被放在最后。举例来说,对于一个块大小为2的音频(单声道、16位),尝试对偏移为4和5的位置设通告会导致失败,因为偏移量位置4和5都在同一个数据块中。

如果要在缓存中使用通告,必须在创建缓存的时候使用 DSBCAPS_CTRLPOSITIONNOTIFY标志,并且如果在创建缓存的过程中使用了这个标志,就必须使用通告对象。如果希望获取 IDirectSoundNotify8对象,可以在IDirectSoundBuffer8对象中通过请求接口来获得。

调整声道平衡

所谓声道平衡就是调节左右声道的大小, DirectSound定义了两个宏帮助把声道平衡调节到最左边和最右边,使用DSBPAN_LEFT将声道调整到最左边,使用DSBPAN_RIGHT 将声道调整到最右边。

通过调用IDirectSoundBuffer8::SetPan函数可以调节声道平衡。