⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 record(3).cpp

📁 语音与识别技术包含很多C语言处理模块系统
💻 CPP
字号:
#include <windows.h>
#include "Record.h"

#define NSAMPLESPERSEC		16000
#define	WBITESPERSAMPLE		16

#define	WAVE_DATASIZE		16000*10		//缓冲区大小
#define WAVE_ERROR_NO_DEVICE	-1	//找不到音频设备
#define	WAVE_ERROR_WAVEINOPEM	-2	//waveInOpen返回错误
#define	WAVE_ERROR_SUCESS		0	//成功
#define	WAVE_ERROR_WAVEINSTART		-3	//成功
#define	WAVE_ERROR_WAVEOUTOPEM		-5;

WAVEHDR			WaveInHdr1;
WAVEHDR			WaveInHdr2;

HWAVEIN			hWaveIn;
DWORD FCC(LPSTR lpStr)
{
  DWORD Number = lpStr[0] + lpStr[1] *0x100 + lpStr[2] *0x10000 + lpStr[3] *0x1000000 ;
  return Number;
}
void DealWave(LPTSTR pSaveBuffer,DWORD dwDataLength)
{
	int i;
	//_asm int 3
	for(i=0;i<dwDataLength/2-NSAMPLESPERSEC;i++)
	{
		//if( (*(unsigned short int *)(pSaveBuffer+i))&0x7FFF > (*(unsigned short int *)(pSaveBuffer+i+NSAMPLESPERSEC))&0x7FFF)
		
		if(*((short *)pSaveBuffer+i)>*((short *)pSaveBuffer+i+NSAMPLESPERSEC))
		*((short *)pSaveBuffer+i+NSAMPLESPERSEC) = *((short *)pSaveBuffer+i);
	}
}
void SavePCMFile(LPTSTR pSaveBuffer,DWORD dwDataLength)
{	
	WAVEFORMATEX	_WaveFormatex;
	HANDLE FileHandle;
	DWORD NumToWrite=0;
	DWORD dwNumber = 0;
	FileHandle =CreateFile( "myTest.wav", GENERIC_WRITE, FILE_SHARE_READ, NULL, 
			   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 
	_WaveFormatex.wFormatTag=WAVE_FORMAT_PCM;
	_WaveFormatex.nChannels=1;
	_WaveFormatex.nSamplesPerSec=NSAMPLESPERSEC;
	_WaveFormatex.wBitsPerSample=WBITESPERSAMPLE;	//指定录音格式
	_WaveFormatex.nBlockAlign=_WaveFormatex.wBitsPerSample/8;
	_WaveFormatex.nAvgBytesPerSec=_WaveFormatex.nSamplesPerSec*_WaveFormatex.nBlockAlign;
	_WaveFormatex.cbSize=0;	 
	
	DealWave(pSaveBuffer,dwDataLength);
	
	dwNumber = FCC("RIFF");
	WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
	dwNumber = dwDataLength + 18 + 20;
	WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
	dwNumber = FCC("WAVE");
	WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
	dwNumber = FCC("fmt ");
	WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
	dwNumber = 18L;
	WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
	WriteFile(FileHandle, &_WaveFormatex, sizeof(WAVEFORMATEX), &NumToWrite, NULL);
	dwNumber = FCC("data");
	WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
	dwNumber = dwDataLength;
	WriteFile(FileHandle, &dwNumber, 4, &NumToWrite, NULL);
	WriteFile(FileHandle, pSaveBuffer, dwNumber, &NumToWrite, NULL);
	//waveout
	SetEndOfFile(FileHandle);
	CloseHandle( FileHandle );  FileHandle = INVALID_HANDLE_VALUE; // 收尾关闭句柄
	
}
HWAVEIN RecordStart()
//pWaveFormatex可为0
{	
	WAVEFORMATEX	_WaveFormatex;

	_WaveFormatex.wFormatTag=WAVE_FORMAT_PCM;
	_WaveFormatex.nChannels=1;
	_WaveFormatex.nSamplesPerSec=NSAMPLESPERSEC;
	_WaveFormatex.wBitsPerSample=WBITESPERSAMPLE;	//指定录音格式
	_WaveFormatex.nBlockAlign=_WaveFormatex.wBitsPerSample/8;
	_WaveFormatex.nAvgBytesPerSec=_WaveFormatex.nSamplesPerSec*_WaveFormatex.nBlockAlign;
	_WaveFormatex.cbSize=0;		
	
	if ( !waveInGetNumDevs() ) return (HWAVEIN)WAVE_ERROR_NO_DEVICE;
	
	if (waveInOpen(&hWaveIn,
			WAVE_MAPPER,
			&_WaveFormatex,
			(DWORD)RecordCallBack,
			(DWORD)GetModuleHandle(0),
			CALLBACK_FUNCTION	// CALLBACK_FUNCTION、CALL_BACKTHREAD、CALLBACK_WINDOW
			)!= MMSYSERR_NOERROR) {
		return (HWAVEIN)WAVE_ERROR_WAVEINOPEM;
	}
	
	WaveInHdr1.lpData = (char *)malloc(WAVE_DATASIZE);
	WaveInHdr1.dwBufferLength=WAVE_DATASIZE;
	WaveInHdr1.dwBytesRecorded=0;
	WaveInHdr1.dwUser=0;
	WaveInHdr1.dwFlags=0;
	WaveInHdr1.dwLoops=1;
	WaveInHdr1.lpNext=NULL;
	WaveInHdr1.reserved=0;	
	waveInPrepareHeader(hWaveIn,&WaveInHdr1,sizeof(WAVEHDR));
	waveInAddBuffer (hWaveIn, &WaveInHdr1, sizeof (WAVEHDR)) ;	
	
	WaveInHdr2.lpData = (char *)malloc(WAVE_DATASIZE);
	WaveInHdr2.dwBufferLength=WAVE_DATASIZE;
	WaveInHdr2.dwBytesRecorded=0;
	WaveInHdr2.dwUser=0;
	WaveInHdr2.dwFlags=0;
	WaveInHdr2.dwLoops=1;
	WaveInHdr2.lpNext=NULL;
	WaveInHdr2.reserved=0;	
	waveInPrepareHeader(hWaveIn,&WaveInHdr2,sizeof(WAVEHDR));
	waveInAddBuffer (hWaveIn, &WaveInHdr2, sizeof (WAVEHDR)) ;
	//
	//开始录音
	//
	if (waveInStart (hWaveIn) != MMSYSERR_NOERROR)return WAVE_ERROR_WAVEINSTART;	
	return WAVE_ERROR_SUCESS;
}
void CALLBACK RecordCallBack(HWAVEIN hWaveIn,
								UINT uMsg,
								DWORD dwInstance,
								DWORD wParam,
								DWORD lParam)
{
	switch(uMsg)
	{
	case WIM_OPEN:
		
	break;
	case WIM_DATA:
		//_asm int 3
		SavePCMFile(((PWAVEHDR)wParam)->lpData,((PWAVEHDR)wParam)->dwBytesRecorded);
		//waveInAddBuffer (hWaveIn, (PWAVEHDR)wParam, sizeof (WAVEHDR));
		//_asm int 3
		//waveInReset(hWaveIn);
		waveInClose(hWaveIn);
		MessageBox(0,"录音结束","",MB_OK);
	break;
	case MM_MIM_CLOSE:
		 free(((PWAVEHDR)wParam)->lpNext->lpData);
		 free(((PWAVEHDR)wParam)->lpData);
		 waveInUnprepareHeader (hWaveIn,((PWAVEHDR)wParam)->lpNext, sizeof (WAVEHDR)) ;
		 waveInUnprepareHeader (hWaveIn,(PWAVEHDR)wParam, sizeof (WAVEHDR)) ;

	break;
	case MM_WOM_OPEN:

	break;
	case MM_WOM_DONE:

	break;
	case MM_WOM_CLOSE:
	break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -