113E博章

       登录 /注册
首页 一算子网 发布
分类 :c++/vc

一個簡單的錄音放音程序 C+/VC

[ 2008-7-30 22:37:00 | 发表者 : zihe ]

/*這是以前寫的一個簡單的錄音程序(是dll文件).在此備份.調用時需要映射這幾個消息:

 on_message(mm_wim_open,mmwimopen)
 on_message(mm_wim_data,mmwimdata)
 on_message(mm_wim_close,mmwimclose)
 on_message(mm_wom_close,mmwomclose)
 on_message(mm_wom_open,mmwomopen)
 on_message(mm_wom_done,mmwomdone)
*/

/* .h*/

#include "windows.h"
#include "mmsystem.h"

#pragma comment(lib,"winmm.lib")
#ifdef wavefileex_exports
#define wavefileex_api __declspec(dllexport)
#else
#define wavefileex_api __declspec(dllimport)
#endif


// 森濬岆植 wavefileex.dll 絳堤腔
class wavefileex_api cwavefileex {
public:
 cwavefileex(void);
 cwavefileex(hwnd hwnd);
 ~cwavefileex();
 /* wave length*/
 dword getwavelen_size();
 dword getwavelen_time();
 /* record */
 bool recordwav(lpstr filename,int devno);
 bool stoprecordwav();
 bool playwav(lpstr filename,int sounddevno = -1);
 bool stopplaywav();
 /* select devno */
 void selectdevno(int devno);
 void pausewav();
 /* call back function wavein*/
 void mmwimopen();
 void mmwimdata(wparam wparam,lparam lparam);
 void mmwimclose();
 /* call back function waveout */
 void mmwomopen();
 void mmwomdone(wparam wparam,lparam lparam);
 void mmwomclose();
 /* the handle of play wave */
 void setwnd(hwnd hwnd);
protected:
 bool createwavefile(void);
 void getlasterrormsg(lpctstr flag);
 
 bool write(char* data,dword dwlen);
 void close();

private:
 char m_filename[256];
 waveformatex m_waveformat;
 dword m_wavelength;
 dword dwdatalength;

 hwavein m_hwi;
 hwaveout m_hwo;
 handle m_hfile;
 int m_devno;
 hwnd m_hwnd;
 mmckinfo m_mminfoparent;
 mmckinfo m_mminfochild;

 pwavehdr pwavehdr1 ;
 pwavehdr pwavehdr2;
 wavehdr waveouthdr;
 hmmio m_hm;
 hmmio m_hmmio;
 char* lpdwdata;
 byte* pbuf1;
 byte* pbuf2;
 dword m_dwsize;
 char* psavebuffer;
 char* pnewbuffer;
};

/*

.cpp

*/

#include "stdafx.h"
#include "wavefileex.h"
#include "windows.h"
#include "assert.h"
#include "tchar.h"
#include <malloc.h>

#pragma comment(lib,"user32.lib")

bool apientry dllmain( handle hmodule,
                       dword  ul_reason_for_call,
                       lpvoid lpreserved
      )
{
 switch (ul_reason_for_call)
 {
 case dll_process_attach:
 case dll_thread_attach:
 case dll_thread_detach:
 case dll_process_detach:
  break;
 }
    return true;
}

