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

📄 wave(8).cpp

📁 语音与识别技术包含很多C语言处理模块系统
💻 CPP
字号:
#include <windows.h>
#include "Wave.h"
#define	WAVE_DATASIZE		8000		//缓冲区大小
#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;
HWAVEIN xxRecordeOpen(WAVEFORMATEX	*pWaveFormatex)
//pWaveFormatex可为0
{	
	WAVEFORMATEX	_WaveFormatex;
	WAVEFORMATEX*	_pWaveFormatex;
	HWAVEIN			hWaveIn;
	_pWaveFormatex = pWaveFormatex;
	if( NULL == pWaveFormatex )
	{	
		_pWaveFormatex = &_WaveFormatex;
		_WaveFormatex.wFormatTag=WAVE_FORMAT_PCM;
		_WaveFormatex.nChannels=1;
		_WaveFormatex.nSamplesPerSec=11025;
		_WaveFormatex.wBitsPerSample=8;	//指定录音格式
		_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,
			_pWaveFormatex,
			(DWORD)xxWaveProcCallBack,
			(HANDLE)GetModuleHandle(0),
			CALLBACK_FUNCTION	// CALLBACK_FUNCTION、CALL_BACKTHREAD、CALLBACK_WINDOW
			)!= (HWAVEIN)MMSYSERR_NOERROR) {
		return (HWAVEIN)WAVE_ERROR_WAVEINOPEM;
	}	
	return hWaveIn;
}
long xxRecordeStart(HWAVEIN		hWaveIn,DWORD	dwDataSize)
//dwDataSize可为0
{
	WAVEHDR			WaveHdr1;
	WAVEHDR			WaveHdr2;
	DWORD			_dwDataSize;
	_dwDataSize = dwDataSize;
	if( 0 == dwDataSize )_dwDataSize = WAVE_DATASIZE;
	WaveHdr1.lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, _dwDataSize) );
	WaveHdr1.dwBufferLength=_dwDataSize;
	WaveHdr1.dwBytesRecorded=0;
	WaveHdr1.dwUser=0;
	WaveHdr1.dwFlags=0;
	WaveHdr1.dwLoops=1;
	WaveHdr1.lpNext=NULL;
	WaveHdr1.reserved=0;	
	waveInPrepareHeader(hWaveIn,&WaveHdr1,sizeof(WAVEHDR));
	waveInAddBuffer (hWaveIn, &WaveHdr1, sizeof (WAVEHDR)) ;	
	
	WaveHdr2.lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, _dwDataSize) );
	WaveHdr2.dwBufferLength=_dwDataSize;
	WaveHdr2.dwBytesRecorded=0;
	WaveHdr2.dwUser=0;
	WaveHdr2.dwFlags=0;
	WaveHdr2.dwLoops=1;
	WaveHdr2.lpNext=NULL;
	WaveHdr2.reserved=0;	
	waveInPrepareHeader(hWaveIn,&WaveHdr2,sizeof(WAVEHDR));
	waveInAddBuffer (hWaveIn, &WaveHdr2, sizeof (WAVEHDR)) ;

	if (waveInStart (hWaveIn) != MMSYSERR_NOERROR)return WAVE_ERROR_WAVEINSTART;	

	return WAVE_ERROR_SUCESS;
}
HWAVEOUT xxWaveOutOpen(WAVEFORMATEX	*pWaveFormatex)
{	
	WAVEFORMATEX	_WaveFormatex;
	WAVEFORMATEX*	_pWaveFormatex;
	HWAVEOUT		hWaveOut;
	_pWaveFormatex = pWaveFormatex;
	if( NULL == _pWaveFormatex )
	{	
		_pWaveFormatex = &_WaveFormatex;
		_WaveFormatex.wFormatTag=WAVE_FORMAT_PCM;
		_WaveFormatex.nChannels=1;
		_WaveFormatex.nSamplesPerSec=11025;
		_WaveFormatex.wBitsPerSample=8;	//指定录音格式
		_WaveFormatex.nBlockAlign=_WaveFormatex.wBitsPerSample/8;
		_WaveFormatex.nAvgBytesPerSec=_WaveFormatex.nSamplesPerSec*_WaveFormatex.nBlockAlign;
		_WaveFormatex.cbSize=0;		
	}
	if ( !waveInGetNumDevs() ) return (HWAVEOUT)WAVE_ERROR_NO_DEVICE;
	
	if (waveOutOpen(&hWaveOut,
			WAVE_MAPPER,
			_pWaveFormatex,
			(DWORD)xxWaveProcCallBack,
			(DWORD)GetModuleHandle(0),
			CALLBACK_FUNCTION	// CALLBACK_FUNCTION、CALL_BACKTHREAD、CALLBACK_WINDOW
			)!= (HWAVEOUT)MMSYSERR_NOERROR)return (HWAVEOUT)WAVE_ERROR_WAVEOUTOPEM;
	
	return hWaveOut;
}
long xxPlay(HWAVEOUT	hWaveOut,PVOID	data,DWORD	dwDataSize)
{
	WAVEHDR			WaveHdr;	

	WaveHdr.lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, dwDataSize) );
	CopyMemory(&WaveHdr.lpData,data,dwDataSize);	
	WaveHdr.dwBufferLength=dwDataSize;
	WaveHdr.dwBytesRecorded=0;
	WaveHdr.dwUser=0;
	WaveHdr.dwFlags=0;
	WaveHdr.dwLoops=1;
	WaveHdr.lpNext=NULL;
	WaveHdr.reserved=0;	
	waveOutPrepareHeader (hWaveOut, &WaveHdr, sizeof (WAVEHDR)) ;
	waveOutWrite (hWaveOut, &WaveHdr, sizeof (WAVEHDR)) ;	
	
}
void CALLBACK xxWaveProcCallBack(HWAVEIN hWaveIn,
								UINT uMsg,
								DWORD dwInstance,
								DWORD wParam,
								DWORD lParam)
{
	switch(uMsg)
	{
	case MM_MIM_OPEN:
		
	break;
	case MM_WIM_DATA:
		waveInAddBuffer (hWaveIn, (PWAVEHDR)wParam, sizeof (WAVEHDR));
	break;
	case MM_MIM_CLOSE:
		 GlobalFree((PWAVEHDR)wParam.lpNext.lpData);
		 GlobalFree((PWAVEHDR)wParam.lpData);
		 waveInUnprepareHeader (hWaveIn,(PWAVEHDR)wParam.lpNext, sizeof (WAVEHDR)) ;
		 waveInUnprepareHeader (hWaveIn,(PWAVEHDR)wParam, sizeof (WAVEHDR)) ;

	break;
	case MM_WOM_OPEN:
		//waveInAddBuffer (hWaveIn, (PWAVEHDR)wParam, sizeof (WAVEHDR));
	break;
	case MM_WOM_DONE:
	//	WaveOut();
	break;
	case MM_WOM_CLOSE:
		waveOutUnprepareHeader ((HWAVEOUT)hWaveIn,(PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
	break;
	}
}

⌨️ 快捷键说明

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