Record.cpp
上传用户:mony888
上传日期:2022-07-26
资源大小:1247k
文件大小:4k
源码类别:

Windows CE

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. //#include "Record.h"
  3. buf_Mode ModeTab[3] = {
  4. { 4, 2 },
  5. { 8, 4 },                             
  6. { 16, 8 },
  7. };
  8. #define MMRETCHECK(ret) 
  9. if ( ret != MMSYSERR_NOERROR ) { return ret; } 
  10. #define ICHECK(ret) 
  11. if ( ret < 0 ) { return MMSYSERR_ERROR; }
  12. Record::Record(BufMode ModeKey, DWORD dwBufSiz):m_BUFBLKSIZE( ModeTab[ModeKey].ucSize ), m_BUFBLKUSED( ModeTab[ModeKey].ucUsed ), m_BufSiz(dwBufSiz)
  13. {
  14. m_pCodecInterf = NULL;
  15. m_hevDone = NULL;
  16. m_pDataHdr = NULL;
  17. m_pEncData = NULL;
  18. m_fh = NULL;
  19. }
  20. Record::~Record()
  21. {
  22. }
  23. MMRESULT Record::SetBufSiz(DWORD dwBufSiz)
  24. {
  25. m_BufSiz = dwBufSiz;
  26. return MMSYSERR_NOERROR;
  27. }
  28. MMRESULT Record::InitRecord(WAVEFORMATEX & wfx)
  29. {
  30. int i;
  31. m_pDataHdr = new WAVEHDR[m_BUFBLKSIZE];
  32. if ( NULL == m_pDataHdr )
  33. {
  34. return MMSYSERR_NOMEM;
  35. }
  36. memset(m_pDataHdr, 0, sizeof(WAVEHDR) * m_BUFBLKSIZE);
  37. for ( i = 0; i < m_BUFBLKSIZE; i++ )
  38. {
  39. m_pDataHdr[i].lpData = new CHAR[m_BufSiz];
  40. if ( NULL == m_pDataHdr[i].lpData )
  41. {
  42. for ( i--; i < 0; i-- )
  43. {
  44. delete [] m_pDataHdr[i].lpData;
  45. }
  46. delete [] m_pDataHdr;
  47. return MMSYSERR_NOMEM;
  48. }
  49. m_pDataHdr[i].dwBufferLength = m_BufSiz;
  50. }
  51. m_wfx = wfx;
  52. return MMSYSERR_NOERROR;
  53. }
  54. MMRESULT Record::ClosRecord()
  55. {
  56. int i;
  57. if ( NULL == m_pDataHdr )
  58. {
  59. return MMSYSERR_ERROR;
  60. }
  61. for ( i = 0; i < m_BUFBLKSIZE; i++ )
  62. {
  63. if ( m_pDataHdr[i].lpData )
  64. {
  65. delete [] m_pDataHdr[i].lpData;
  66. }
  67. }
  68. delete [] m_pDataHdr;
  69. return MMSYSERR_NOERROR;
  70. }
  71. MMRESULT Record::OpenMic()
  72. {
  73. int i;
  74. int iRet;
  75. MMRESULT ret;
  76. if ( 0 == waveInGetNumDevs() )
  77. {
  78. return MMSYSERR_NOTENABLED;
  79. }
  80. m_uiDeviceId = 0;
  81. m_hevDone = CreateEvent(NULL, FALSE, FALSE, NULL);
  82. if ( NULL == m_hevDone )
  83. {
  84. return MMSYSERR_NOMEM;
  85. }
  86. ret = waveInOpen(&m_hwi, m_uiDeviceId, &m_wfx, ( DWORD )m_hevDone, NULL, CALLBACK_EVENT);
  87. MMRETCHECK(ret);
  88. for ( i = 0; i < m_BUFBLKSIZE; i++ )
  89. {
  90. ret = waveInPrepareHeader(m_hwi, m_pDataHdr + i, sizeof(WAVEHDR));
  91. MMRETCHECK(ret);
  92. }
  93. for ( i = 0; i < m_BUFBLKUSED; i++ )
  94. {
  95. ret = waveInAddBuffer(m_hwi, m_pDataHdr + i, sizeof(WAVEHDR));
  96. MMRETCHECK(ret);
  97. }
  98. iRet = m_pCodecInterf->init(&m_Data);
  99. ICHECK(iRet);
  100. m_dwWaitTime = ( m_BufSiz * 8000 ) / ( m_wfx.nSamplesPerSec * m_wfx.wBitsPerSample * 2 );
  101. ret = waveInStart(m_hwi);
  102. MMRETCHECK(ret);
  103. m_BufNO = 0;
  104. m_dwPCMSiz = 0;
  105. return MMSYSERR_NOERROR;
  106. }
  107. MMRESULT Record::ToRec()
  108. {
  109. int iRet;
  110. MMRESULT ret;
  111. BOOL bRet;
  112. DWORD dwWait;
  113. DWORD dwBytesWrot;
  114. dwWait = WaitForSingleObject(m_hevDone, m_dwWaitTime);
  115. if ( WAIT_OBJECT_0 == dwWait )
  116. {
  117. //  Encode audio data.
  118. iRet = m_pCodecInterf->encode(&m_Data, (void**)&m_pEncData, (INT32*)&m_EncDataSiz, (UINT8*)m_pDataHdr[m_BufNO].lpData, (INT32*)&(m_pDataHdr[m_BufNO].dwBufferLength));
  119. ICHECK(iRet);
  120. bRet = WriteFile(m_fh, m_pEncData, m_EncDataSiz, &dwBytesWrot, NULL);
  121. if (!bRet || dwBytesWrot < m_EncDataSiz)
  122. {
  123. return MMSYSERR_ERROR;
  124. }
  125. // bRet = WriteFile(m_fh, (UINT8*)m_pDataHdr[m_BufNO].lpData, m_pDataHdr[m_BufNO].dwBufferLength, &dwBytesWrot, NULL);
  126. // if (!bRet || dwBytesWrot < m_pDataHdr[m_BufNO].dwBufferLength) 
  127. // {
  128. // return MMSYSERR_ERROR;
  129. // }
  130. // m_dwPCMSiz += m_pDataHdr[m_BufNO].dwBufferLength;
  131. ret = waveInAddBuffer(m_hwi, m_pDataHdr + ((m_BufNO + m_BUFBLKUSED) % m_BUFBLKSIZE), sizeof(WAVEHDR));
  132. MMRETCHECK(ret);
  133. m_BufNO = (m_BufNO + 1) % m_BUFBLKSIZE;
  134. ResetEvent(m_hevDone);
  135. }
  136. return MMSYSERR_NOERROR;
  137. }
  138. void Record::SetCodecInterface(CodecInterfaceType& CodecInterf)
  139. {
  140. m_pCodecInterf = &CodecInterf;
  141. }
  142. MMRESULT Record::ClosMic()
  143. {
  144. int i;
  145. int iRet;
  146. MMRESULT ret;
  147. BOOL bret;
  148. ret = waveInReset(m_hwi);
  149. MMRETCHECK(ret);
  150. for (i = 0; i < m_BUFBLKSIZE; i++)
  151. {
  152. ret = waveInUnprepareHeader(m_hwi, m_pDataHdr + i, sizeof(WAVEHDR));
  153. MMRETCHECK(ret);
  154. }
  155. ret = waveInClose(m_hwi);
  156. MMRETCHECK(ret);
  157. iRet = m_pCodecInterf->close(&m_Data);
  158. ICHECK(iRet);
  159. bret = CloseHandle(m_hevDone);
  160. if (!bret)
  161. {
  162. return MMSYSERR_INVALHANDLE;
  163. }
  164. return MMSYSERR_NOERROR;
  165. }
  166. MMRESULT Record::ToPlay(LPCTSTR pszFileName)
  167. {
  168. return MMSYSERR_NOERROR;
  169. }
  170. MMRESULT Record::ToPaus()
  171. {
  172. return MMSYSERR_NOERROR;
  173. }
  174. MMRESULT Record::ToStop()
  175. {
  176. return MMSYSERR_NOERROR;
  177. }
  178. Record & Recorder(BufMode ModeKey, DWORD dwBufSiz)
  179. {
  180. static Record Apple(ModeKey, dwBufSiz);
  181. return Apple;
  182. }