我用EVC在WINCE的模拟器上写一个录音的程序,是这么调用waveInOpen函数的,waveInOpen(&hwi,WAVE_MAPPER, pwfx, (DWORD)this->m_hWnd, NULL, CALLBACK_WINDOW);但是设备输入句柄hwi却是个无效值,在VC上却是有效值哪位大侠帮解释下原因啊? 还有第一次启动模拟器运行此程序时可以录音和播放的,但是再次录音时waveInOpen函数返回4说明资源已经被分配而这个函数waveInPrepareHeader(hwi, &hdr, sizeof(WAVEHDR));却返回5,说句柄无效这是为什么呀??哪位大侠来帮忙??
代码是这样的:
m_dwChannels = 1; // default to mono
m_dwBitsPerSample = 8; // default to 16-bit samples
m_dwSampleRate = 11025; // default to 11.025KHz sample rate
m_dwDeviceId = WAVE_MAPPER; // capture from device 0
pwfx=&wfx; wfx.cbSize = 0;
//语音文件格式结构块的设置
//数据编码格式,一般为PCM格式,脉冲编码格式
wfx.wFormatTag = WAVE_FORMAT_PCM;
//采样位大小WINDOWS提供8,16位
wfx.wBitsPerSample = (WORD) m_dwBitsPerSample;
//采样率(每秒的样本数),数值有:11025,22050,44100
wfx.nSamplesPerSec = m_dwSampleRate;
//声道数,数值可为1或2
wfx.nChannels = (WORD) m_dwChannels;
//指定块对齐(单位字节), 块对齐是数据的最小单位
wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
//指定数据传输的平均速率(每秒的字节数)
wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;
// try to allocate the capture buffer
m_pBuffer1 = new BYTE [INP_BUFFER_SIZE];
m_pBuffer2 = new BYTE [INP_BUFFER_SIZE];
ASSERT(m_pBuffer1!=NULL);
ASSERT(m_pBuffer2!=NULL);
//语音设备数据块是设置
hdr.dwBufferLength = INP_BUFFER_SIZE;
hdr.lpData = (char*) m_pBuffer1;
hdr.dwBytesRecorded = 0;
hdr.dwUser=0;
hdr.dwFlags=0;
hdr.dwLoops=1;
hdr.lpNext=NULL;
hdr.reserved=0; hdr1.dwBufferLength = INP_BUFFER_SIZE;
hdr1.lpData = (char*) m_pBuffer2;
hdr1.dwBytesRecorded = 0;
hdr1.dwUser=0;
hdr1.dwFlags=0;
hdr1.dwLoops=1;
hdr1.lpNext=NULL;
hdr1.reserved=0;
//MMSYSERR_NOERROR
// open the wave capture device
mr = waveInOpen(&hwi,WAVE_MAPPER, pwfx, (DWORD)this->m_hWnd, NULL, CALLBACK_WINDOW); if(MMSYSERR_NOERROR != mr && MMSYSERR_ALLOCATED != mr){MessageBox(L"waveInOpen failed");}
mr = waveInPrepareHeader(hwi, &hdr, sizeof(WAVEHDR)); // submit the buffer for capture
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInPrepareHeader failed");}
mr = waveInPrepareHeader(hwi, &hdr1, sizeof(WAVEHDR));
// submit the buffer for capture
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInPrepareHeader failed");} mr = waveInAddBuffer(hwi, &hdr, sizeof(WAVEHDR));
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInAddBuffer failed");}
mr = waveInStart(hwi);
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInStart failed");}
代码是这样的:
m_dwChannels = 1; // default to mono
m_dwBitsPerSample = 8; // default to 16-bit samples
m_dwSampleRate = 11025; // default to 11.025KHz sample rate
m_dwDeviceId = WAVE_MAPPER; // capture from device 0
pwfx=&wfx; wfx.cbSize = 0;
//语音文件格式结构块的设置
//数据编码格式,一般为PCM格式,脉冲编码格式
wfx.wFormatTag = WAVE_FORMAT_PCM;
//采样位大小WINDOWS提供8,16位
wfx.wBitsPerSample = (WORD) m_dwBitsPerSample;
//采样率(每秒的样本数),数值有:11025,22050,44100
wfx.nSamplesPerSec = m_dwSampleRate;
//声道数,数值可为1或2
wfx.nChannels = (WORD) m_dwChannels;
//指定块对齐(单位字节), 块对齐是数据的最小单位
wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
//指定数据传输的平均速率(每秒的字节数)
wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;
// try to allocate the capture buffer
m_pBuffer1 = new BYTE [INP_BUFFER_SIZE];
m_pBuffer2 = new BYTE [INP_BUFFER_SIZE];
ASSERT(m_pBuffer1!=NULL);
ASSERT(m_pBuffer2!=NULL);
//语音设备数据块是设置
hdr.dwBufferLength = INP_BUFFER_SIZE;
hdr.lpData = (char*) m_pBuffer1;
hdr.dwBytesRecorded = 0;
hdr.dwUser=0;
hdr.dwFlags=0;
hdr.dwLoops=1;
hdr.lpNext=NULL;
hdr.reserved=0; hdr1.dwBufferLength = INP_BUFFER_SIZE;
hdr1.lpData = (char*) m_pBuffer2;
hdr1.dwBytesRecorded = 0;
hdr1.dwUser=0;
hdr1.dwFlags=0;
hdr1.dwLoops=1;
hdr1.lpNext=NULL;
hdr1.reserved=0;
//MMSYSERR_NOERROR
// open the wave capture device
mr = waveInOpen(&hwi,WAVE_MAPPER, pwfx, (DWORD)this->m_hWnd, NULL, CALLBACK_WINDOW); if(MMSYSERR_NOERROR != mr && MMSYSERR_ALLOCATED != mr){MessageBox(L"waveInOpen failed");}
mr = waveInPrepareHeader(hwi, &hdr, sizeof(WAVEHDR)); // submit the buffer for capture
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInPrepareHeader failed");}
mr = waveInPrepareHeader(hwi, &hdr1, sizeof(WAVEHDR));
// submit the buffer for capture
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInPrepareHeader failed");} mr = waveInAddBuffer(hwi, &hdr, sizeof(WAVEHDR));
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInAddBuffer failed");}
mr = waveInStart(hwi);
if(MMSYSERR_NOERROR != mr){MessageBox(L"waveInStart failed");}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货