CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

录音时为什么没触发MM_WIM_DATA消息?

楼主zxfvc(七品VC)2004-11-04 16:54:20 在 VC/MFC / 基础类 提问

CMyDlg.h:  
  afx_msg   void   OnMM_WIM_DATA(UINT   wParam,LONG   lParam);  
  DECLARE_MESSAGE_MAP()  
   
  CMyDlg.cpp:  
  BEGIN_MESSAGE_MAP(CMyDlg,   CDialog)  
  ON_MESSAGE(MM_WIM_DATA,OnMM_WIM_DATA)  
  END_MESSAGE_MAP()  
   
  //录音部分  
  flag   =   FALSE;  
   
  //分配缓冲  
  pPlayBuf   =   (PBYTE)malloc(INP_BUFFER_SIZE);  
  pRecBuf   =   (PBYTE)malloc(INP_BUFFER_SIZE);  
  if   (!pPlayBuf   ||   !pRecBuf)    
  {  
  if   (pPlayBuf)   free(pPlayBuf);  
  if   (pRecBuf)   free(pRecBuf);  
  return   ;  
  }  
  //填充数据格式  
  memset(&wavefmt,0,sizeof(wavefmt));  
  wavefmt.wFormatTag   =   WAVE_FORMAT_PCM;     //数据格式,一般为WAVE_FORMAT_PCM即脉冲编码  
  wavefmt.nChannels   =   1;                                   //声道  
  wavefmt.nSamplesPerSec   =   11025;                 //采样频率  
  wavefmt.wBitsPerSample   =   8;                       //样本大小    
  wavefmt.nBlockAlign   =   1;  
  wavefmt.nAvgBytesPerSec   =   11025;   //每秒数据量  
  wavefmt.cbSize   =   0;  
   
  //线程模式     MFC线程消息的宏为:ON_THREAD_MESSAGE  
  if(::waveInOpen(&hwi,WAVE_MAPPER,&wavefmt,(DWORD)this->m_hWnd,NULL,CALLBACK_THREAD))  
  {  
  free(pPlayBuf);  
  free(pRecBuf);  
  return;  
  }  
  //填充缓存格式  
  pwhdr1->lpData   =   (LPTSTR)pPlayBuf;  
  pwhdr1->dwBufferLength   =   INP_BUFFER_SIZE;  
  pwhdr1->dwBytesRecorded=0;       //已录音的字节长度  
  pwhdr1->dwUser=0;  
  pwhdr1->dwFlags=0;  
  pwhdr1->dwLoops=1;                       //循环次数  
  pwhdr1->lpNext=NULL;  
  pwhdr1->reserved=0;  
  ::waveInPrepareHeader(hwi,pwhdr1,sizeof(WAVEHDR));  
   
  pwhdr2->lpData   =   (LPTSTR)pRecBuf;  
  pwhdr2->dwBufferLength   =   INP_BUFFER_SIZE;  
  pwhdr2->dwBytesRecorded=0;       //已录音的字节长度  
  pwhdr2->dwUser=0;  
  pwhdr2->dwFlags=0;  
  pwhdr2->dwLoops=1;                       //循环次数  
  pwhdr2->lpNext=NULL;  
  pwhdr2->reserved=0;  
  ::waveInPrepareHeader(hwi,pwhdr2,sizeof(WAVEHDR));  
   
  //给输入设备增加缓存  
  ::waveInAddBuffer(hwi,pwhdr1,sizeof(WAVEHDR));  
  ::waveInAddBuffer(hwi,pwhdr2,sizeof(WAVEHDR));  
   
  //开始录音  
  dwDataLength   =   0   ;  
  result   =   ::waveInStart(hwi);  
  if(result==MMSYSERR_NOERROR)  
  AfxMessageBox("没错误");  
   
  void   CMyDlg::OnMM_WIM_DATA(UINT   wParam,LONG   lParam)  
  {  
  pSaveBuf   =   (PBYTE)realloc   (pSaveBuf,   dwDataLength   +  
  ((PWAVEHDR)   lParam)->dwBytesRecorded)   ;  
   
  if(flag)  
  {  
  waveInClose   (hwi)   ;  
  return   ;  
  }  
  CopyMemory   (pSaveBuf   +   dwDataLength,   ((PWAVEHDR)   lParam)->lpData,  
  ((PWAVEHDR)   lParam)->dwBytesRecorded)   ;  
   
  dwDataLength   +=   ((PWAVEHDR)   lParam)->dwBytesRecorded   ;  
   
   
  waveInAddBuffer   (hwi,   (PWAVEHDR)   lParam,   sizeof   (WAVEHDR))   ;  
   
  return   ;  
   
  }  
  问题点数:20、回复次数:2Top

1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-11-04 16:58:02 得分 0

afx_msg   LRESULT   OnWaveInData(WPARAM   wParam,   LPARAM   lParam);  
  afx_msg   LRESULT   OnWaveOutDone(WPARAM   wParam,   LPARAM   lParam);  
  afx_msg   LRESULT   OnWaveClose(WPARAM   wParam,   LPARAM   lParam);  
   
  返回值类型不对。Top

2 楼VCSQLVB(深谷清音(谁知还是难脱俗尘))回复于 2004-11-05 15:19:12 得分 20

把if(::waveInOpen(&hwi,WAVE_MAPPER,&wavefmt,(DWORD)this->m_hWnd,NULL,CALLBACK_THREAD))  
  改为if(::waveInOpen(&hwi,WAVE_MAPPER,&wavefmt,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW))  
   
  Top

相关问题

  • 怎样触发录音程序开始录音????(比喻说对着话筒只要有声音就开始录音,没有就不录)
  • (mm系列)触发器明知有错,却不知如何?请看我的触发器!
  • 录音
  • 触发器?!
  • 触发问题!
  • 触发器
  • 触发器
  • 求触发器
  • 触发器
  • 触发器(ORACLE)!!!!!!!!!

关键词

  • 数据
  • null
  • wavefmt
  • pplaybuf
  • precbuf
  • wim
  • hwi
  • waveinopen
  • wave
  • cmydlg

得分解答快速导航

  • 帖主:zxfvc
  • VCSQLVB

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo