在应用程序中播放WAV 文件是常有的事,但是如果没有开启新的线程, 那么在WAV 的播放过程中该程序将停止响应, 直到播放结束。为了解决这个问题,笔者编写了一个CthreadPlayWav 类。
一、源代码如下:
/////////////////////////////////
//
//ThreadPlayWav.h
//
/ *
Purpose: Defines the interface for play wav file
with thread
*/
#ifndef __ThreadPlayWav_H__
#define __ThreadPlayWav_H__
class CThreadPlayWav
{
public:
void SetWavID(CString strWavID)
{m_strWavID= strWavID;}
CString GetWavID(){return m_strWavID;}
void PlayWav();
CThreadPlayWav(){m_strWavID="none";};
protected:
static CString m_strWavID;
CWinThread *m_pThreadPlay;
static UINT ThreadPlay(LPVOID pParam);
};
#endif //__ThreadPlayWav_H__
/////////////////////////////
//
//ThreadPlayWav.cpp
//
#include "stdafx.h"
#include "MMSystem.h"
#include "ThreadPlayWav.h"
CString CThreadPlayWav::m_strWavID;
void CThreadPlayWav::PlayWav()
{
m_pThreadPlay=AfxBeginThread(ThreadPlay,this,
THREAD_PRIORITY_NORMAL);
}
// 参考自anthony petruso 的playwav resource
UINT CThreadPlayWav::ThreadPlay(LPVOID pParam) {
BOOL brtn;
LPCTSTR lpres;
HGLOBAL hres;
HRSRC hresinfo;
HMODULE nl=::AfxGetInstanceHandle ();
// find the wave resource
hresinfo=::FindResource(nl,m_strWavID,"wave");
if(hresinfo == NULL)
return false;
// load the wave resource
hres = ::LoadResource (nl,hresinfo);
if (hres == NULL)
return false;
// lock the wave resource and play it
lpres=(LPCTSTR)::LockResource (hres);
if(lpres==NULL)
return false;
brtn = ::sndPlaySound (lpres,SND_MEMORY | SND_SYNC);
if(brtn == NULL)
return false;
// free the wave resource and return suclearcase/" target="_blank" >ccess or failure
::FreeResource (hres);
return 0;
}
二、使用方法如下:
将需要播放的WAV 文件COPY 至工程的\RES
子目录下, 并在工程的资源文件(rc 文件) 中加入以下格式的内容:WAV
文件标识wave WAV 文件所在的完整路径
例如:mywav wave d:\c\playwav\res\hello.wav;
加入库文件,进入【Project/Settings... 】中的Link 页,在Object/library
modules 中填入winmm.lib;
将ThreadPlayWav.h 和ThreadPlayWav.cpp 复制到工程目录,并用【Project/Add
to project/Files... 】将该两个文件加入工程;
在需要使用CthreadPlayWav 类的代码头部加入#include
"ThreadPlayWav.h";
定义实例,例如:CthreadPlayWav playwav;
用成员函数SetWavID() 设置WAV 文件标识,例如:playwav.SetWavID("mywav");
用成员函数PlayWav() 播放WAV 文件。
三、注释:
m_strWavID WAV 文件标识;
void SetWavID(CString strWavID) 设置WAV 文件标识;
CString GetWavID() 取出WAV 文件标识;
PlayWav() 启动线程,该线程调用ThreadPlay;
ThreadPlay(LPVOID pParam) 真正播放WAV
的函数,必须定义为全局或静态函数。