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

Audio

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "WaveIn.h"
  3. #pragma comment(lib,"Winmm")
  4. CWaveIn::CWaveIn()
  5. {
  6. memset(&waveCaps,0,sizeof(waveCaps));
  7. bDevOpen = FALSE;
  8. bStartData = FALSE;
  9. bBuffer = FALSE;
  10. m_hWave = 0;
  11. m_hWnd = 0;
  12. //----------
  13. nChannels = 1;
  14. dwHertZ = HERTZ_POOR;
  15. wBits = 16;
  16. //----------
  17. m_pHead = NULL;
  18. }
  19. CWaveIn::~CWaveIn()
  20. {
  21. FreeBuffer();
  22. }
  23. BOOL CWaveIn::IsExistDevice()
  24. {
  25. if( waveInGetNumDevs() <= 0 )
  26. {
  27. return FALSE;
  28. }
  29. return TRUE;
  30. }
  31. WAVEINCAPS* CWaveIn::GetDeviceCap()
  32. {
  33. MMRESULT mRet = waveInGetDevCaps(WAVE_MAPPER,&waveCaps,sizeof(waveCaps));
  34. if( mRet == MMSYSERR_NOERROR )
  35. return &waveCaps;
  36. return NULL;
  37. }
  38. BOOL CWaveIn::Open()
  39. {
  40. if( bDevOpen )
  41. {
  42. return FALSE;
  43. }
  44. if( m_hWnd == 0 )
  45. {
  46. return FALSE;
  47. }
  48. MMRESULT mRet;
  49. WAVEFORMATEX wfx;
  50. wfx.wFormatTag = WAVE_FORMAT_PCM;
  51. wfx.nChannels = nChannels;
  52. wfx.nSamplesPerSec = dwHertZ;
  53. wfx.nAvgBytesPerSec = nChannels * dwHertZ * wBits / 8;
  54. wfx.nBlockAlign = wBits * nChannels / 8;
  55. wfx.wBitsPerSample = wBits;
  56. wfx.cbSize = 0;
  57. mRet = waveInOpen(0,WAVE_MAPPER,&wfx,0,0,WAVE_FORMAT_QUERY);
  58. if( mRet != MMSYSERR_NOERROR )
  59. {
  60. return FALSE;
  61. }
  62. mRet = waveInOpen(&m_hWave,WAVE_MAPPER,&wfx,
  63. (DWORD)m_hWnd,0,CALLBACK_WINDOW);
  64. if( mRet != MMSYSERR_NOERROR )
  65. {
  66. return FALSE;
  67. }
  68. bDevOpen = TRUE;
  69. return TRUE;
  70. }
  71. void CWaveIn::Close()
  72. {
  73. if (!bDevOpen)
  74. {
  75. return;
  76. }
  77. if(!m_hWave)
  78. {
  79. return;
  80. }
  81. MMRESULT mRet = waveInClose(m_hWave);
  82. if( mRet != MMSYSERR_NOERROR )
  83. {
  84. return;
  85. }
  86. m_hWave = 0;
  87. bDevOpen = FALSE;
  88. }
  89. BOOL CWaveIn::StartData()
  90. {
  91. if (bStartData)
  92. {
  93. return FALSE;
  94. }
  95. if(!m_hWave)
  96. {
  97. return FALSE;
  98. }
  99. MMRESULT mRet = waveInStart(m_hWave);
  100. if( mRet != MMSYSERR_NOERROR )
  101. {
  102. return FALSE;
  103. }
  104. bStartData = TRUE;
  105. return TRUE;
  106. }
  107. void CWaveIn::CloseData()
  108. {
  109. if ( !bStartData )
  110. {
  111. return;
  112. }
  113. if(!m_hWave)
  114. {
  115. return;
  116. }
  117. MMRESULT mRet = waveInReset(m_hWave);
  118. if( mRet != MMSYSERR_NOERROR )
  119. {
  120. return;
  121. }
  122. bStartData = FALSE;
  123. }
  124. BOOL CWaveIn::PerpareBuffer()
  125. {
  126. if (bBuffer)
  127. {
  128. return FALSE;
  129. }
  130. MMRESULT mRet;
  131. mRet = waveInReset(m_hWave);
  132. if( mRet != MMSYSERR_NOERROR )
  133. {
  134. return FALSE;
  135. }
  136. if( m_pHead == NULL )
  137. {
  138. m_pHead = new WAVEHDR[NUM_BUF];
  139. for(int i=0 ; i < NUM_BUF ; i++ )
  140. {
  141. ZeroMemory(&m_pHead[i],sizeof(WAVEHDR));
  142. m_pHead[i].lpData = new char[SIZE_AUDIO_FRAME];
  143. m_pHead[i].dwBufferLength = SIZE_AUDIO_FRAME;
  144. waveInPrepareHeader(m_hWave,&m_pHead[i],sizeof(WAVEHDR));
  145. waveInAddBuffer(m_hWave,&m_pHead[i],sizeof(WAVEHDR));
  146. }
  147. }
  148. else
  149. {
  150. for(int i=0 ; i < NUM_BUF ; i++ )
  151. {
  152. waveInPrepareHeader(m_hWave,&m_pHead[i],sizeof(WAVEHDR));
  153. waveInAddBuffer(m_hWave,&m_pHead[i],sizeof(WAVEHDR));
  154. }
  155. }
  156. bBuffer = TRUE;
  157. return TRUE;
  158. }
  159. void CWaveIn::UnperpareBuffer()
  160. {
  161. if (!bBuffer)
  162. {
  163. return;
  164. }
  165. if( m_pHead == NULL )
  166. {
  167. return;
  168. }
  169. MMRESULT mRet;
  170. for(int i = 0 ; i < NUM_BUF ; i++ )
  171. {
  172. mRet = waveInUnprepareHeader(m_hWave,&m_pHead[i],sizeof(WAVEHDR));
  173. if( mRet != MMSYSERR_NOERROR )
  174. {
  175. continue;
  176. }
  177. }
  178. bBuffer = FALSE;
  179. }
  180. void CWaveIn::FreeBuffer()
  181. {
  182. if( m_pHead == NULL )
  183. return;
  184. for(int i = 0 ; i < NUM_BUF ; i++ )
  185. {
  186. if(m_pHead[i].lpData)
  187. {
  188. delete []m_pHead[i].lpData;
  189. m_pHead[i].lpData = NULL;
  190. }
  191. }
  192. delete []m_pHead;
  193. m_pHead = NULL;
  194. }
  195. BOOL CWaveIn::Start()
  196. {
  197. if( !Open() )
  198. {
  199. return FALSE;
  200. }
  201. if (!PerpareBuffer())
  202. {
  203. Close();
  204. return FALSE;
  205. }
  206. if (!StartData())
  207. {
  208. Close();
  209. UnperpareBuffer();
  210. return FALSE;
  211. }
  212. return TRUE;
  213. }
  214. void CWaveIn::Stop()
  215. {
  216. CloseData();
  217. UnperpareBuffer();
  218. Close();
  219. }