/* 蚚懂翹秞 凳婖勤砓*/
cwavefileex::cwavefileex(hwnd hwnd)
{
 assert(hwnd);
 m_hwnd = hwnd;
 m_devno = -1;
 strcpy(this->m_filename,"");
 m_hfile = 0x00;
 m_hwi   = 0x00;
 m_hwo   = 0x00;
 lpdwdata = 0x00;
 /* */
 m_waveformat.wformattag=wave_format_pcm;
 m_waveformat.nchannels=1;
 m_waveformat.nsamplespersec=8000;
 m_waveformat.navgbytespersec=8000;
 m_waveformat.nblockalign=1;
 m_waveformat.wbitspersample=8; //硌隅翹秞跡宒
 m_waveformat.cbsize=0;

 m_dwsize = 10240;
 m_hmmio = 0x00;
 psavebuffer = 0x00;
 pnewbuffer  = 0x00;

 pwavehdr1 =(wavehdr*)malloc(sizeof(wavehdr));
 pwavehdr2 =(wavehdr*)malloc(sizeof(wavehdr));
 pbuf1 = 0x00;
 pbuf2 = 0x00;

}
/* 蚚懂畦溫 凳婖勤砓*/
cwavefileex::cwavefileex()
{
 m_devno = -1;
 strcpy(this->m_filename,"");

 m_hfile = 0x00;
 m_hwi   = 0x00;
 m_hwo   = 0x00;
 lpdwdata = 0x00;
 /* */
 m_waveformat.wformattag=wave_format_pcm;
 m_waveformat.nchannels=1;
 m_waveformat.nsamplespersec=8000;
 m_waveformat.navgbytespersec=8000;
 m_waveformat.nblockalign=1;
 m_waveformat.wbitspersample=8; //硌隅翹秞跡宒
 m_waveformat.cbsize=0;
 pwavehdr1 =(wavehdr*)malloc(sizeof(wavehdr));
 pwavehdr2 =(wavehdr*)malloc(sizeof(wavehdr));
 pbuf1 = 0x00;
 pbuf2 = 0x00;

 m_hmmio = 0x00;
}
cwavefileex::~cwavefileex()
{
 stopplaywav();
 free(pwavehdr1);
 free(pwavehdr2);
 if(pbuf1 != 0x00)
 {
  delete[] pbuf1;
 }
 if(pbuf2 != 0x00)
  delete[] pbuf2;
 pbuf1 = 0x00;
 pbuf2 = 0x00;
}

void cwavefileex::getlasterrormsg(lpctstr flag)
{
 lpvoid lpmsgbuf;
 formatmessage(format_message_allocate_buffer |
   format_message_from_system |
   format_message_ignore_inserts,
   null,
   getlasterror(),
   makelangid(lang_neutral,
    sublang_default), // default language
   (lptstr) &lpmsgbuf,
   0,
   null );
 messagebox(null,(lpctstr)lpmsgbuf,flag,0);
}
void cwavefileex::selectdevno(int devno)
{
 m_devno = devno;
}
dword cwavefileex::getwavelen_size()
{
 return m_wavelength;
}
dword cwavefileex::getwavelen_time()
{
 return m_wavelength/8000;
}
bool cwavefileex::recordwav(lpstr filename,int devno)
{
 mmresult hr = 0x00;
 assert(filename);
 strcpy(m_filename,filename);
 this->m_devno = devno;

 int devcount = waveingetnumdevs();
 assert(devcount>0);
 assert(devno<devcount);
 hr = waveinopen(&m_hwi,m_devno,
     &m_waveformat,
     (dword)m_hwnd,
     0,
     callback_window);
 if(hr != mmsyserr_noerror )
 {
  messagebox(null,_t("wave in open failed!"),_t("error"),0);
  return false;
 }
 pbuf1 =new byte[m_dwsize];
 if(pbuf1 == null)
  return false;
 if(!pwavehdr1)
  return false;

 pwavehdr1->lpdata = (char*)pbuf1;
 pwavehdr1->dwbufferlength=m_dwsize;
 pwavehdr1->dwbytesrecorded=0;
 pwavehdr1->dwuser=0;
 pwavehdr1->dwflags=0;
 pwavehdr1->dwloops=1;
 pwavehdr1->lpnext=null;
 pwavehdr1->reserved=0;
 
 pbuf2 =new byte[m_dwsize];
 if(pbuf2 == null)
  return false;
 if(!pwavehdr2)
  return false;

 pwavehdr2->lpdata = (char*)pbuf2;
 pwavehdr2->dwbufferlength=m_dwsize;
 pwavehdr2->dwbytesrecorded=0;
 pwavehdr2->dwuser=0;
 pwavehdr2->dwflags=0;
 pwavehdr2->dwloops=1;
 pwavehdr2->lpnext=null;
 pwavehdr2->reserved=0;

 if(!m_hwi)
  return false;
 waveinprepareheader(m_hwi,pwavehdr1,sizeof(wavehdr));
 waveinprepareheader(m_hwi,pwavehdr2,sizeof(wavehdr));
 
 return true;
}

