了画波形用的
SetTimer(1, 200 /*start slow*/, NULL);
}
4.在定时器的回调函数中画波形.
void CMicDemoDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 1)
{
static const int xCon = 13;
static const int yCon = 13;
static const int wCon = 623;
static const int hCon = 80;
CClientDC dc(this);
CBitmap Bitmap;
CBitmap * pbmOld = NULL;
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
Bitmap.CreateCompatibleBitmap(&dc,wCon,hCon);
pbmOld = dcMem.SelectObject(&Bitmap);
dcMem.PatBlt(0,0,wCon,hCon, WHITENESS);
dcMem.MoveTo(0,hCon/2);
//
// display incomming signal--key idea!
//
for(int x =0 ; x < wCon; x++) // display Input
{
dcMem.LineTo(x,(hCon >> 1) - (theSoundCapture().InputBuffer[x] >> 7));
}
dc.BitBlt(xCon,yCon,wCon,hCon,&dcMem, 0, 0, SRCCOPY);
dcMem.SelectObject(pbmOld);
dcMem.DeleteDC();
}
else
CDialog::OnTimer(nIDEvent);
}
5.点击停止(Stop)按钮的时候停止录音和写WAV文件
void CMicDemoDlg::OnStop()
{
// TODO: Add your control notification handler code here
m_btnStop.EnableWindow(FALSE);
theSoundCapture().__closeMic();
m_btnStart.EnableWindow(TRUE);
}
看完整段代码你可能会很奇怪怎么在CmicDemoDlg中居然都没有定义一个CSoundIn对象??呵呵,原因很简单,因为设备的独占性所以在一个时刻只能有一个CSoundIn对象存在(因为CSoundIn对象需要占据录音设备),所以我们必须限制程序员生成CSoundIn对象的数量,怎么限制呢?那就是把CSoundIn的构造函数放在private区域里面:
private:
BOOL GetBestWaveFormat(WAVEFORMATEX & waveFormatEx);
// because sound card is one and only so i must limit the number of CSoundIn object,
// but how to limit the class object nums?maybe put constructor into private scope is
// a good idea,:-)
CSoundIn();
这样的话就根本无法声明一个CSoundIn对象,不信你试一下在你的代码中写上:
CSoundIn soundInOb
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页