分享
 
 
 

Windows环境下的麦克风录音系统(7)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

我们有了这两个强有力的类的支持就可以开始我们的编程工作了….

1.用VC6++建立一个MFC基于对话框的工程:MicDemo;

2.添加我们的两个类CSoundIn,CwaveFile;

3.当我们点击开始(Start)按钮的时候我们就要开始录音了…

void CMicDemoDlg::OnStart()

{

m_btnStart.EnableWindow(FALSE);

if(theSoundCapture().__initMic())

{

m_filePath.SetWindowText(_T("yangchen.wav."));

theSoundCapture().__createOutputWaveFile(_T("yangchen.wav"));

if(!theSoundCapture().__openMic())

{

::MessageBox(this->m_hWnd,_T("Can not open microphone!"), _T("Error"),MB_OK|MB_ICONERROR);

return;

}

}

m_btnStop.EnableWindow(TRUE);

// 设置定时器是为了画波形用的

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()

{

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 soundInObj;

能编译通过吗?肯定是不能,那如何调用CSoundIn的成员函数呢?答案是通过一个全局函数:

// global function,:-(

// client can only through this function to use CSoundIn object

CSoundIn & theSoundCapture()

{

static CSoundIn p;

return p;

}

这时候你应该明白了为什么上面的代码中调用CSoundIn的成员函数的时候都是用theSoundCapture来做的原因了吧.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有