home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2004 September / maximum-cd-2004-09.iso / Software / Extras / nbeep03.exe / Source / main.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-21  |  7.6 KB  |  291 lines

  1. #include <windows.h>
  2. #include <math.h>
  3. #include "ipdh.h"
  4.  
  5. #include "resource.h"
  6.  
  7. const char *G_CAPTION="Nullsoft Beep v0.3 (Status Window)";
  8.  
  9. int (*beepdll_get)();
  10. void (*beepdll_init)(HWND,HINSTANCE);
  11. void (*beepdll_quit)();
  12.  
  13. extern void audioClose();
  14. extern char *audioOpen(HWND);
  15.  
  16. HINSTANCE g_hlib;
  17.  
  18. int need_beep;
  19. int g_cpu_use=0;
  20. double cpu_scale;
  21.  
  22. typedef PDH_STATUS (WINAPI *PDH_OPEN)(LPCTSTR, DWORD_PTR, HQUERY);
  23. typedef PDH_STATUS (WINAPI *PDH_ADD)(HQUERY, LPCTSTR, DWORD_PTR, HCOUNTER);
  24. typedef PDH_STATUS (WINAPI *PDH_CLOSE)(HQUERY);
  25. typedef PDH_STATUS (WINAPI *PDH_FORMAT)(HCOUNTER, DWORD, LPDWORD, PPDH_FMT_COUNTERVALUE);
  26. typedef PDH_STATUS (WINAPI *PDH_COLLECT)(HQUERY);
  27.  
  28. int pdh_err;
  29. PDH_OPEN PdhOpenQuery;
  30. PDH_ADD PdhAddCounter;
  31. PDH_CLOSE PdhCloseQuery;
  32. PDH_FORMAT PdhGetFormattedCounterValue;
  33. PDH_COLLECT PdhCollectQueryData;
  34. HMODULE PdhLib;
  35. HQUERY   PdhQuery;
  36. HCOUNTER PdhCounter;
  37.  
  38. int get_cpu_usage()
  39. {
  40.   int ret=50;
  41.   DWORD Reserved,dataType,dataLen=4096;
  42.  
  43.   OSVERSIONINFO os = { sizeof(OSVERSIONINFO), };
  44.   GetVersionEx(&os);
  45.   if (pdh_err) return 69;
  46.   if (os.dwPlatformId == VER_PLATFORM_WIN32_NT) 
  47.   {
  48.     if (!PdhLib) PdhLib=LoadLibrary("pdh.dll");
  49.     if (PdhLib)
  50.     {
  51.       if (!PdhOpenQuery)
  52.       {
  53.         PdhOpenQuery = (PDH_OPEN)GetProcAddress (PdhLib,"PdhOpenQueryA");
  54.         PdhAddCounter = (PDH_ADD)GetProcAddress(PdhLib, "PdhAddCounterA");
  55.         PdhCloseQuery = (PDH_CLOSE)GetProcAddress (PdhLib,"PdhCloseQuery");
  56.         PdhGetFormattedCounterValue = (PDH_FORMAT)GetProcAddress(PdhLib, "PdhGetFormattedCounterValue");
  57.         PdhCollectQueryData = (PDH_COLLECT)GetProcAddress(PdhLib, "PdhCollectQueryData");
  58.       }
  59.       if (PdhOpenQuery && PdhAddCounter && PdhCloseQuery && PdhGetFormattedCounterValue && PdhCollectQueryData) 
  60.       {
  61.  
  62.         if (PdhQuery || PdhOpenQuery( NULL, 0, &PdhQuery ) == ERROR_SUCCESS)
  63.         {
  64.           if (!PdhCounter) PdhAddCounter( PdhQuery, "\\Processor(_Total)\\% Processor Time", 0, &PdhCounter );
  65.           
  66.           PDH_FMT_COUNTERVALUE fmtValue;
  67.           PdhCollectQueryData( PdhQuery );
  68.           PdhGetFormattedCounterValue(PdhCounter, PDH_FMT_LONG, 0, &fmtValue);
  69.           ret = fmtValue.longValue;
  70.         }
  71.       }
  72.       else pdh_err=1;
  73.     }
  74.     else pdh_err=1;
  75.   } 
  76.   else 
  77.   {
  78.     HKEY regperfcpu;
  79.     HKEY startregperfcpu;
  80.     char data[4096];
  81.     
  82.     if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StatData", ®perfcpu) == ERROR_SUCCESS)
  83.     {
  84.       if (RegOpenKey(HKEY_DYN_DATA, "PerfStats\\StartStat", &startregperfcpu) == ERROR_SUCCESS)
  85.       {
  86.         if (RegQueryValueEx(startregperfcpu, "KERNEL\\CPUUsage", &Reserved, &dataType, (UCHAR *) data, &dataLen) == ERROR_SUCCESS &&
  87.             RegQueryValueEx(regperfcpu, "KERNEL\\CPUUsage", &Reserved, &dataType, (UCHAR *) data, &dataLen) == ERROR_SUCCESS)
  88.           ret=*data;
  89.         // got it.
  90.         RegCloseKey(startregperfcpu);
  91.       }
  92.       RegCloseKey(regperfcpu);
  93.     }
  94.   }
  95.  
  96.     return ret;
  97. }
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104. void generate_samples(short *buf, int samplelength)
  105. {
  106.   int x;
  107.   static double last_cpu_scale;
  108.   for (x = 0; x < samplelength; x ++)
  109.   {
  110.     double d=0.0;
  111.  
  112.     // pulsing low frequencies
  113.     {
  114.       static double a=0.0;
  115.       d+=sin(a)*sin(a*0.004) * last_cpu_scale;
  116.       a+=3.14159*100/44100.0;
  117.       last_cpu_scale=last_cpu_scale*0.99999+cpu_scale*0.00001;
  118.     }
  119.  
  120.     // beeps  
  121.     if (need_beep>0) {
  122.       static double pv=0.1;
  123.       static int t;
  124.       if (t++ > 0)
  125.       {
  126.         if (t > 1000) 
  127.         {
  128.           need_beep--;
  129.           pv=0.05+(double)(rand()%1024)*0.2/1024.0;
  130.           t=0;
  131.         }
  132.         else d+=sin(t*pv)*0.05;
  133.       }
  134.     }
  135.  
  136.     int iv;
  137.     iv=(int)(d*32767.5 - 0.5);
  138.     if (iv < -32768) iv=-32768;
  139.     else if (iv > 32767) iv=32767;
  140.     buf[x]=(short)iv;
  141.   }
  142. }
  143. void systray_add(HWND hwnd)
  144. {
  145.   NOTIFYICONDATA tnid;
  146.   tnid.cbSize = sizeof(NOTIFYICONDATA);
  147.   tnid.hWnd = hwnd;
  148.   tnid.uID = 6969;
  149.   tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
  150.   tnid.uCallbackMessage = WM_USER+6969;
  151.   tnid.hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1));
  152.   strcpy(tnid.szTip,"Nullsoft Beep");
  153.   Shell_NotifyIcon(NIM_ADD, &tnid);
  154. }
  155.  
  156. void systray_del(HWND hwnd)
  157. {
  158.   NOTIFYICONDATA tnid;
  159.   tnid.cbSize = sizeof(NOTIFYICONDATA);
  160.   tnid.hWnd = hwnd;
  161.   tnid.uID = 6969;
  162.   Shell_NotifyIcon(NIM_DELETE, &tnid);
  163. }
  164.  
  165.  
  166. void SetAutoRunKey(int add)
  167. {
  168.   HKEY key;
  169.   if (RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&key) == ERROR_SUCCESS) 
  170.   {
  171.     if (add)
  172.     {
  173.       char s[1024];
  174.       s[0]='\"';
  175.       GetModuleFileName(NULL,s+1,sizeof(s)-2);
  176.       lstrcat(s,"\"");
  177.       RegSetValueEx(key,"NullsoftBeep",0,REG_SZ,(unsigned char*)s,strlen(s));
  178.     }
  179.     else 
  180.       RegDeleteValue(key,"NullsoftBeep");
  181.     RegCloseKey(key);
  182.   }
  183. }
  184.  
  185. int g_need_audioclose;
  186.  
  187. int g_needhide=1;
  188.  
  189. static BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) 
  190. {
  191.   switch (uMsg)
  192.   {
  193.     case WM_USER+6969:
  194.       if (LOWORD(lParam) == WM_LBUTTONDOWN && !IsWindowVisible(hwndDlg))
  195.         ShowWindow(hwndDlg,SW_SHOW);
  196.     return 0;
  197.     case WM_INITDIALOG:
  198.       systray_add(hwndDlg);
  199.       SetWindowText(hwndDlg,G_CAPTION);
  200.       if (beepdll_init) beepdll_init(hwndDlg,g_hlib);
  201.  
  202.       {
  203.         char *t=audioOpen(hwndDlg);
  204.         if (t)
  205.         {
  206.           MessageBox(hwndDlg,t,"Nullsoft Beep - Error Initializing Audio",MB_OK|MB_ICONSTOP);
  207.         }
  208.         else g_need_audioclose=1;
  209.       }
  210.       SetAutoRunKey(1);
  211.       SetTimer(hwndDlg,1,100,NULL);
  212.     return 0;
  213.     case WM_TIMER:
  214.       if (g_needhide) 
  215.       {
  216.         g_needhide=0;
  217.         ShowWindow(hwndDlg,SW_HIDE);
  218.       }
  219.       {
  220.         static int a;
  221.         if (a++ > 10)
  222.         {
  223.           a=0;
  224.           char data[512];
  225.           g_cpu_use=get_cpu_usage();
  226.           if (g_cpu_use < 0) g_cpu_use=0;
  227.           wsprintf(data,"System CPU utilization: %d%%",g_cpu_use);
  228.           SetDlgItemText(hwndDlg,IDC_CPU,data);
  229.           double t=(g_cpu_use*1.25/(double)(100.0));
  230.           if (t<0.05) t=0.05;
  231.           if (t>1.0) t=1.0;
  232.           cpu_scale=t;
  233.         }
  234.       }
  235.   
  236.       if (beepdll_get) 
  237.       {
  238.         int a=beepdll_get();
  239.         if (a > 16) a= 16;
  240.         if (a) need_beep+=2+(rand()%6);
  241.       }
  242.     return 0;
  243.     case WM_COMMAND:
  244.       switch (LOWORD(wParam))
  245.       {
  246.         case IDCANCEL:
  247.           ShowWindow(hwndDlg,SW_HIDE);
  248.         break;
  249.         case ID_QUIT:
  250.           systray_del(hwndDlg);
  251.           SetAutoRunKey(0);
  252.           EndDialog(hwndDlg,0);
  253.         break;
  254.       }
  255.     return 0;
  256.     case WM_CLOSE:
  257.       ShowWindow(hwndDlg,SW_HIDE);
  258.     return 0;
  259.     case WM_ENDSESSION:
  260.       if (wParam) EndDialog(hwndDlg,0);
  261.     return 0;
  262.   }
  263.   return 0;
  264. }
  265.  
  266. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow)
  267. {
  268.   if (FindWindow("#32770",G_CAPTION)) return 0;
  269.   g_hlib=LoadLibrary("beep.dll");
  270.   if (g_hlib)
  271.   {
  272.     beepdll_get=(int(__cdecl*)(void))GetProcAddress(g_hlib,"get");
  273.     beepdll_init=(void(__cdecl*)(HWND,HINSTANCE))GetProcAddress(g_hlib,"init");
  274.     beepdll_quit=(void(__cdecl*)(void))GetProcAddress(g_hlib,"quit");
  275.   }
  276.  
  277.   if (beepdll_get)
  278.   {
  279.     DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,dlgProc);
  280.     if (g_need_audioclose) audioClose();
  281.  
  282.     if (beepdll_quit) beepdll_quit();
  283.   }
  284.   else 
  285.     MessageBox(NULL,"Error loading beep.dll", "Nullsoft Beep Error",MB_OK|MB_ICONSTOP);
  286.   if (PdhCloseQuery && PdhQuery) PdhCloseQuery(PdhQuery);
  287.   if (PdhLib) FreeModule(PdhLib);
  288.   if (g_hlib) FreeModule(g_hlib);
  289.   return 0;
  290. }
  291.