www.pudn.com > 声卡实时录音并显示波形.zip > SND_WAVE.C


/*@@ Wedit generated application. Written Mon Jun 03 15:53:20 2002 
 @@header: d:\my\prog\wav\lcc\snd_wavewiz.h 
 @@resources: d:\my\prog\wav\lcc\snd_wave.rc 
 Do not edit outside the indicated areas */ 
/*<---------------------------------------------------------------------->*/ 
/*<---------------------------------------------------------------------->*/ 
#include  
#include  
#include  
#include  
#include  
 
#include "snd_wavewiz.h" 
 
/*<---------------------------------------------------------------------->*/ 
 
#define MAX_INQUEU 8 
#define BUFSIZE    1024 
 
typedef void (__stdcall *PFNFFT)(double InReal[],double InImag[],double OutReal[],double OutImag[],int n,int k); 
/* FFT function from DEMO.DLL */ 
/* n=2^k */ 
 
PFNFFT pfnFft; 
 
static HINSTANCE hInst;		// Instance handle 
static HWND hwndMain;		//Main window handle 
static HDC whdc; 
static HMODULE hMod; 
static HPEN hpenB,hpenG,hpenOld; 
static HWAVEIN hwi; 
static WAVEHDR *pwhi,whis[MAX_INQUEU]; 
static char waveBufferRecord[MAX_INQUEU][BUFSIZE]; 
static DWORD currWavHdr=0,nextWavHdr; 
static BOOL b_playing; 
 
static LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); 
 
static void waveInit(HWND hWnd,WORD FormatTag,WORD Channel,DWORD Samples,WORD Bits) 
{ 
	WAVEFORMATEX wfx; 
	long k; 
 
	memset(&wfx,0,sizeof(WAVEFORMATEX)); 
	wfx.wFormatTag=WAVE_FORMAT_PCM; 
	wfx.nChannels=Channel; 
	wfx.wBitsPerSample=Bits; 
	wfx.nSamplesPerSec=Samples; 
	wfx.nBlockAlign=Bits*Channel/8; 
	wfx.nAvgBytesPerSec=Samples*Bits*Channel/8; 
	wfx.cbSize=0; 
	waveInOpen(&hwi,0,&wfx,(DWORD)hWnd,0,CALLBACK_WINDOW|WAVE_MAPPED); 
	for(k=0;kdwFlags=0; 
		pwhi->dwLoops=0; 
		pwhi->dwBytesRecorded=0; 
		pwhi->dwBufferLength=BUFSIZE; 
		pwhi->lpData=waveBufferRecord[k]; 
	} 
	for(k=0;klpData[0]),NULL); 
  for(i=1;i<512;i++) 
  { 
    LineTo(hdc,i,(unsigned char)(whdr->lpData[i])); 
  } 
  SelectObject(hdc, hpenOld); 
 
  memcpy(prevBuf,whdr->lpData,whdr->dwBytesRecorded); 
  prevBytes=whdr->dwBytesRecorded; 
} 
 
