用线程播放WAV的类

发表于:2007-07-04来源:作者:点击数: 标签:
上海大学 夏伟频 在应用程序中播放WAV 文件是常有的事,但是如果没有开启新的线程, 那么在WAV 的播放过程中该程序将停止响应, 直到播放结束。为了解决这个问题,笔者编写了一个CthreadPlayWav 类。 一、源代码如下: ///////////////////////////////// // //
上海大学 夏伟频

  在应用程序中播放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 的函数,必须定义为全局或静态函数。 

原文转自:http://www.ltesting.net