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

📄 wave.cpp

📁 语音与识别技术包含很多C语言处理模块系统
💻 CPP
字号:
//#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "wave.h"
BOOL DlgProc(HWND, UINT, WPARAM, LPARAM) ;

char temp[0xff];
HINSTANCE hInst;

HWAVEIN hWaveIn,hwaveout;
WAVEFORMATEX waveformatf;
WAVEHDR * wavehdr;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
	//添加处理代码;
	hInst=hInstance;
	DialogBoxParam(hInstance,MAKEINTRESOURCE(1000),0,(DLGPROC)DlgProc,(1000));
	return TRUE;
}
BOOL DlgProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
int lowID;
switch (uMsg){
	case WM_INITDIALOG:
		LoadIcon( hInst,MAKEINTRESOURCE(10));
		//CreateMutex(NULL,FALSE,"MyMutex");
		if ( GetLastError() == ERROR_ALREADY_EXISTS ) 
		{
			MessageBox(hWnd,"err","err",MB_OK);
			EndDialog(hWnd,FALSE);
		}
		wavehdr=0;
		//datasize = 200000;
		break;
	case WM_COMMAND:
		lowID=LOWORD(wParam);
		if (lowID==1001)
			hWaveIn=OpenWaveIn(hWnd);
			StartWaveIn(hWaveIn,20000);
		break;
	case WM_CLOSE:
		EndDialog(hWnd,FALSE);
		break;
	
	case MM_WOM_OPEN://准备并开始回放
    		//MessageBox(0,"MM_WOM_OPEN:","err",MB_OK);
    		break;
    	case MM_WIM_DATA:
    	
    		hwaveout=OpenWaveOut(hWnd);
    		wavehdr=WaveOut(hwaveout,wavehdr,&((PWAVEHDR)lParam)->lpData,20000);
    		
    		
    		//dwDataLength = ((PWAVEHDR)dwParam2)->dwBytesRecorded ;
    		//MessageBox(0,"MM_WIM_DATA:","err",MB_OK);
    		//waveInAddBuffer (hWaveIn, (PWAVEHDR)dwParam2, sizeof (WAVEHDR));
    		
    		//if (waveInStop(m_hWaveIn) )MessageBox(0,"停止录音失败","err",MB_OK);
	 	//if (waveInReset(m_hWaveIn) )MessageBox(0,"重置内存区失败","err",MB_OK);
	   	//waveInClose (m_hWaveIn);
	   	//waveinclose();
    		//waveout(hWnd,((PWAVEHDR)lParam)->lpData,((PWAVEHDR)lParam)->dwBytesRecorded );
		//MessageBox(hWnd,"Stop","err",MB_OK);
       	break;
    	case MM_WOM_DONE:
    	CloseWaveOut(hwaveout);
    	CloseWaveIn(hWaveIn);
    		
    	//释放播放完的缓冲区,并准备新的数据  
	//waveOutPrepareHeader (hWaveOut,(PWAVEHDR)lParam,sizeof(WAVEHDR));
      // waveOutWrite(hWaveOut,(PWAVEHDR)lParam,sizeof(WAVEHDR));

    	
    	break;
    	case MM_WIM_CLOSE:
    	
    	GlobalFree(
    		GlobalHandle( 
    				((WAVEHDR*)lParam)->lpData 
    			) 
    		);
    	
    	
    	if (waveInUnprepareHeader(hWaveIn, (WAVEHDR*)lParam, sizeof(WAVEHDR)))
	MessageBox(0,"Un_Prepare Header 失败","err",MB_OK);
	
	GlobalFree(GlobalHandle(lParam));
	
    	break;
    	
	default:
		return FALSE;
	}
return TRUE;
}





