#pragma hdrstop #include "WaveRecord.h" #pragma package(smart_init) bool WaveRecord::WaveMakeHeader() { ulSize = lpRecordSet->Channel*lpRecordSet->SamplingRate*lpRecordSet->BufferSeconds* lpRecordSet->BitsPerSample/8; lpData[0] = (char *)malloc(ulSize); lpData[1] = (char *)malloc(ulSize); if ((lpData[0] == NULL) || (lpData[1] == NULL)) { return false; } lpWaveHdr[0] = (LPWAVEHDR)malloc(sizeof(WAVEHDR)); lpWaveHdr[1] = (LPWAVEHDR)malloc(sizeof(WAVEHDR)); if ((lpWaveHdr[0] == NULL) || (lpWaveHdr[1] == NULL)) { free(lpData[0]); free(lpData[1]); return false; } ZeroMemory(lpWaveHdr[0], sizeof(WAVEHDR)); ZeroMemory(lpWaveHdr[1], sizeof(WAVEHDR)); lpWaveHdr[0]->lpData = lpData[0]; lpWaveHdr[1]->lpData = lpData[1]; lpWaveHdr[0]->dwBufferLength = ulSize; lpWaveHdr[1]->dwBufferLength = ulSize; return true; } void WaveRecord::WaveFreeHeader() { free(lpData[0]); free(lpData[1]); free(lpWaveHdr[0]); free(lpWaveHdr[1]); } bool WaveRecord::WaveRecordOpen(HWND Hwnd) { WAVEFORMATEX wfx; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = (WORD)lpRecordSet->Channel; wfx.nSamplesPerSec = (DWORD)lpRecordSet->SamplingRate; wfx.wBitsPerSample = (WORD)lpRecordSet->BitsPerSample; wfx.nBlockAlign = (WORD)((wfx.nChannels * wfx.wBitsPerSample) / 8); wfx.nAvgBytesPerSec = (wfx.nSamplesPerSec * wfx.nBlockAlign); wfx.cbSize = 0; MMRESULT result = waveInOpen(&hwi, WAVE_MAPPER, &wfx, (LONG)Hwnd, NULL, CALLBACK_WINDOW); if (result == MMSYSERR_NOERROR) return true; return false; } bool WaveRecord::WaveRecordBegin() { MMRESULT result1 = waveInPrepareHeader(hwi, lpWaveHdr[0], sizeof(WAVEHDR)); MMRESULT result2 = waveInPrepareHeader(hwi, lpWaveHdr[1], sizeof(WAVEHDR)); if ((result1 == MMSYSERR_NOERROR) && (result2 == MMSYSERR_NOERROR)) { if (AddQueue()) { MMRESULT result = waveInStart(hwi); if (result == MMSYSERR_NOERROR) { AddQueue(); return true; } } } return false; } bool WaveRecord::AddQueue() { MMRESULT result = waveInAddBuffer(hwi, lpWaveHdr[BufferIndex], sizeof(WAVEHDR)); if (result == MMSYSERR_NOERROR) { BufferIndex = 1 - BufferIndex; return true; } else return false; } void WaveRecord::WaveRecordEnd() { waveInStop(hwi); waveInReset(hwi); waveInUnprepareHeader(hwi, lpWaveHdr[0], sizeof(WAVEHDR)); waveInUnprepareHeader(hwi, lpWaveHdr[1], sizeof(WAVEHDR)); } void WaveRecord::WaveRecordClose() { waveInReset(hwi); waveInClose(hwi); } WaveRecord::WaveRecord() { lpConfigFile=fopen("Config.txt","rb"); fread(&RecSet,sizeof(RecSet),1,lpConfigFile); lpRecordSet = &RecSet; fclose(lpConfigFile); BufferIndex = 0; } WaveRecord::~WaveRecord() { //fclose(lpConfigFile); }