




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微软所供给开发工具包括一系列专为玩耍和交互DircetXDirectSound以及Direct3Dsound音频媒体的程序设计人员开发的强有力的工具。DirectX充分利用了声音加速硬件以尽可能的提高其运行速度,削减CPU的占用时间。但是,音频信号仍旧对整个系统的运行产生着重大影响。本文所描述的技术将帮助用户使用DirectSound以及Direct3DSound以削减音频重放对系统运行的影响。前言DirectX波形声音重放设备是为支持在Windows95WindowsNT中开发玩耍和交互媒体应用程序而设计的。DirectSound和Direct3DSound允许你在同一个三维空间中同时运行多个CPU的使用。但这并不是说你可在三维程序空间运行、编译充满着大量声音代码的程序,并且随心所欲地将其移来44.1khz,16位立体声的美丽声音所占去。技巧和技术首先,我们来谈谈一些有关的定义。你所生疏的DirectSound包括以下一些术语:从缓冲区:有自己特定的格式。主缓冲区:是DirectSound的输出缓冲区。一般说来,应用程序并非将波形数据直接写入主缓冲区。相反,DirectSound首先在从缓冲区中将波形数据加以合成,然后输入主缓冲区中。留意:仅有一个主缓冲区,并且其格式打算了其输出格式。静态缓冲区:他们对于用户格外便利。静态缓冲区通过声卡的合成加速执行。流缓冲区:用户必需周期性的在声音缓冲区中写入数据。但是,流缓冲区不能在硬件中进展声音合成。DirectSoundDirectSound元件负责从缓冲区中将声音中按位隔行合成。然后执行诸如:音量大小、均衡调整〔左右声道平衡、频率转换,以及三维操纵等操作。当合成器不能识别〔不同于上面所述的任一掌握操作DirectSound的CPU核心所要做的。一些运行问题将在“DirectSound合成器发生了什么状况”的工程中加以争论。下面的关于合成器和主、从缓冲区之间关系的示意图,将使读者清楚地了解他们之间的关系。图通过一个简洁的示意图说明缓冲区和DirectSound合成器之间的关系DirectSound开发小组成员见到上面的示意图,他们将对此不屑一顾。由于,合成器远比上图所展现的优秀。上图中,我并没有任何与合成器相关的三维组件,以及其他类型的进程。DirectSound功能的一个技术列表。奇异使用声音的技巧;在主缓冲区中使用一样的格式;将主缓冲区设置为最低存储速率的格式;在短促频繁的无声时间间隔内连续地使用主缓冲区;尽可能地使用硬件进展声音合成;最大限度的保证掌握变换;使用延时的三维进程命令;一.奇异使用声音的技巧DirectSound的最为优秀的特征之一就是独立演奏、掌握多声道音频信号的力量。一旦声音的设计者真正地把握了它们,那么,真可以称得上是一本万利。唯一的花费只是CPU指令周期。每个你所使用的从缓冲区都将消耗CPU指令周期。每一次诸如频率量化等的进程操作都将带来CPU指令周期的额外消耗。三维声CPU指令周期。这些读者能够想象得到吗?你应当同你的声音设计者坐下来一起探讨一下全方位地利用声音演奏带来的猛烈震撼〔假设你自己本身就渴望以久的经受传递给用户的过程中起着最为重要的作用。当可能削减从缓冲区的使用时,请承受声音预混技术。例如:假设你正在一个声道中仿照蟋蟀的低吟,而在另一个声道中记录了田蛙的欢唱以衬托出夏夜的气氛时,请将它们合成到一个声道中。假设在你的脑海中有应用程序的初步方案,并且在以后将对其进展折衷处理的时候,你应当对该进程进展Beatles的Sgt.Pepper”sLonelyHeartsClubBand就是一个有创意的宏大杰作。它被记录在一盘四声道盒式录音带中。与此形成比照,现代的音频记录设备供给了至少四十八个声道,并能供给真正的可用来进展有用合成的无MIDI序列发生器。二.在主缓冲区中使用一样的数据格式合成器将每个从缓冲区中的数据转换为主缓冲区的数据格式,这种数据的转换是在数据进入主缓冲区的合成过程中实现的,它也将占用CPU周期。你可以在保证从缓冲区〔例如波形文件〕和主缓冲区具有一样的数据格式的前提下消退这笔开销。事实上,正是由于DirecSound的这种格式转换方式,你所要做的仅仅是比照样例速率和声道数,即使样例速率〔8位或16位〕存在一些差异也没有关系,由于它唯一的后果只是降低主缓冲区的数据存取速率。DMA方式将声音数据从系统内存移动到当地缓冲区中,处理器在进展内存读写之前将被迫等待DMACPUISA总线声卡,上述的数据传送方式无疑将对系统的运行产生不行回避的影响,但并不会对型的32位PCI卡产生任何影响。对于DirectSound,DMA数据传输的影响直接关系到数据的输出速率以及主缓冲区的访问速率。我曾听说传输正是影响DirectSound运行的最大因素。值得庆幸的是,上述问题在你无法顺当执行时格外简洁处理。试验说明,削减数据存取速率的最好方法是转变主缓冲区中的数据格式。这里的转换格外明显,运行转变了声音的品质,要转变主缓冲区中的数据格式,只需调用方法IDirectSoundBuffer::Setformat,但不要忘记:你的协作层设置成DSSCL.PRIOR99vY 或DSSCL_EXCLUSIVE,以避开主缓冲区的消耗。三.在无声时间间隔中连续使用主缓冲区DMA同时从另一个方面影响着系统的运行。当没有声音播放时,DirectSound停顿了合成器的工作和DMA的活动。假设你的程序中存在着短促频繁的无声时间间隔,在每次声音播放时使合成随声音播放时的连续而起起停停,将比你让合成器始终处于连续的工作状态的状况更糟。在这种状况下,你可以在主缓冲区中强制性的调用方法PLAY使合成器处于激活状态。这样,即使在没有声音播放时,合成器也将连续工作。STOP。四.使用硬件进展声音合成DirectSound窍门将允许你尽量使用硬件合成。在你进展硬件声音合成时使用静态缓冲区。DirectSound为你用得最多的声音文件建立声音缓冲区〔可用来进展声音硬件合成的合成器是有肯定的限度的。IDirectSound::GetCaps打算声音加速硬件支持何种格式,并尽可能的承受这声音文件。当你调用CreatSoundBuffer建立从缓冲区时,你得建立静态缓冲区,在构造DSBUFFERDESC的dwPlag区DSBCAPS_LOCHARDWARE标志将缓冲区的数据进展强制性的硬件合成。但是,硬件合成所要使用的资源不行用时,CreatSoundBuffer就将出错。方法IDirectSound::GetCaps为我们供给了关于声音加速力量的详尽描述,这对于我们进展存取操作有很大GetCapsDirectX文档中查看构造DSAPS和标志DSCAPS.dwFlags可使我们准确了解到一些系统的有用信息。五.最低限度的进展声音掌握变换在从合成器中转变均衡、音量或频率也将影响到应用程序的运行。为了防止声音输出时的中断的产生,DirectSound20100毫秒,甚至更多的时间进展声音合成。当你进展声音掌握变换时,合成器不得不刷正在进展的声音合成的缓冲区的信息,重合成以适应适应的变化。比较好的方法是尽量削减送入系统的掌握转变次数。这在按流或群输入时显得尤为重要。同时,我们应尽量削减日常的调用SetPan一次,而不是每帧两次。〕DirectSound合成器在其从前进展合成的缓冲区中重合成。但是,你也可以将一系列三维掌握变换集合在一组中,这将只使DirectSound合成器只进展一次重合成。请认真阅读以下关于延时掌握变换具体说明的章节。六.使用延时三维进程命令正如我在前面所说的那样,三维声音将比常规声音花费更多的CPU指令周期。这是由于在每一个合成周期内,为计算出三维立体声音效将占用更多的CPU指令周期。你应当尽可能地削减使用三维立体声,最好不要使用那些并不对你真正有用的三维声音。这是通过实践得出的在你运行程序时影响整个系统工作的另一因素。在设计你的应用程序时,你应当尽早进展尝试,使其更加简洁使声音具有或没有三维效果。你也可以调用具有DS3DMODE_DISABLEIDirectSound::SetMode,使得三维进程能够在三维缓冲区中运行。转变三维声音缓冲区以及听众进展的诸如对方位、速度、多普勒因子的操作,都将引起DirectSound合成器重合成从前合成缓冲区中的信息,固然,这将铺张肯定的CPU指令周期。为了使三维设置的转变对系统运行的影响降低到最小程度你就应当使用延时三维进程命令这是DirectSound三维声音组件所特有的特征为了使用三维延时进程命令,请设定每个三维设置变换〔 SetPosition,SetVelocity等等〕中的方法IDirect3DListener或Direct3DSoundBuffer的dwApply参数的DS3DMODE_DISABLE标志并且将全部的这些变化制成一帧,随后,再调用IDirect3DListener::CommitDeferredSettings去执行全部的延时命令,在从前的合成缓冲区中进展一次重合成。结论DirectX优化音频媒体的特别工具。我所能赐予你的最好的建议是:设计你的支持运行、监视和音量调整的音频子系统。毫无疑问,你必需保证你有充分的时间等待你的程序的运行!假设你从一开头就将程序运行的协调性考虑进去,这个任务将变得更加简洁。#include<windows.h>#include<stdio.h>#include<dsound.h>#include“resource.h“#pragmacomment(lib,“dxguid.lib“)#pragmacomment(lib,“dsound.lib“)#pragmawarning(disable:4996)#defineSafe_Release(p)if((p))(p)->Release;//.WAVfileheaderstructWAVE_HEADER{charlongriff_sig[4];waveform_chunk_size;////”RIFF”8charwave_sig[4];//”WAVE”char)format_sig[4];//”fmt”(noticespaceafterlongformat_chunk_size;//16;shortformat_tag;//WAVE_FORMAT_PCMshortchannels;//#ofchannelslongsample_rate;//samplingratelongbytes_per_sec;//bytespersecondshortblock_align;//sampleblockalignmentshortbits_per_sample;//bitspersecondchar data_sig[4]; //”data”long data_size; //sizeofwaveformdata};//windowhandles,classandcaptiontext.HWNDg_hwnd;charg_class_name[]=“WavPlayClass“;IDirectSound8*g_ds;//directsoundcomponentIDirectSoundBuffer8*g_ds_buffer;//soundbufferobject//---------------------------------------------------------------//Createwaveheaderinformationfromwavefile.//---------------------------------------------------------------IDirectSoundBuffer8*Create_Buffer_From_WAV(FILE*fp,WAVE_HEADER*wave_header){IDirectSoundBuffer* ds_buffer_main;IDirectSoundBuffer8* ds_buffer_second;DSBUFFERDESC ds_buffer_desc;WAVEFORMATEX wave_format;//readintheheaderfrombeginningoffilefseek(fp,0,SEEK_SET);fread(wave_header,1,sizeof(WAVE_HEADER),fp);//checkthesigfields.returningifanerror.if(memcmp(wave_header->riff_sig,“RIFF“,4)||memcmp(wave_header->wave_sig,“WAVE“,4)||memcmp(wave_header->format_sig,“fmt“,4)||memcmp(wave_header->data_sig,“data“,4)){returnNULL;}//setuptheplaybackformatZeroMemory(&wave_format,sizeof(WAVEFORMATEX));wave_format.wFormatTag=WAVE_FORMAT_PCM;wave_format.nChannels=wave_header->channels;wave_format.nSamplesPerSec=wave_header->sample_rate;wave_format.wBitsPerSample=wave_header->bits_per_sample;wave_format.nBlockAlign =wave_format.wBitsPerSample/8*wave_format.nChannels;wave_format.nAvgBytesPerSec=wave_format.nSamplesPerSec*wave_format.nBlockAlign;//createthesoundbufferusingtheheaderdataZeroMemory(&ds_buffer_desc,sizeof(DSBUFFERDESC));ds_buffer_desc.dwSize=sizeof(DSBUFFERDESC);ds_buffer_desc.dwFlags=DSBCAPS_CTRLVOLUME;ds_buffer_desc.dwBufferBytes=wave_header->data_size;ds_buffer_desc.lpwfxFormat=&wave_format;//createmainsoundbufferif(FAILED(g_ds->CreateSoundBuffer(&ds_buffer_desc,&ds_buffer_main,NULL)))returnNULL;//getnewerinterfaceif(FAILED(ds_buffer_main->QueryInterface(IID_IDirectSoundBuffer8,(void**)&ds_buffer_second))){ds_buffer_main->Release;returnNULL;}//returntheinterfacereturnds_buffer_second;}//---------------------------------------------------------------//Loadsounddatafromseconddirectsoundbuffer.//---------------------------------------------------------------BOOLLoad_Sound_Data(IDirectSoundBuffer8*ds_buffer,longlock_pos,longlock_size,FILE*fp){BYTE*ptr1;BYTE*ptr2;DWORDsize1,size2;if(lock_size==0)returnFALSE;//lockthesoundbufferatpositionspecifiedif(FAILED(ds_buffer->Lock(lock_pos,lock_size,(void**)&ptr1,&size1,(void**)&ptr2,&size2,0)))returnFALSE;//readinthedatafread(ptr1,1,size1,fp);if(ptr2!=NULL)fread(ptr2,1,size2,fp);//unlockitds_buffer->Unlock(ptr1,size1,ptr2,size2);returnTRUE;}//---------------------------------------------------------------//Loadwavefile.//---------------------------------------------------------------IDirectSoundBuffer8*Load_WAV(char*filename){IDirectSoundBuffer8*ds_buffer;WAVE_HEADERwave_header={0};FILE*fp;//openthesourcefileif((fp=fopen(filename,“rb“))==NULL)returnNULL;//createthesoundbufferif((ds_buffer=Create_Buffer_From_WAV(fp,&wave_header))==NULL){fclose(fp);returnNULL;}//readinthedatafseek(fp,sizeof(WAVE_HEADER),SEEK_SET);//loadsounddataLoad_Sound_Data(ds_buffer,0,wave_header.data_size,fp);//closethesourcefilefclose(fp);//returnthenewsoundbufferfullyloadedwithsoundreturnds_buffer;}//---------------------------------------------------------------//Windowprocedure.//---------------------------------------------------------------longWINAPIWindow_Proc(HWNDhwnd,UINTmsg,WPARAMwParam,LPARAMlParam){switch(msg){caseWM_DESTROY:PostQuitMessage(0);return0;}return(long)DefWindowProc(hwnd,msg,wParam,lParam);}//---------------------------------------------------------------//Mainfunction,routineentry.//---------------------------------------------------------------intWINAPIWinMain(HINSTANCEinst,HINSTANCE,LPSTRcmd_line,intcmd_show){WNDCLASS win_class;MSG msg;//createwindowclassandregisteritwin_class.style=CS_HREDRAW|CS_VREDRAW;win_class.lpfnWndProc=Window_Proc;win_class.cbClsExtra=0;win_class.cbWndExtra=DLGWINDOWEXTRA;win_class.hInstance=inst;win_class.hIcon=LoadIcon(inst,IDI_APPLICATION);win_class.hCursor=LoadCursor(NULL,IDC_ARROW);win_class.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);win_class.lpszMenuName=NULL;win_class.lpszClassName=g_class_name;if(!RegisterClass(&win_class))returnFALSE;//createthemainwindowg_hwnd=CreateDi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度集体鱼塘承包与渔业可持续发展合作协议
- 计算机技术与软件资格初级独家试题及答案
- 二零二五年度反担保合同汇编:文化产业项目资金安全保障
- 软件技术初级资格考试点评与总结试题及答案
- 2025年度消防安全管理服务合同补充协议样本
- 2025年茶艺师岗位职责试题及答案
- 二零二五年度智慧城市建设企业高管聘用与智能技术合同
- 二零二五年度农村土地承包经营权流转及农业废弃物资源化利用与农村基础设施建设合同
- 二零二五年度月嫂雇佣合同书-产妇月子期间专业护理与生活照料协议
- 2025年健康管理师考试全攻略:试题及答案
- 电力系统应急物资储备手册
- 新生儿呼吸窘迫综合征的防治-欧洲共识指南2024版解读
- 中考语文试题双向细目表
- 新概念动能武器-电磁炮
- 小学三年级数学应用题大全(500题)
- 电梯安全检测招标文件
- GB/T 44131-2024燃料电池电动汽车碰撞后安全要求
- NB-T35016-2013土石筑坝材料碾压试验规程
- 2024年华勤技术股份有限公司校园招聘考试试题及参考答案
- 医疗用品线上线下融合模式探索
- 福建省住宅建筑生活供水工程技术规程
评论
0/150
提交评论