bool cwavefileex::createwavefile(void)
{
 try
 {
  if(this->m_hmmio)
  {
   m_hmmio = 0x00;
  }
  this->m_hmmio = ::mmioopen(this->m_filename,null, mmio_create|mmio_write|mmio_exclusive | mmio_allocbuf);
  if(this->m_hmmio == null)
   return false;
  zeromemory(&m_mminfoparent,sizeof(m_mminfoparent));
  m_mminfoparent.fcctype = mmiofourcc(´w´,´a´,´v´,´e´);

  mmresult mmresult = mmiocreatechunk(this->m_hmmio,&m_mminfoparent,mmio_createriff);
  if(mmresult ==mmioerr_cannotseek)
  {
   getlasterrormsg("mmiofourcc(\"wave 1\")");
   return false;
  }
  if(mmresult ==mmioerr_cannotwrite)
  {
   getlasterrormsg("mmiofourcc(\"wave 2\")");
   return false;
  }

  zeromemory(&m_mminfochild,sizeof(m_mminfochild));
  m_mminfochild.ckid = mmiofourcc(´f´,´m´,´t´,´ ´);
  m_mminfochild.cksize = sizeof(waveformatex)+ m_waveformat.cbsize;

  mmresult = mmiocreatechunk(this->m_hmmio,&m_mminfochild,0);
  if(mmresult ==mmioerr_cannotseek)
  {
   getlasterrormsg("mmiofourcc(\"fmt  1\")");
   return false;
  }
  if(mmresult ==mmioerr_cannotwrite)
  {
   getlasterrormsg("mmiofourcc(\"fmt  2\")");
   return false;
  }
  mmresult = mmiowrite(this->m_hmmio,(char*)&this->m_waveformat, sizeof(waveformatex) + this->m_waveformat.cbsize);
  if(mmresult == -1)
  {
   getlasterrormsg("mmiowrite");
   return false;
  }
  mmresult = mmioascend(this->m_hmmio,&m_mminfochild,0);
  if(mmresult == mmioerr_cannotseek)
  {
   getlasterrormsg("mmioascend _seek");
   return false;
  }
  if(mmresult ==mmioerr_cannotwrite )
  {
   getlasterrormsg("mmioascend _write");
   return false;
  }
  m_mminfochild.ckid = mmiofourcc(´d´,´a´,´t´,´a´);
  mmresult = mmiocreatechunk(this->m_hmmio,&m_mminfochild,0);
  if(mmresult ==mmioerr_cannotseek)
  {
   getlasterrormsg("mmiofourcc(\"data 1\")");
   return false;
  }
  if(mmresult ==mmioerr_cannotwrite)
  {
   getlasterrormsg("mmiofourcc(\"data 2\")");
   return false;
  }
  
  return true;
 }
 catch(...)
 {
  return false;
 }

}
bool cwavefileex::write(char* data,dword dwlen)
{
 dword len= 0;
 len = mmiowrite(this->m_hmmio,data,dwlen);
 if(len <=0 )
  return false;
 
 return true;
}
void cwavefileex::mmwimopen()
{
 try
 {
  psavebuffer = new char[1];
  if(psavebuffer == null)
   return;
  dwdatalength = 0;
  waveinaddbuffer(m_hwi,pwavehdr1,sizeof(wavehdr));
  waveinaddbuffer(m_hwi,pwavehdr2,sizeof(wavehdr));
  waveinstart(m_hwi);
 }
 catch(...)
 {
 }
}
void cwavefileex::mmwimdata(wparam wparam,lparam lparam)
{
 dword numofwritten = 0x00;
 pnewbuffer =(char *) realloc(psavebuffer,
      dwdatalength+((pwavehdr)lparam)->dwbytesrecorded);
 if(pnewbuffer!=null)
 {
  try
  {
   psavebuffer=pnewbuffer;

   copymemory(psavebuffer+dwdatalength,((pwavehdr)lparam)->lpdata,
      ((pwavehdr)lparam)->dwbytesrecorded);
   dwdatalength+=((pwavehdr)lparam)->dwbytesrecorded;

   createwavefile();
   write(psavebuffer,dwdatalength);
   close();
   waveinaddbuffer(m_hwi,(pwavehdr)lparam,sizeof(wavehdr));
  }
  catch(...)
  {
  }
 }
 else
 {
  waveinclose(m_hwi);
 }
}
void cwavefileex::mmwimclose()
{
 waveinunprepareheader(m_hwi,pwavehdr1,sizeof(wavehdr));
 waveinunprepareheader(m_hwi,pwavehdr2,sizeof(wavehdr));
 waveinreset(m_hwi);
 waveinclose(m_hwi);
}
bool cwavefileex::stoprecordwav()
{
 try
 {
  waveinstop(m_hwi);

  if(pbuf1 != 0x00)
   delete[] pbuf1;
  if(pbuf2 != 0x00)
   delete[] pbuf2;
  pbuf1 = 0x00;
  pbuf2 = 0x00;
  return true;
 }
 catch(...)
 {
  return false;
 }
}
bool cwavefileex::playwav(lpstr filename,int sounddevno)
{
 mmckinfo mmckinfoparent;
 mmckinfo mmckinfosubchunk;
 mmresult _mr;
 dword _dwfmtsize = 0x00;
 assert(filename);
 int devcount = waveoutgetnumdevs();
 assert(sounddevno >= -1);
 assert(sounddevno <= devcount);
 //湖羲疏倛恅璃
 try
 {
  stopplaywav();

  m_hm = mmioopen(filename,null,mmio_read);
  if(m_hm == 0x00)
  {
   getlasterrormsg("mmioopen");
   return false;
  }
  //輛?輸ㄛ潰脤湖羲恅璃岆瘁岆wave恅璃
  mmckinfoparent.fcctype = mmiofourcc(´w´,´a´,´v´,´e´);
  _mr = mmiodescend(m_hm,(lpmmckinfo)&mmckinfoparent,null,mmio_findriff);
  if(_mr != mmsyserr_noerror)
  {
   getlasterrormsg("mmiofourcc wave open");
   return false;
  }
  //扆梑 ´fmt´ 輸
  mmckinfosubchunk.ckid = mmiofourcc(´f´,´m´,´t´,´ ´);
  _mr = mmiodescend(m_hm,(lpmmckinfo)&mmckinfosubchunk,(lpmmckinfo)&mmckinfoparent,
       mmio_findchunk);
  if(_mr != mmsyserr_noerror)
  {
   getlasterrormsg("mmiofourcc fmt open");
   return false;
  }
  //鳳腕 ´fmt ´輸腔湮苤ㄛ扠?囀湔
  _dwfmtsize = mmckinfosubchunk.cksize;

  pwaveformatex lpformat = (waveformatex *)&m_waveformat;
  if (!lpformat)
  {
   getlasterrormsg("mmiofourcc lpformat = null open");
   return false;
  }
  if ((unsigned long) mmioread(m_hm, (hpstr)lpformat, _dwfmtsize) !=
  _dwfmtsize)
  {
   getlasterrormsg("mmiofourcc _dwfmtsize = null open");
   return false;
  }
  //燭羲 fmt 輸
  mmioascend(m_hm, &mmckinfosubchunk, 0);
  //扆梑 ´data´ 輸
  mmckinfosubchunk.ckid = mmiofourcc(´d´, ´a´, ´t´, ´a´);
  _mr = mmiodescend(m_hm, &mmckinfosubchunk, &mmckinfoparent,
      mmio_findchunk);
  if (_mr != mmsyserr_noerror)
  {
   getlasterrormsg("mmiofourcc data open");
   return false;
  }
  // 鳳?data輸腔湮苤
  dword _dwdatasize = mmckinfosubchunk.cksize ;
  dword _dwdataoffset = mmckinfosubchunk.dwdataoffset ;
  if( _dwdataoffset== 0l)
  {
   getlasterrormsg("mmiofourcc _dwdataoffset open");
   return false;
  }
  //峈秞?杅擂煦饜囀湔
  lpdwdata = new char[_dwdatasize];
  if(!lpdwdata)
   return false;
  dword lsoundoffset = _dwdataoffset;
  long lsize = mmioseek(m_hm, lsoundoffset, seek_set);
  if (lsize < 0)
  {
   getlasterrormsg("mmiofourcc lsize open");
   return false;
  }

  dword _soundlong = _dwdatasize;
  dword _wavelong = mmioread(m_hm,lpdwdata,_soundlong);
  if(_wavelong<= 0)
   return false;
  m_wavelength = _wavelong;

  mmresult hr = 0x00;
  hr = waveoutopen(&m_hwo,sounddevno,
      &m_waveformat,
      (dword)this->m_hwnd,
      0,
      callback_window);
  if(hr !=mmsyserr_noerror)
  {
   getlasterrormsg("waveoutopen");
   return false;
  }
  return true;
 }
 catch(...)
 {
  return false;
 }
 //mmwomopen();
}

