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.");