1,649
社区成员
发帖
与我相关
我的任务
分享
void CNmrView::OnOperateSTART()
{
m_CountOpen++; //该变量用于统计本函数执行次数
//由于只采集一次即可,所以只需要设置一个缓冲区
pBuffer1=(PBYTE)malloc(INP_BUFFER_SIZE);
if (!pBuffer1) AfxMessageBox(L"Memory erro for pBuffer!");
//这是音频格式设置,可略过
waveform.wFormatTag = WAVE_FORMAT_PCM;
waveform.nChannels = 1;
waveform.nSamplesPerSec = 44100;
waveform.wBitsPerSample = 16;
waveform.nAvgBytesPerSec = waveform.nSamplesPerSec * (waveform.wBitsPerSample / 8);
waveform.nBlockAlign = waveform.nChannels * (waveform.wBitsPerSample / 8);
waveform.cbSize = 0;
//打开音频设备
MMRESULT mmreturn = ::waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform, (DWORD)(UINT)this->m_hWnd, NULL, CALLBACK_WINDOW);
if (mmreturn) AfxMessageBox(L"Audio can not be open!");
//缓冲区设置
pWaveHdr1->lpData = (LPSTR) pBuffer1;
pWaveHdr1->dwBufferLength=INP_BUFFER_SIZE;
pWaveHdr1->dwBytesRecorded=0;
//准备缓冲区
mmreturn = ::waveInPrepareHeader(hWaveIn, pWaveHdr1, sizeof(WAVEHDR));
if (mmreturn) MessageBox(L"error in waveInPrepareHeader()");
pSaveBuffer = (PBYTE)realloc(pSaveBuffer, 1); //用于保存采集到的音频缓冲区
//添加缓冲区
mmreturn = ::waveInAddBuffer(hWaveIn, pWaveHdr1, sizeof (WAVEHDR));
if (mmreturn) MessageBox(L"error in waveInAddBuffer()");
//开始采集
mmreturn = ::waveInStart(hWaveIn);
if (mmreturn) MessageBox(L"error in Start()");
}
LRESULT CNmrView::OnMM_WIM_DATA(WPARAM wParam, LPARAM lParam)
{
m_CountClose++; //该变量统计本函数执行次数
int dwDataLength = ((PWAVEHDR)lParam)->dwBytesRecorded; //缓冲区长度,应该等于INP_BUFFER_SIZE
//为音频数据预置空间
pSaveBuffer = (PBYTE)realloc(pSaveBuffer, dwDataLength);
if (pSaveBuffer == NULL) AfxMessageBox(L"error open memory for pNewBuffer");
//将音频缓冲区的数据放入pSaveBuffer(dwDataLength每次清零,所以没影响,这段是引用的别人博客的代码)
CopyMemory (pSaveBuffer, ((PWAVEHDR) lParam)->lpData, dwDataLength) ;
MMRESULT mmreturn = ::waveInUnprepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ;;
if (mmreturn) MessageBox(L"error in waveInUnprepareHeader!");
mmreturn = ::waveInReset(hWaveIn);
if (mmreturn) MessageBox(L"error in waveInReset!");
// Sleep(500);
//关闭音频设备
mmreturn = ::waveInClose(hWaveIn);
if (mmreturn) MessageBox(L"waveInClose failed!");
}
free (pBuffer1) ;