bool cwavefileex::stopplaywav()
{
 try
 {
  if(m_hm!=0x00)
  {
   mmioclose(m_hm,null);
   m_hm = 0x00;
  }
  if(m_hwo != 0x00)
  {
   waveoutreset(m_hwo);
   waveoutclose(m_hwo);
   m_hwo = null;
  }
  if(lpdwdata != 0x00)
  {
   delete[] lpdwdata;
   lpdwdata = null;
  }
  return true;
 }
 catch(...)
 {
  return false;
 }
}
void cwavefileex::mmwomopen()
{
 try
 {
  if(lpdwdata == null)
   return;
  waveouthdr.lpdata    = (char*)lpdwdata;
  waveouthdr.dwbufferlength  = m_wavelength;
  waveouthdr.dwbytesrecorded  =0;
  waveouthdr.dwuser    =0;
  waveouthdr.dwflags    =whdr_beginloop|whdr_endloop;
  waveouthdr.dwloops    =1;
  waveouthdr.lpnext    =null;
  waveouthdr.reserved    =0;

  waveoutprepareheader(m_hwo,&waveouthdr,sizeof(wavehdr));
  if(waveoutwrite(m_hwo,&waveouthdr,sizeof(wavehdr)) != mmsyserr_noerror)
  {
   getlasterrormsg("waveoutwrite");
  }
  }
 catch(...)
 {
 }
}
void cwavefileex::mmwomdone(wparam wparam,lparam lparam)
{
 waveoutunprepareheader(m_hwo,&waveouthdr,sizeof(wavehdr));
 waveoutreset(m_hwo);

}
void cwavefileex::mmwomclose()
{
 try
 {
  waveoutunprepareheader(m_hwo,pwavehdr1,sizeof(pwavehdr1));
  waveoutunprepareheader(m_hwo,pwavehdr2,sizeof(pwavehdr2));
  m_hwo=null;
  free(pwavehdr1);
  free(pwavehdr2);
  delete[] pbuf1;
  delete[] pbuf2;
  pwavehdr1 = null;
  pwavehdr2 = null;
  pbuf1   = null;
  pbuf2     = null;
 }
 catch(...)
 {
 }
}
void cwavefileex::close()
{
 if(this->m_hmmio)
 {
  mmioascend(this->m_hmmio,&this->m_mminfochild,0);
  mmioascend(this->m_hmmio,&this->m_mminfoparent,0);
  mmioclose(this->m_hmmio,0);
  this->m_hmmio = 0x0;
 }
}
void cwavefileex::pausewav()
{
 static bool _bpause = true;
 if(_bpause )
 {
  ::waveoutpause(m_hwo);
 }
 else
 {
  ::waveoutrestart(m_hwo);
 }
 _bpause = !_bpause;
}
void cwavefileex::setwnd(hwnd hwnd)
{
 this->m_hwnd = hwnd;
}