HWAVEIN OpenWaveIn(HWND hWnd)
{
	HWAVEIN m_hWaveIn;
	WAVEFORMATEX waveformat;
	ZeroMemory(&waveformat,0,sizeof(waveformat));
	waveformat.wFormatTag=WAVE_FORMAT_PCM;
	waveformat.nChannels=1;
	waveformat.nSamplesPerSec=8000;
	waveformat.nAvgBytesPerSec=8000;
	waveformat.nBlockAlign=1;
	waveformat.wBitsPerSample=8; //指定录音格式
	waveformat.cbSize=0;
	
	if (!waveInGetNumDevs())
	{
		//ssageBox(0,"没有可以使用的 waveIn 通道","err",MB_OK);
		return -1;
	}
	
	if (waveInOpen(
		&m_hWaveIn,            //输入设备句柄
		WAVE_MAPPER,            //输入设备ID
		&waveformat,       //录音格式指针
		hWnd,          //处理MM_WIM_***消息的回调函数或窗口句柄,线程ID
		0,  			// DWORD dwCallbackInstance,  
		CALLBACK_WINDOW	//CALLBACK_WINDOW 处理消息方式的符号位
		)!= MMSYSERR_NOERROR )return -1;// MessageBox(0,"打开 waveIn 通道失败","err",MB_OK);
  	return m_hWaveIn;
}
WAVEHDR* StartWaveIn(HWAVEIN m_hWaveIn,DWORD datasize)
{	
	WAVEHDR * m_pWaveHdr;
	
	m_pWaveHdr=(WAVEHDR *)GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, sizeof(WAVEHDR));
	m_pWaveHdr->lpData = (char *)GlobalLock( GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, datasize) );
	memset(m_pWaveHdr->lpData, 0, datasize );
	m_pWaveHdr->dwBufferLength = datasize;
	m_pWaveHdr->dwBytesRecorded = 0;
	m_pWaveHdr->dwUser = 0;
	m_pWaveHdr->dwFlags = 0;
	m_pWaveHdr->dwLoops = 0;
	if ( waveInPrepareHeader( m_hWaveIn, m_pWaveHdr, sizeof(WAVEHDR) )!= MMSYSERR_NOERROR )
	 return 0;//MessageBox(0,"打开 waveIn 通道失败","err",MB_OK);
   	waveInAddBuffer (m_hWaveIn, m_pWaveHdr, sizeof (WAVEHDR));
   	if (waveInStart(m_hWaveIn) )return 0;//MessageBox(0,"开始录音失败","err",MB_OK);
	return m_pWaveHdr;
}
int CloseWaveIn(HWAVEIN m_hWaveIn)
{	
	if (waveInStop(m_hWaveIn)== MMSYSERR_NOERROR )return -1; //关闭录音设备失败
	if (!waveInClose(m_hWaveIn)==MMSYSERR_NOERROR)return -1;//Global Free 失败
	return 0;	 
}
HWAVEOUT OpenWaveOut(HWND hWnd)
{
	WAVEFORMATEX waveform;
	HWAVEOUT hWaveOut;

	waveform.wFormatTag	=WAVE_FORMAT_PCM;
	waveform.nChannels	=1;
	waveform.nSamplesPerSec	=8000;
	waveform.nAvgBytesPerSec=8000;
	waveform.nBlockAlign	=1;
	waveform.wBitsPerSample	=8;
	waveform.cbSize		=0;
	if (waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,hWnd,NULL,CALLBACK_WINDOW))return -1;
return hWaveOut;
}
WAVEHDR * WaveOut(HWAVEOUT hWaveOut,WAVEHDR * m_pWaveHd,LPSTR *buf,DWORD dwDataLength)
{
	

	if(m_pWaveHd==0)m_pWaveHd=(WAVEHDR*)GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, sizeof(WAVEHDR));
	if(*buf==0)*buf=(LPTSTR)GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE, dwDataLength);
	
	m_pWaveHd->lpData          = *buf ;
	m_pWaveHd->dwBufferLength  = dwDataLength ;
	m_pWaveHd->dwBytesRecorded = 0 ;
	m_pWaveHd->dwUser          = 0 ;
	m_pWaveHd->dwFlags         = WHDR_BEGINLOOP | WHDR_ENDLOOP ;
	m_pWaveHd->dwLoops         = 1 ;
	m_pWaveHd->lpNext          = NULL ;
	m_pWaveHd->reserved        = 0 ;
	waveOutPrepareHeader (hWaveOut,m_pWaveHd,sizeof (WAVEHDR)) ;
	//回放开始
	//MessageBeep(MB_ICONEXCLAMATION);
	waveOutWrite (hWaveOut,m_pWaveHd, sizeof (WAVEHDR));
	
}
int CloseWaveOut(HWAVEOUT hWaveOut)
{
	waveOutRestart(hWaveOut);
	waveOutClose(hWaveOut);
}
DWORD FCC(LPSTR lpStr)
{
  DWORD Number = lpStr[0] + lpStr[1] *0x100 + lpStr[2] *0x10000 + lpStr[3] *0x1000000 ;
  return Number;
}
void saveFile(HWND hWnd,LPTSTR pSaveBuffer,DWORD dwDataLength)
{	
	HANDLE FileHandle;
	DWORD NumToWrite=0;
	DWORD dwNumber = 0;
	FileHandle =CreateFile( "myTest.wav", GENERIC_WRITE, FILE_SHARE_READ, NULL, 
			   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	// memset(m_pWaveHdr.lpData, 0, datasize);
	// 拷贝刚录制的缓存中的内容进入保存数据区,dwDataLength为数据区中已有内容
 	/*CopyMemory (pSaveBuffer + dwDataLength, ((PWAVEHDR) lParam)->lpData,
	((PWAVEHDR) lParam)->dwBytesRecorded) ;
 
	dwDataLength += ((PWAVEHDR) lParam)->dwBytesRecorded ;
 	*/
	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, &waveformatf, 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; // 收尾关闭句柄
	
}

⌨️ 快捷键说明

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