static void DrawFreq(WAVEHDR *whdr,HDC hdc) 
{ 
  static double prevFreqI[BUFSIZE]; 
  static double currFreqI[BUFSIZE]; 
  static double prevFreqR[BUFSIZE]; 
  static double currFreqR[BUFSIZE]; 
  double WaveR[BUFSIZE]; 
  double WaveI[BUFSIZE]; 
  DWORD i; 
 
  memset(WaveR,0,BUFSIZE*sizeof(double)); 
  memset(WaveI,0,BUFSIZE*sizeof(double)); 
  for(i=0;idwBytesRecorded;i++) 
  { 
    WaveR[i]=(unsigned char)whdr->lpData[i]-128; 
  } 
  pfnFft(WaveR,WaveI,currFreqR,currFreqI,1024,10); 
 
  hpenOld = SelectObject(hdc, hpenB); 
  MoveToEx(hdc,0,380,NULL); 
 
  for(i=0;i*/ 
/*@@0->@@*/ 
static BOOL InitApplication(void) 
{ 
	WNDCLASS wc; 
 
	memset(&wc,0,sizeof(WNDCLASS)); 
	wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ; 
	wc.lpfnWndProc = (WNDPROC)MainWndProc; 
	wc.hInstance = hInst; 
	wc.hbrBackground = CreateSolidBrush(0);//(HBRUSH)(COLOR_WINDOW+1); 
	wc.lpszClassName = "snd_waveWndClass"; 
	wc.lpszMenuName = MAKEINTRESOURCE(IDMAINMENU); 
	wc.hCursor = LoadCursor(NULL,IDC_ARROW); 
	wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); 
	if (!RegisterClass(&wc)) 
		return 0; 
/*@@0<-@@*/ 
	// ---TODO--- Call module specific initialization routines here 
 
	return 1; 
} 
 
/*<---------------------------------------------------------------------->*/ 
/*@@1->@@*/ 
static HWND Createsnd_waveWndClassWnd(void) 
{ 
	return CreateWindow("snd_waveWndClass","Sound Wave Display", 
		WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CAPTION|WS_BORDER|WS_SYSMENU, 
		100,100,530,450, 
		NULL, 
		NULL, 
		hInst, 
		NULL); 
} 
/*@@1<-@@*/ 
/*<---------------------------------------------------------------------->*/ 
/* --- The following code comes from D:\MY\PROG\EXAM\lcc\lib\wizard\defOnCmd.tpl. */ 
static void MainWndProc_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) 
{ 
	switch(id) { 
		// ---TODO--- Add new menu commands here 
		/*@@NEWCOMMANDS@@*/ 
		case IDM_EXIT: 
			PostMessage(hwnd,WM_CLOSE,0,0); 
			break; 
		case IDM_ABOUT: 
			MessageBox(hwnd,"Author:NowCan\nhttp://nowcan.yeah.net","About Sound Wave Display",MB_OK|MB_ICONINFORMATION); 
		    break; 
	} 
} 
 
/*<---------------------------------------------------------------------->*/ 
/*@@2->@@*/ 
static LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) 
{ 
  int i; 
	switch (msg) { 
/*@@3->@@*/ 
	case WM_COMMAND: 
		HANDLE_WM_COMMAND(hwnd,wParam,lParam,MainWndProc_OnCommand); 
		break; 
	case WM_DESTROY: 
		b_playing=FALSE; 
		waveInReset(hwi); 
		for(i=0;idwFlags=0; 
			pwhi->dwLoops=0; 
			waveInPrepareHeader(hwi,pwhi,sizeof(WAVEHDR)); 
			waveInAddBuffer(hwi,pwhi,sizeof(WAVEHDR)); 
		} 
		whdc=GetDC(hwnd); 
		if(pfnFft) 
			DrawFreq((WAVEHDR *)lParam,whdc); 
		DrawWave((WAVEHDR *)lParam,whdc); 
		ReleaseDC(hwnd,whdc); 
		break; 
	default: 
		return DefWindowProc(hwnd,msg,wParam,lParam); 
	} 
/*@@3<-@@*/ 
	return 0; 
} 
/*@@2<-@@*/ 
 
/*<---------------------------------------------------------------------->*/ 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) 
{ 
	MSG msg; 
	HANDLE hAccelTable; 
 
	hInst = hInstance; 
	if (!InitApplication()) 
		return 0; 
	hAccelTable = LoadAccelerators(hInst,MAKEINTRESOURCE(IDACCEL)); 
	if ((hwndMain = Createsnd_waveWndClassWnd()) == (HWND)0) 
		return 0; 
	ShowWindow(hwndMain,SW_SHOW); 
	while (GetMessage(&msg,NULL,0,0)) { 
		if (!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)) { 
			TranslateMessage(&msg); 
			DispatchMessage(&msg); 
		} 
	} 
	return msg.wParam; 
}