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 ;}
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 ;}
解决方案 »
- 请问LPSTR与CString类型等价吗?
- 程序调试时出现访问冲突, 0xC0000005: 读取位置 0x00000037 时发生访问冲突 ,是怎么回事啊
- int* x 和int *x,有什么区别?
- 我该如何在VC下调用DOS环境开发的函数库
- 最新版本的visual studio 对MFC的支持有什么特色啊?
- 如何在CPP文件中用好自定义的头文件(在线等)
- 格式化字串的問題?
- 关于VC中定义wchar_t的一些问题
- 如果把回调函数类型从pascal改为c,可以吗,必须是pascal吗
- 求救:如何作基于dialog的启动画面
- 面板的设计
- 请问,如何将一个DLL文件(无原代码),封装到我新建的一个WIN32DLL中?如何在其它应用程序中通过加载新生成的DLL来调用老DLL中的函数?请大家
afx_msg LRESULT OnWaveOutDone(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnWaveClose(WPARAM wParam, LPARAM lParam);返回值类型不对。
改为if(::waveInOpen(&hwi,WAVE_MAPPER,&wavefmt,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW))