Filter.cpp
上传用户:amei960
上传日期:2007-02-05
资源大小:143k
文件大小:2k
源码类别:

Audio

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "Filter.h"
  3. #include  <math.h>
  4. CFilter::CFilter()
  5. {
  6. m_hWnd = NULL;
  7. wBitsPerSample = 0;
  8. }
  9. CFilter::~CFilter()
  10. {
  11. m_MDC.DeleteDC();
  12. }
  13. void CFilter::Init(HWND hWnd,unsigned short wBits)
  14. {
  15. m_hWnd = hWnd;
  16. wBitsPerSample = wBits;
  17. m_MDC.CreateCompatibleDC (NULL);
  18. brush.CreateSolidBrush(RGB(0,0,0));
  19. pen.CreatePen (PS_SOLID,0,RGB(0,255,0));
  20. GetClientRect(hWnd,&memrec);
  21. }
  22. int CFilter::Filter(char* pBuf)
  23. {
  24. if( m_hWnd == NULL || wBitsPerSample == 0 )
  25. return -1;
  26. BOOL bTalk = FALSE;
  27. int x,y;
  28. CBitmap m_bitmap;
  29. CBitmap *m_pOldBitmap;
  30. m_bitmap.CreateCompatibleBitmap(CDC::FromHandle (GetDC(m_hWnd)),memrec.Width (),memrec.Height ());
  31. m_pOldBitmap =(CBitmap*)SelectObject(m_MDC.GetSafeHdc (),m_bitmap);
  32. m_MDC.Rectangle (0,0,memrec.Width (),memrec.Height ());
  33. oldpen = m_MDC.SelectObject (&pen);
  34. m_MDC.FillRect(memrec,&brush);
  35. DWORD size;
  36. size = wBitsPerSample == 16 ? SIZE_AUDIO_FRAME/2 : SIZE_AUDIO_FRAME;
  37. int yy = memrec.Height()/2;
  38. m_MDC.MoveTo (0,yy);
  39. int h=yy;
  40. short sample;
  41. for(int register i = 0 ; i <(long)size ; i++) //to draw first channel
  42. {
  43. sample = wBitsPerSample == 16 ? ((*((short*)pBuf+i))*h)/(65535/2) : ( (*((BYTE*)pBuf+i)-128)*h)/128;
  44. x = int(((float)i/size)*(memrec.Width()));
  45. y = yy-sample;
  46. if( abs(sample) > 15 && !bTalk )
  47. {
  48. bTalk = TRUE;
  49. }
  50. m_MDC.LineTo (x,y);
  51. }
  52. m_MDC.SelectObject(oldpen);
  53. CRect rc;
  54. GetClientRect(m_hWnd,&rc);
  55. StretchBlt(GetDC(m_hWnd),0,0,rc.Width (),rc.Height (),m_MDC.GetSafeHdc(),0,0,memrec.Width ()
  56. ,memrec.Height(),SRCCOPY);
  57. if( bTalk )
  58. return 1;
  59. return 0;
  60. }