录音时为什么没触发MM_WIM_DATA消息?
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 ;
}
问题点数:20、回复次数:2Top
1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-11-04 16:58:02 得分 0
afx_msg LRESULT OnWaveInData(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnWaveOutDone(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnWaveClose(WPARAM wParam, LPARAM lParam);
返回值类型不对。Top
2 楼VCSQLVB(深谷清音(谁知还是难脱俗尘))回复于 2004-11-05 15:19:12 得分 20
把if(::waveInOpen(&hwi,WAVE_MAPPER,&wavefmt,(DWORD)this->m_hWnd,NULL,CALLBACK_THREAD))
改为if(::waveInOpen(&hwi,WAVE_MAPPER,&wavefmt,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW))
Top




