#include #define INP_BUFFER_SIZE 256 #define IDM_SYS_ABOUT 1000 #define ID_START 1001 static BOOL bStart = FALSE; static DWORD dwDataLength; static HWAVEIN hWaveIn ; static PBYTE pBuffer1, pGraficBuffer ; static PWAVEHDR pWaveHdr01; static TCHAR szOpenError[] = TEXT ("Eroare la deschiderea placii de sunet!"); static TCHAR szMemError [] = TEXT ("Eroare la alocarea memoriei RAM") ; static WAVEFORMATEX waveform ; TCHAR szAppName[] = TEXT ("Osciloscop"); int cxChar, cyChar; int i=0; BYTE y; // structuri sistem HINSTANCE hInstance; HWND hwnd; HWND hwndButton[6]; HMENU hMenu, hMenuPopup; HDC hdc; MSG msg; PAINTSTRUCT ps; RECT rect; HBRUSH hBrush; HPEN PenGreen; void DrawWave(void); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int AskConfirmation (HWND hwnd) { return MessageBox (hwnd, "Parasim programul ?", szAppName, MB_YESNO | MB_ICONQUESTION); } // Intrarea in program prin apelarea functiei WinMain int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { //initializarea clasei wndclass WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = szAppName; wndclass.lpszClassName = szAppName ; // inregistrarea clasei // daca au aparut ceva probleme se iasa din program if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("Windows NT !"), szAppName, MB_ICONERROR); return 0; } // deschiderea ferestrei hwnd = CreateWindow (szAppName, TEXT ("Osciloscop audio"), WS_OVERLAPPEDWINDOW, 250, 150, 512, 350, NULL, NULL, hInstance, NULL); // extensie meniu sistem hMenu = GetSystemMenu(hwnd, FALSE); AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); AppendMenu(hMenu, MF_STRING, IDM_SYS_ABOUT, TEXT ("Info")); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); // Initializarea placii de sunet // alocarea memoriei pWaveHdr01 = (PWAVEHDR)malloc (sizeof(WAVEHDR)); pBuffer1 = (PBYTE)malloc (INP_BUFFER_SIZE); pGraficBuffer = (PBYTE)malloc (INP_BUFFER_SIZE); waveform.wFormatTag = WAVE_FORMAT_PCM ; waveform.nChannels = 1 ; waveform.nSamplesPerSec = 8000 ; // 11025 waveform.nAvgBytesPerSec = 8000 ; // 11025 waveform.nBlockAlign = 1 ; waveform.wBitsPerSample = 8 ; waveform.cbSize = 0 ; if (waveInOpen (&hWaveIn, WAVE_MAPPER, &waveform, (DWORD) hwnd, 0, CALLBACK_WINDOW)) { free (pBuffer1) ; free (pGraficBuffer); MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, szOpenError, szAppName, MB_ICONEXCLAMATION | MB_OK) ; } // Initializarea header-ului pWaveHdr01->lpData = LPSTR(pBuffer1) ; pWaveHdr01->dwBufferLength = INP_BUFFER_SIZE ; pWaveHdr01->dwBytesRecorded = 0 ; pWaveHdr01->dwUser = 0 ; pWaveHdr01->dwFlags = 0 ; pWaveHdr01->dwLoops = 1 ; pWaveHdr01->lpNext = NULL ; pWaveHdr01->reserved = 0 ; waveInPrepareHeader (hWaveIn, pWaveHdr01, sizeof (WAVEHDR)) ; //bucla principala ( de mesaje ) while (msg.message != WM_QUIT) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage (&msg); DispatchMessage (&msg); } else { if(bStart) { DrawWave(); bStart=FALSE; } } } return 0 ; } //functia fereastra LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: cxChar = LOWORD (GetDialogBaseUnits ()); cyChar = HIWORD (GetDialogBaseUnits ()); hwndButton[0] = CreateWindow ( TEXT("button"), "Start", WS_CHILD | WS_VISIBLE | BS_CENTER | BS_PUSHBUTTON, 2* cxChar, 2* cyChar, 9 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) ID_START, hInstance, NULL); PenGreen = CreatePen(PS_SOLID, 1, RGB(0, 255, 0)); hBrush = CreateSolidBrush(RGB(255,255,255)); SetRect(&rect, 0, 0, 512, 350); return 0; case WM_PAINT: hdc= BeginPaint (hwnd, &ps); EndPaint (hwnd, &ps); return 0; case WM_COMMAND: // START if(LOWORD(wParam) == ID_START) { waveInAddBuffer (hWaveIn, pWaveHdr01, sizeof (WAVEHDR)) ; dwDataLength = 0 ; waveInStart (hWaveIn) ; bStart = TRUE; } return 0; case MM_WIM_DATA: // Salvarea datelor in bufferul rezervat pentru grafica CopyMemory (pGraficBuffer, ((PWAVEHDR) lParam)->lpData,INP_BUFFER_SIZE); bStart=TRUE; // bufferul pBuffer1 este pregatit pentru memorarea datelor noi waveInAddBuffer (hWaveIn, pWaveHdr01, sizeof (WAVEHDR)) ; return TRUE ; case MM_WIM_CLOSE: return 0; // sa ales din meniu 'Info' ? case WM_SYSCOMMAND: switch(LOWORD(wParam)) { case IDM_SYS_ABOUT: MessageBox(hwnd, TEXT("Vy 73's de YO2CMI\nBernardt Huth"),szAppName, MB_OK); return 0; } break; case WM_CLOSE: if (IDYES == AskConfirmation(hwnd)) { DestroyWindow(hwnd); } return 0; // iesire din program case WM_DESTROY: // Oprirea inregistrarii, eliberarea memoriei waveInReset (hWaveIn) ; waveInUnprepareHeader (hWaveIn, pWaveHdr01, sizeof (WAVEHDR)) ; free (pBuffer1) ; free (pGraficBuffer); DeleteObject(PenGreen); DeleteObject(hBrush); PostQuitMessage (0); return 0; } return DefWindowProc ( hwnd, message, wParam,lParam); } // rutina afisare grafica void DrawWave(void) { hdc=GetDC(hwnd); FillRect(hdc, &rect, hBrush); MoveToEx(hdc, 1, *(pGraficBuffer), NULL); SelectObject(hdc, PenGreen); for(i=0; i<256;i=i+1) { y=*(pGraficBuffer+i); LineTo(hdc,i*2+1,y); } ReleaseDC(hwnd, hdc); }