上一篇:程序只运行一个实例,并激活前一个实例 C+/VC  
下一篇:可切换视图的单文档静态分割窗口总结 C+/VC

浏览模式 : 显示全部 | 评论 : 0 | 排序 | 浏览 : 284

我要发表文章
回复标题:  
    Email :
* 请输入验证码
 
统计数据
文章数量 : 300300
评论次数 : 460
访问次数 : 19300390
在线人数 : 2093

附近文章
  • 用Visual C+打造IE浏览器...
  • 用Visual C+打造IE浏览器...
  • 追根究底,MFC六大关键技术...
  • 程序实现多国语言的动态切...
  • 程序只运行一个实例,并激...
  • 可切换视图的单文档静态分...
  • 一个好用的线程池 C+/VC
  • 关于常用的JPG,动态GIF,B...
  • The GRETA Regular Expre...
  • 如何获得十亿分之一秒的时...
热门文章
  • 如...
  • Socket编程中select()的妙...
  • 如何在DLL中创建窗体(对话...
  • 重载赋值运算符 C+/VC
  • 展现TRACE之威力 C+/VC
  • ·用豪杰大眼睛制作照片v...
  • 一個簡單的錄音放音程序 ...
  • 用Socket接口实现网络异步...
  • MFC动态创建控件的消息处...
  • 实现服务器端的多线程SOC...
最新文章
  • 09/北京代办国内外文凭Q...
  • 09/北京代办国内外文凭Q...
  • 09/北京代办国内外文凭Q...
  • 股票技术不准了
  • 2009年元旦放假安排
最近评论
  • xueshanfh
  • 匿名
  • 匿名
  • 匿名
  • 匿名
  • 匿名Martha Jack
  • 匿名
  • Tom Moddy
  • 匿名Jimmy Adams
  • 匿名
 
 

Copyright (C) 一算子网 2006-2008, All Rights Reserved 京ICP备06020154号
服务QQ: 有问题请留言 留言邮箱pinhu530@sohu.com