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;k dwFlags=0; pwhi->dwLoops=0; pwhi->dwBytesRecorded=0; pwhi->dwBufferLength=BUFSIZE; pwhi->lpData=waveBufferRecord[k]; } for(k=0;k lpData[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;i dwBytesRecorded;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;i dwFlags=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; }