函数PlaySound和sndPlaySound的用法(delphi).doc_第1页
函数PlaySound和sndPlaySound的用法(delphi).doc_第2页
函数PlaySound和sndPlaySound的用法(delphi).doc_第3页
函数PlaySound和sndPlaySound的用法(delphi).doc_第4页
函数PlaySound和sndPlaySound的用法(delphi).doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

函数PlaySound和sndPlaySound的用法2008年07月11日 星期五 08:57一.PlaySound函数的声明为:BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);1.参数pszSound:是指定了要播放声音的字符串,该参数可以是WAVE文件的名字,或是WAVE资源的名字,或是内存中声音数据的指针,或是在系统注册表WIN.INI中定义的系统事件声音.如果该参数为NULL则停止正在播放的声音.2.参数hmod:是应用程序的实例句柄,当播放WAV资源时要用到该参数,否则它必须为NULL.3.参数fdwSound: 是标志的组合,如下表所示。若成功则函数返回TRUE,否则返回FALSE。二播放标志以及含义:SND_APPLICATION用应用程序指定的关联来播放声音。SND_ALIASpszSound参数指定了注册表或WIN.INI中的系统事件的别名。SND_ALIAS_IDpszSound参数指定了预定义的声音标识符。SND_ASYNC用异步方式播放声音,PlaySound函数在开始播放后立即返回。SND_FILENAMEpszSound参数指定了WAVE文件名。SND_LOOP重复播放声音,必须与SND_ASYNC标志一块使用。SND_MEMORY播放载入到内存中的声音,此时pszSound是指向声音数据的指针。SND_NODEFAULT不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。SND_NOSTOPPlaySound不打断原来的声音播出并立即返回FALSE。SND_NOWAIT如果驱动程序正忙则函数就不播放声音并立即返回。SND_PURGE停止所有与调用任务有关的声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。SND_RESOURCEpszSound参数是WAVE资源的标识符,这时要用到hmod参数。SND_SYNC同步播放声音,在播放完后PlaySound函数才返回。三函数使用方法及代码:注意:在使用函数前要加入:#include mmsystem.h/导入声音头文件#pragma comment(lib,winmm.lib)/导入声音头文件库直接播出声音文件:PlaySound(c:win95mediaThe Microsoft Sound.wav, NULL, SND_FILENAME | SND_ASYNC);注意:参数中的路径使用两个连续的反斜杠转义代表一个反斜杠。把声音文件加入到资源中,然后从资源中播放声音:Visual C+支持WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框中选择The Microsoft Sound.wav文件,则该文件就会被加入到WAVE资源中。假定声音资源的ID为IDR_STARTWIN,则下面的调用同样会输出启动声音:PlaySound(LPCTSTR)IDR_STARTWIN, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);或:PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);/将声音文件写入到程序中用PlaySound播放系统声音:Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:PlaySound(SystemStart,NULL,SND_ALIAS|SND_ASYNC);/sndPlaySound函数的声明为:BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);用法:除了不能指定资源名字外,参数lpszSound与PlaySound的是一样的。参数fuSound是如何播放声音的标志,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的组合,这些标志的含义与PlaySound的一样。可以看出,sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用:sndPlaySound(“MYSOUND.WAV”,SND_ASYNC);VC+中播放声音的方法发布者:soarlove声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。在VC+中可以根据不同的应用要求,用不同的方法实现声音的播放。一播放声音文件的简单方法在VC+中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC+中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound );或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名,hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC+中的帮助。例如播放C:soundmusic.wav可以用sndPlaySound (c:soundmusic.wav,SND_ASYNC);或PlaySound(c:soundmusic.wav,NULL, SND_ASYNC|SND_NODEFAULT );如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音二将声音文件加入到程序中在VC+的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC+也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.WAV文件的声音播放。要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为IDR_WAVE1。在播放时只需要调用下面的语句:PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,SND_RESOURCE是必须的标志。作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下:1获得包含资源的模块句柄:HMODULE hmod=AfxGetResourceHandle();2检索资源块信息:HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T(WAVE);3.装载资源数据并加锁:HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);4播放声音文件:sndPlaySound(lpMemSound,SND_MEMORY);5释放资源句柄:FreeResource(hGlobalMem);三播放声音文件的高级方法在VC+中提供了一组对音频设备及多媒体文件直接进行操作的函数。利用这些函数可以灵活地对声音文件进行各种处理。首先介绍几个要用到的数据结构。WAVEFORMATEX结构定义了WAVE音频数据文件的格式。WAVEHDR结构定义了波形音频缓冲区。读出的数据首先要填充此缓冲区才能送音频设备播放。WAVEOUTCAPS结构描述了音频设备的性能。MMCKINFO结构包含了RIFF文件中一个块的信息。详细的说明请参考VC+中的帮助。下面给出程序流程简图及程序源代码清单,在VC+环境下可直接使用:源程序清单如下:LPSTR szFileName;/声音文件名MMCKINFO mmckinfoParent;MMCKINFO mmckinfoSubChunk;DWORD dwFmtSize;HMMIO m_hmmio;/音频文件句柄DWORD m_WaveLong;HPSTR lpData;/音频数据HANDLE m_hData;HANDLE m_hFormat;WAVEFORMATEX * lpFormat;DWORD m_dwDataOffset;DWORD m_dwDataSize;WAVEHDR pWaveOutHdr;WAVEOUTCAPS pwoc;HWAVEOUT hWaveOut;/打开波形文件if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)/File open ErrorError(Failed to open the file.);/错误处理函数return false;/检查打开文件是否是声音文件mmckinfoParent.fccType =mmioFOURCC(W,A,V,E);if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF)/NOT WAVE FILE AND QUIT/寻找fmt块mmckinfoSubChunk.ckid =mmioFOURCC(f,m,t, );if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)/Cant find fmt chunk/获得fmt 块的大小,申请内存dwFmtSize=mmckinfoSubChunk.cksize ;m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize);if(!m_hFormat)/failed alloc memorylpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);if(!lpFormat)/failed to lock the memoryif(unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)/failed to read format chunk/离开fmt块mmioAscend(m_hmmio,&mmckinfoSubChunk,0);/寻找data块mmckinfoSubChunk.ckid=mmioFOURCC(d,a,t,a);if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)/Cant find data chunk/获得data块的大小m_dwDataSize=mmckinfoSubChunk.cksize ;m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;if(m_dwDataSize=0L)/no data in the data chunk/为音频数据分配内存lpData=new charm_dwDataSize;if(!lpData)/faileif(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)0)/Failed to read the data chunkm_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);if(m_WaveLong0)/Failed to read the data chunk/检查音频设备,返回音频输出设备的性能if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS)!=0)/Unable to allocate or lock memory/检查音频输出设备是否能播放指定的音频文件if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)/Failed to OPEN the wave out devices/准备待播放的数据pWaveOutHdr.lpData =(HPSTR)lpData;pWaveOutHdr.dwBufferLength =m_WaveLong;pWaveOutHdr.dwFlags =0;if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR)!=0)/Failed to prepare the wave data buffer/播放音频数据文件if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR)!=0)/Failed to write the wave data buffer/关闭音频输出设备,释放内存wave

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论