• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

用线程播放WAV的类

发布: 2007-7-04 20:47 | 作者: admin | 来源:  网友评论 | 查看: 33次 | 进入软件测试论坛讨论

领测软件测试网 上海大学 夏伟频

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

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网