- 設置采集音頻格式
- WAVEFORMATEX waveform; //采集音頻的格式,結構體
- waveform.wFormatTag = WAVE_FORMAT_PCM;//聲音格式為PCM
- waveform.nSamplesPerSec = 8000;//采樣率,16000次/秒
- waveform.wBitsPerSample = 16;//采樣比特,16bits/次
- waveform.nChannels = 1;//采樣聲道數,2聲道
- waveform.nAvgBytesPerSec = 16000;//每秒的數據率,就是每秒能采集多少字節的數據
- waveform.nBlockAlign = 2;//一個塊的大小,采樣bit的字節數乘以聲道數
- waveform.cbSize = 0;//一般為0
- 提前准備好的錄音數據緩存
- m_pRecoderBuf = new unsigned char[20 * 1024];
- m_recoderNum = 20;
- m_recoderBufLen = 20 * 1024;
- m_pWaveHdr = new WAVEHDR[20];
- memset(m_pRecoderBuf, 0, 20 * 1024);
- memset(m_pWaveHdr, 0, sizeof(WAVEHDR) * 20);
- 打開錄音設備
- MMRESULT mmres = waveInOpen(&m_hWaveIn, WAVE_MAPPER, &waveform, (DWORD_PTR)WaveInProc, (DWORD_PTR)this, CALLBACK_FUNCTION );
- if(mmres != MMSYSERR_NOERROR)
- {
- // failed, try again.
- return;
- }
- 准備數據空間
- for (int i = 0; i < m_recoderNum; ++i)
- {
- m_pWaveHdr[i].lpData = (char*)m_pRecoderBuf + i * 1024;
- m_pWaveHdr[i].dwBufferLength = 1024;
- mmres = waveInPrepareHeader(m_hWaveIn, &m_pWaveHdr[i], sizeof(WAVEHDR));
- mmres = waveInAddBuffer(m_hWaveIn, &m_pWaveHdr[i], sizeof(WAVEHDR));
- }
- 開始錄音並打開寫文件
- mmres = waveInStart(m_hWaveIn);
- SYSTEMTIME systemtime;
- GetLocalTime(&systemtime);
- char filename[256];
- sprintf_s(filename, 256, "%d-%d-%d_%d_%d_%d.wav", systemtime.wYear, systemtime.wMonth, systemtime.wDay, systemtime.wHour, systemtime.wMinute, systemtime.wSecond);
- m_pWavFile = wav_write_open(filename, 8000, 16, 1);
- 要提前定義好數據接收回調函數,因為我們用的是CALLBACK_FUNCTION
- static BOOL CALLBACK WaveInProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
- BOOL WaveInProcImpl(HWAVEOUT hwo, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
- BOOL CAudioFileConvertDlg::WaveInProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
- {
- CAudioFileConvertDlg* pPlayer = (CAudioFileConvertDlg*)dwInstance;
- return pPlayer->WaveInProcImpl(hwo, uMsg, dwParam1, dwParam2);
- }
- BOOL CAudioFileConvertDlg::WaveInProcImpl(HWAVEOUT hwo, UINT uMsg, DWORD dwParam1, DWORD dwParam2)
- {
- // 忽略打開和關閉設備時的處理
- if(uMsg == WIM_DATA)
- {
- LPWAVEHDR pHdr = (LPWAVEHDR) dwParam1;
- MMRESULT mmres = waveInUnprepareHeader (m_hWaveIn, pHdr, sizeof(WAVEHDR));
- //處理數據
- if (NULL != m_pWavFile)
- {
- wav_write_data(m_pWavFile, (unsigned char *)(pHdr->lpData), pHdr->dwBytesRecorded);
- }
- //重新准備數據
- mmres = waveInPrepareHeader(m_hWaveIn, pHdr, sizeof(WAVEHDR));
- mmres = waveInAddBuffer(m_hWaveIn, pHdr, sizeof(WAVEHDR));
- }
- return TRUE;
- }
- 關閉錄音並關閉wav寫文件
- MMRESULT mmres = waveInStop(m_hWaveIn);
- mmres = waveInClose(m_hWaveIn);
- wav_write_close(m_pWavFile);
- if (NULL != m_pRecoderBuf)
- {
- delete []m_pRecoderBuf;
- m_pRecoderBuf = NULL;
- }
- if (NULL != m_pWaveHdr)
- {
- delete []m_pWaveHdr;
- m_pWaveHdr = NULL;
- }