利用API制造的3D声效 C++

 

3D声效的原理是这样的:

首先要根据发声者的位置,声音的方向,声音锥的内锥角和外锥角,倾听者的头顶方向,面向方向,位置的各种数值来决定声音的音量大小.

在内锥区域,随着发声者与倾听者的距离越大,声音逐渐变小,小到一定程度就不再变化.相反,距离越小,声音变大,大到一定程度声音不再变化.在内锥与外锥之间的区域,随着角度的增大声音有所减弱;在声音锥以外的区域,声音大小逐渐减弱(随着距离的增大逐渐减少).倾听者侧身听与正面听的声音是不同的.

这里只介绍directX里面的API函数的方法.

DirectSound默认的最小距离为DS3D_DEFAULTMINDISTANCE=1,最大的距离DS3D_DEFALTMAXDISTANCE=100billion,默认情况是忽视最大距离的作用.这里的两个距离可以调用函数改变数值.

3D声效的编程:

首先必须在添加DSBCAPS_CTRL3D创建出的IDirectSoundBuffer的基础上,调用函数QuertInterface(IID_IDirectSound3DBuffer8,(void **)&pDirectSound3DBuffer8);这里的pDirectSound3DBuffer8是次缓冲区的接口指针,也是发声者.

然后,通过这个发声者调用

HRESULT SetPosition(D3DVALUE x,D3DVALUE y,D3DVALUE z,DWORD dwApply //启动时机,一般为DS3D_IMMEDIATE,表示立即启用),

HRESULT GetPostion(D3DVECTOR * pvPosition);

HRESULT SetConeAngles(DWORD dwInsideConeAngle,DWORD dwOutsizeConeAngles,DWORD dwApply);

HRESULT GetConeAngles(LPDWORD pdwInsideConeAngle,LPDWORD pdwOutsideConeAngle);

HRESULT SetConeOrientation(D3DVALUE x,D3DVALUE y,D3DVALUE z,DWORD dwApply);//声音锥方向

HRESULT GetConeOrientation(D3DVECTOR *pvOrientation);

HRESULT SetMaxDistance(D3DVALUE flMaxDistance,DWORD dwApply);

HRESULT GetMaxDistance(D3DVALUE *pflMaxDistance);

HRESULT SetMinDistance(D3DVALUE flMinDistance,DWORD dwApply);

HRESULT GetMinDistance(D3DVALUE * pflMinDistance);

HRESULT SetVelocity(D3DVALUE x,D3DVALUE y,D3DVALUE z,DWORD dwApply);//声音的速度

HRESULT GetVelocity(D3DVECTOR * pvVelocity);

HRESULT SetConeOutsideVolume(LONG lConeOutsideVolume,DWORD dwApply);

一系列的函数来输入3D音效的发声者的各个数据的值.

由于IDirectSound3DBuffer8并不包含Play等控制函数,因此在播放控制中,我们只能在通过次缓冲区的IDirectSoundBuffer接口指针进行控制处理.

另外还要创建带DSBCAPS_CTRL3D标志的主缓冲区,用主缓冲的接口指针IDirectSoundBuffer调用QueryInterface函数生成IDirectSound3DListener接口指针,再通过该接口指针调用函数:

HRESULT SetPosition(D3DVALUE x,D3DVALUE y,D3DVALUE z,DWORD dwApply);

HRESULT GetPosition(D3DVECOTR * pvPosition);

HRESULT SetOrientation(D3DVALUE xFront,D3DVALUE yFront,D3DVALUE zFront,D3DVALUE xTop,D3DVALUE yTop,D3DVALUE zTop,DWORD dwApply);//倾听者方向,面对方向,头顶方向

HRESULT GetOrientation(D3DVECTOR * pvOrientFront, D3DVECOTR * pvOrientTop);

   因此,利用directsound创建3D声效,先要添加DSBCAPS_CTRL3D标志去创建主次缓冲区,主缓冲区创建Listener,设置Listener的各种数值,次缓冲区创建发声者,设置发声者的各种数值,最后调用次缓冲区的IDirectSoundBuffer进行声音播放的控制.

  在用DSBCAPS_CTRL3D时,必须使用能够使用3D效果的音频文件 如:windows 自带的Windows XP 错误.wav等;其他的不支持3D效果的文件是会创建失败的。

关于3D声效的算法有多种,可以用GUID_NULL(默认的)、DS3DALG_NO_VIRTUALIZATION基础3D效果,DS3DALG_HRTF_FULL高质量3D效果(用CPU多),DS3DALG_HRTF_LIGHT好的3D效果(CPU比高质量低)

欢迎交流心得!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值