在應用程序中播放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
的函數,必須定義為全局或靜態函數?!?/p>