以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 用DirectSound实现增强的音频特技效果 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=37684) |
-- 作者:卷积内核 -- 发布时间:9/7/2006 3:39:00 PM -- 用DirectSound实现增强的音频特技效果 DirectSound的基本特技。 DirectSound提供8个基本的音频特技。 1、Chorus 和声,这里说的和声不是指很多人合唱,而是指声音的重叠,即通过原声和回声的重叠,使得声音加宽,加厚。 2、Compression 压限,是针对声音不同部分的音量进行增减也就是说,可以对某段音频中音量低于某一限度的部分进行平滑的音量提升(其余部分不变);对音量高于某一限度的部分进行平滑的音量衰减(其余部分不变),或二者同时作用,简单说,就是平衡音量。 3、Distortion 失真。 4、Echo 回声,模拟声音被远处的平面反射回来的效果。 5、Environmental Reverberation反射(混响),简单说就是声音余韵,音源在空间反射出来的声音。适当设置混响,可以更真实、更有现场感的再现声音源,也可以起到修饰、美化的作用。表现宽阔的,传声真实的效果。 6、Flange,一般翻译为波浪特技,用于设置变调效果,通过拷贝失调的声音,或者把某个频率点改变,调节声音分离的时间、音调深度。可以用来产生颤动、急促的声音。 7、Gargle ,咕噜效果处理。一种可以试音源产生咕噜声的调幅处理模式。 8、Parametric Equalizer参数平衡,用于为音频设置参数均衡器。强化或衰减指定的频率。对于增强音乐的效果特别有效。 DiectSound对于每一种特技,都提供了一个接口 ,通过这个接口,我们可以调整特技的参数,接口定义如下: ·IDirectSoundFXChorus8 和声特技接口 ·IDirectSoundFXCompressor8 压限特技接口 ·IDirectSoundFXDistortion8 失真特技接口 ·IDirectSoundFXEcho8 回声特技接口 ·IDirectSoundFXWavesReverb8混响特技接口 ·IDirectSoundFXGargle8 咕噜特技接口 ·IDirectSoundFXParamEq8 参数平衡特技接口 我们可以通过DirectSound缓冲区接口,即IDirectSoundBuffer8的GetObjectInPath方法获得所支持音频特技的接口。 下面先说一下DirectSound中的音频特技实现的过程。 1、首先创建 DirectSound对象和辅助缓冲区,辅助缓冲区一定要设置DSBCAPS_CTRLFX标志。 2、通过辅助缓冲区buffer即IDirectSoundBuffer8的SetFX方法设置特效; 3、IDirectSoundBuffer8的GetObjectInPath方法获得特效的接口; 4、特效接口的SetAllParameters方法设置参数; 5、然后就是通过缓冲区的play方法来播放音频文件。在播放音频的同时我们也可以调整特技的参数。 下面开始我们的例子吧,关于例子的界面很简单,都是通过MFC 自动提供的,我没有做什么修饰,呵呵,我们只关心功能,所以其他的我就不详细讲,具体你可以参见例子代码,例子的源码会随着本文一起发布,例子的界面如下 界面很简单,流程也不复杂,我在这里主要是用来演示如何来实现音频特技的,所以下面我们一起看看如何来实现音频的特技。这里我要说明一下,因为8个特技实现过程基本是一样,所以我这里只是以chorus(回声)特技 举例,其他特技的实现和chorus类似,避免代码重复,就不一一列出,具体的可以参见例子的源码。 第1步: 首先要定义我们用到的一些变量,这里我定义的全是全局的变量,你可以根据自己的情况来定义这些变量。 LPDIRECTSOUNDBUFFER8 g_pDSBuffer8 = NULL; //缓冲区对象 定义完这些变量,就可以开始我们的工作了 第2步 初始化Directsound,获取IDrectSoundBuffer8的接口。这一步骤的工作可以放到程序的初始化的地方。 CoInitialize( NULL ); DSBUFFERDESC dsbd; if( FAILED( hr = lpbuffer->QueryInterface( IID_IDirectSoundBuffer8, (LPVOID*) &g_pDSBuffer8) ) ) 需要注意的几个地方: ·DirectX通过DirectX Media Objects(DMOs)来支持在声音中添加特技。因为特技使用到了COM组件,所以首先要通过CoInitialize()来初始化Com库,当然,你别忘了在退出程序时调用CoUninitialize() 。 ·创建缓冲区的时候,一定不要忘了对 DSBUFFERDESC结构的dwFlages设置DSBCAPS_CTRLFX标志,如果忘了设置这个标志,那么你后面的音频特技全是无效的。但是,在设置这个标志时,buffer一定要处于停止状态并且没有被锁定。在DiectX 9.0中,特技不是依靠硬件来实现的。当然也可以在硬件缓冲区中设置特技,但这样做没有任何的好处。 ·最后一个要注意的问题,就是缓冲区的大小,缓冲区的size过小,特技并不能好好工作,DirectSound建议缓冲区的大小应该在小于150毫秒的数据数据量,缓冲区中使用特技,这个值被定义为DSBSIZ_FX_MIN。 在上面的例子中,waveformat.nAvgBytesPerSec = waveformat.nBlockAlign * waveformat.nSamplesPerSec; = 2*16*4800/8 = 19200 bytes/m 那么dsbd.dwBufferBytes 的最小值应该大于 19200*0.15 = 2880字节。 我刚开始就没有注意这个问题,结果后面总是出错,我一直纳闷不已,因为代码没有问题的,后来重新看了一下帮助才发现这个问题。 第3步 通过缓冲区对象IDirectSoundBuffer8设置缓冲区支持的具体特技,并通过IDirectSoundBuffer8 对象的GetObjectInPath方法获得具体的音频特技的接口;这里以chorus特技为例:如下 DSEFFECTDESC effectdesc; 第4步 通过特效接口的SetAllParameters方法设置参数,手动拖动滑动条,来设置特技参数,可以在例子中看到如下的代码,以chorus为例: void CDsoundEffectDemoDlg::OnEffectChanged() if( ((CButton*)GetDlgItem(IDC_RADIO_TRIANGLE ))->GetCheck() == BST_CHECKED ) if( ((CButton*)GetDlgItem(IDC_RADIO_NEG_180 ))->GetCheck() == BST_CHECKED ) if( g_pChorus) //设置合生特技的参数 break; 注: 在音频播放的同时拖动滑动条调解音频特技的参数,可以随时调整音频特技的效果。 第5步 一切都ok了,下面就是调用IDRIRECTSOUNDBUFFER8 的play函数来播放音频文件了。 DWORD res; g_pDSBuffer8->Lock(0,0,&lplockbuf,&len,NULL,NULL,DSBLOCK_ENTIREBUFFER); 上面讲了Directsound音频特技开发的主要流程,其中的设置音频过程我只是用chorus为例,其实其他的几个特技的使用方法跟chorus很类似,唯一不同的就是参数结构的不同,限于篇幅,对于其他特技的代码就不一一列出了,具体的可一参看本文实例的代码。 下面我们看看每个特技的参数都需要设置什么。 |
-- 作者:卷积内核 -- 发布时间:9/7/2006 3:40:00 PM -- 1、和声(Chorus)特技,参数设置的界面如下: 合声特技的参数通过下面的结构来调整: typedef struct _DSFXChorus { 我们在程序中可以定义这个结构的对象,如下: DSFXChorus g_paramsChorus; 然后通过通过滑动条来设置g_paramsChorus对象的值,设置后可以调用: DSEFFECTDESC effectdesc; 2、压限特技(Compressor ) 压限特技的参数通过下面的结构来调整,参数调整界面如上: typedef struct _DSFXCompressor 我们在程序中可以定义这个结构的对象,如下: LPDIRECTSOUNDFXCOMPRESSOR8 g_pCompressor = NULL; 通过拖动滑动条,我们可以用下面的代码调整参数: DSEFFECTDESC effectdesc;
|
-- 作者:卷积内核 -- 发布时间:9/7/2006 3:41:00 PM -- 3、失真特技(Distorion) 失真特技的参数通过下面的结构来调整: typedef struct _DSFXDistortion 我们在程序中可以定义这个结构的对象,如下: LPDIRECTSOUNDFXDISTORTION8 g_pDistortion = NULL; 通过拖动滑动条,我们可以用下面的代码调整参数: DSEFFECTDESC effectdesc; 4、回声特技( Echo) 回声特技的参数通过下面的结构来调整: typedef struct _DSFXEcho 我们在程序中可以定义这个结构的对象,如下: LPDIRECTSOUNDFXECHO8 g_pEcho = NULL; 通过拖动滑动条,我们可以用下面的代码调整参数: DSEFFECTDESC effectdesc;
|
-- 作者:卷积内核 -- 发布时间:9/7/2006 3:42:00 PM -- 5、波浪特技(Flanger) 波浪特技的参数通过下面的结构来调整: typedef struct _DSFXFlanger 我们在程序中可以定义这个结构的对象,如下: LPDIRECTSOUNDFXFLANGER8 g_pFlanger = NULL; 通过拖动滑动条,我们可以用下面的代码调整参数: DSEFFECTDESC effectdesc; 6、咕噜声效特技(Gargle) 咕噜声效特技的参数通过下面的结构来调整: typedef struct _DSFXGargle 我们在程序中可以定义这个结构的对象,如下: LPDIRECTSOUNDFXGARGLE8 g_pGargle = NULL;
|
-- 作者:卷积内核 -- 发布时间:9/7/2006 3:43:00 PM -- 7、参数平衡特技(ParamEQ) 参数平衡特技的参数通过下面的结构来调整: typedef struct _DSFXParamEq 我们在程序中可以定义这个结构的对象,如下: LPDIRECTSOUNDFXPARAMEQ8 g_pParamEq = NULL; 通过拖动滑动条,我们可以用下面的代码调整参数: DSEFFECTDESC effectdesc; 8、混响(Reverb) 混响特技的参数通过下面的结构来调整: typedef struct _DSFXWavesReverb 我们在程序中可以定义这个结构的对象,如下: LPDIRECTSOUNDFXWAVESREVERB8 g_pReverb = NULL; 通过拖动滑动条,我们可以用下面的代码调整参数: DSEFFECTDESC effectdesc; 结束语: 本文通过一个实例演示了如何使用DirectSound提供的基本音频特技。简单的接口,强大的功能,能给你的程序增色不少。本文的示例代码在windowXP +vc.net下调试通过。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
250.000ms |