Pedal Point源码发布及说明(6)[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 spanzhang 的 blog

 if (umsg != wim_data)
  return;

 //取得参数值
 waverecorder* me = (waverecorder*)(dwinstance);
 lpwavehdr lphdr = (lpwavehdr)(dwparam1);

 //对数据作低通滤波
 if (lphdr->dwbufferlength >= wave_buffer_length &&
  ::waitforsingleobject(pb::eventmutex, infinite) == wait_object_0)
 {
  smooth(lphdr->lpdata, gs::graphseed::lowpasswave, wave_buffer_length, 0.9999, 100);

  ::releasemutex(pb::eventmutex);
 }  

 //准备新缓冲
 if (me->status == e_status_started)
 {
  hwavein& hrecord = me->hrecord;
  ::waveinunprepareheader(hrecord, lphdr, sizeof(wavehdr));
  ::waveinprepareheader(hrecord, lphdr, sizeof(wavehdr));
  ::waveinaddbuffer(hrecord, lphdr, sizeof(wavehdr));
 }
 else
 {
  safedelete(lphdr->lpdata);
  safedelete(lphdr);
 }
}

//开始
void waverecorder::start() throw (std::exception)
{
 if(status == e_status_started)
  return;

 //打开音频设备
 mmresult mmreturn = ::waveinopen
 (
  &hrecord,
  wave_mapper,
  &waveformat,
  (dword)(waverecorder::waveinproc),
  (dword)(this),
  callback_function
 );
 switch(mmreturn)
 {
 case mmsyserr_noerror: //成功
  break;

 case mmsyserr_allocated:
  throw std::exception("specified resource is already allocated.");

 case mmsyserr_baddeviceid:
  throw std::exception("specified device identifier is out of range.");

 case mmsyserr_nodriver:
  throw std::exception("no device driver is present.");

 case mmsyserr_nomem:
  throw std::exception("unable to allocate or lock memory.");

 case waverr_badformat:
  throw std::exception("attempted to open with an unsupported waveform-audio format.");
  
 default:
  throw std::exception("unknown error occured.");
 }
 
 //加入缓冲
 for (int i = 0; i < maxinputbuffers; ++i)
 {
  lpwavehdr lphdr = new wavehdr;
  memset(lphdr, 0x00, sizeof(wavehdr));
  
  lphdr->lpdata = new char[buffersize];
  lphdr->dwbufferlength = buffersize;
  
  mmresult mmreturn = ::waveinprepareheader(hrecord, lphdr, sizeof(wavehdr));
  if (mmreturn != mmsyserr_noerror) //memory leaks
   throw std::exception("waveinprepareheader error in startredording.");
  mmreturn = ::waveinaddbuffer(hrecord, lphdr, sizeof(wavehdr));
  if (mmreturn != mmsyserr_noerror) //memory leaks
   throw std::exception("waveinaddbuffer error in startredording.");
 }

 //开始录音
 mmreturn = ::waveinstart(hrecord);
 if (mmreturn != mmsyserr_noerror)
 {
        throw std::exception("waveinstart error.");
 }

 status = e_status_started;
}

//停止录音
void waverecorder::stop() throw (std::exception)
{
 if(status != e_status_started)
  return;
 
 //停止录音
 mmresult mmreturn = ::waveinstop(hrecord);
 switch(mmreturn)
 {
 case mmsyserr_noerror: //成功
  break;
  
 case mmsyserr_invalhandle:
  throw std::exception("specified device handle is invalid.");
  break;

 case mmsyserr_nodriver:
  throw std::exception("no device driver is present.");
  break;

 case mmsyserr_nomem:
  throw std::exception("unable to allocate or lock memory.");
  break;
  
 default:
  throw std::exception("unknown error occured.");
 }

 status = e_status_stoped;

 //重置设备
//del_code
//(<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 mmreturn = ::waveinreset(hrecord);
 switch(mmreturn)
 {
 case mmsyserr_noerror: //成功
  break;
  
 case mmsyserr_invalhandle:
  throw std::exception("specified device handle is invalid.");
  
 case mmsyserr_nodriver:
  throw std::exception("no device driver is present.");
  

本文关键:Pedal Point源码发布及说明(6)
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top