WaveBase.cpp
上传用户:huifengb
上传日期:2007-12-27
资源大小:334k
文件大小:6k
源码类别:

多媒体

开发平台:

Visual C++

  1. // WaveBass.cpp : implementation file
  2. //
  3. #include <mmsystem.h>
  4. #include "stdafx.h"
  5. #include "WaveBase.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CWaveBass
  13. IMPLEMENT_DYNCREATE(CWaveBase, CCmdTarget)
  14. CWaveBase::CWaveBase()
  15. {
  16. m_Readhmmio=NULL;
  17. m_bFileExist=FALSE;
  18. }
  19. CWaveBase::~CWaveBase()
  20. {
  21. if(m_bFileExist)
  22. {
  23. mmioClose(m_Readhmmio,0);
  24. }
  25. }
  26. BEGIN_MESSAGE_MAP(CWaveBase, CCmdTarget)
  27. //{{AFX_MSG_MAP(CWaveBass)
  28. // NOTE - the ClassWizard will add and remove mapping macros here.
  29. //}}AFX_MSG_MAP
  30. END_MESSAGE_MAP()
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CWaveBass message handlers
  33. void CWaveBase::Wave_SaveWaveData(char*p, DWORD dataSize)
  34. {
  35. mmioWrite(m_Savehmmio,p,dataSize);
  36. }
  37. /*
  38. The mmioWrite function writes a specified number of
  39. bytes to a file opened by using the mmioOpen function.
  40. LONG mmioWrite(
  41.   HMMIO hmmio,      
  42.   char _huge* pch,  
  43.   LONG cch          
  44. );
  45. Parameters
  46. hmmio 
  47. File handle of the file. 
  48. pch 
  49. Address of the buffer to be written to the file. 
  50. cch 
  51. Number of bytes to write to the file. 
  52. Return Values
  53. Returns the number of bytes actually written. If there is an error writing to the file, the return value is -1.
  54. */
  55. void CWaveBase::Wave_ReadWaveData(char *p, DWORD &dataSize)
  56. {
  57. mmioSeek(m_Readhmmio,m_ReadFileOffset,SEEK_SET);
  58. dataSize=mmioRead(m_Readhmmio,(HPSTR)p,dataSize);
  59. m_ReadFileOffset+=dataSize;
  60. }
  61. /*
  62. function changes the current file position in a file opened by using the mmioOpen function. 
  63. LONG mmioSeek(  HMMIO hmmio,    LONG lOffset,   int iOrigin   ); 
  64. Parameters hmmio File handle of the file to seek in. 
  65. lOffset Offset to change the file position. 
  66. iOrigin Flags indicating how the offset specified by 
  67. lOffset is interpreted
  68. */
  69. /*
  70. mmioRead function reads a specified number of bytes from 
  71. a file opened by using the mmioOpen function.
  72. LONG mmioRead(  HMMIO hmmio,    HPSTR pch,      LONG cch      ); 
  73. Parameters
  74. hmmio File handle of the file to be read. 
  75. pch Address of a buffer to contain the data read from the file. 
  76. cch Number of bytes to read from the file. 
  77. */
  78. void CWaveBase::Wave_CloseSaveFile() 
  79. {
  80. mmioAscend(m_Savehmmio,&m_mmckinfoData,0);
  81. //调mmioAscend函数回填文件头 
  82. mmioAscend(m_Savehmmio,&m_mmckinfoWave,0);
  83. mmioClose(m_Savehmmio,0l);
  84. }
  85. /*
  86.  * The mmioClose function closes a file that was opened by using the mmioOpen function.
  87.  * MMRESULT mmioClose(  HMMIO hmmio,   UINT wFlags  ); 
  88.  * Parameters
  89.  * hmmio File handle of the file to close. 
  90.  * wFlags Flags for the close operation. 
  91. */
  92. BOOL CWaveBase::Wave_PrepareSaveFile(CString mFileName)
  93. {
  94. //创建声音文件
  95.     m_Savehmmio=mmioOpen((char *)LPCTSTR(mFileName),
  96. NULL, MMIO_CREATE|MMIO_ALLOCBUF|MMIO_WRITE);
  97.     if (NULL == m_Savehmmio)
  98. {
  99. AfxMessageBox("文件名或路径错误");
  100. return (-1);
  101. }
  102. //写声音文件头
  103. m_mmckinfoWave.fccType=mmioFOURCC('W','A','V','E');
  104. m_mmckinfoWave.cksize=0l;
  105. mmioCreateChunk(m_Savehmmio,&m_mmckinfoWave,MMIO_CREATERIFF);
  106. //创建并初始化fmt子块
  107. m_mmckinfoFmt.ckid=mmioFOURCC('f','m','t',' ');
  108. m_mmckinfoFmt.cksize=0l;
  109. mmioCreateChunk(m_Savehmmio,&m_mmckinfoFmt,0);
  110. mmioWrite(m_Savehmmio,(char _huge *)(&m_WaveFormat),(LONG)sizeof(WAVEFORMATEX));
  111. mmioAscend(m_Savehmmio,&m_mmckinfoFmt,0);
  112. // 创建fact块
  113. // m_mmckinfoFact.ckid=mmioFOURCC('f','a','c','t');
  114. // m_mmckinfoFact.cksize=4;
  115. // mmioCreateChunk(m_Savehmmio,&m_mmckinfoFact,0);
  116. // mmioWrite(m_Savehmmio,(char _huge *)&m_dwDataSamples,sizeof(DWORD));
  117. //创建data块
  118. m_mmckinfoData.ckid=mmioFOURCC('d','a','t','a');
  119. m_mmckinfoData.cksize=m_dwDataSize;
  120. mmioCreateChunk(m_Savehmmio,&m_mmckinfoData,0);
  121. return TRUE;
  122. }
  123. BOOL CWaveBase::Wave_OpenFile()
  124. {
  125. BOOL werr;
  126.     MMCKINFO    ckRIFF;
  127. /*
  128. The MMCKINFO structure contains information about a chunk in a RIFF file.
  129. typedef struct { 
  130. FOURCC ckid; 
  131. DWORD  cksize; 
  132. FOURCC fccType; 
  133. DWORD  dwDataOffset; 
  134. DWORD  dwFlags; 
  135. } MMCKINFO; 
  136. */
  137.     MMCKINFO    ck;
  138.     DWORD       dw;
  139. if(m_bFileExist)
  140. {
  141. mmioClose(m_Readhmmio, 0l);
  142. }
  143. //打开WAV文件
  144.     werr = FALSE;
  145.     m_Readhmmio = mmioOpen((char *)LPCTSTR(m_WaveFileName),NULL, MMIO_READ|MMIO_ALLOCBUF);
  146.     if (NULL == m_Readhmmio)
  147. {
  148. goto wio_End;
  149. }
  150.     ckRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E');
  151. //The mmioFOURCC macro converts four characters into a four-character code.
  152.     if (mmioDescend(m_Readhmmio, &ckRIFF, NULL, MMIO_FINDRIFF))
  153. {
  154. goto wio_Close_End;
  155. }
  156. m_dFileSize = ckRIFF.cksize;
  157. //寻找RRIF块
  158.     while (MMSYSERR_NOERROR == mmioDescend(m_Readhmmio, &ck, &ckRIFF, 0))
  159.     {
  160.         if ((ck.dwDataOffset + ck.cksize) > (ckRIFF.dwDataOffset + ckRIFF.cksize))
  161. {
  162. goto wio_Close_End;
  163. }
  164. //RRIF的子块 其子块类型可能为:LISTDISPFMTFACTDATA
  165.         switch (ck.ckid)
  166.         {
  167.             case mmioFOURCC('L', 'I', 'S', 'T'):
  168. break;
  169.             case mmioFOURCC('D', 'I', 'S', 'P'):
  170.                 break;
  171.             case mmioFOURCC('f', 'm', 't', ' '):
  172.                 //WAV格式参数
  173.                 dw = ck.cksize;
  174.                 if (dw < sizeof(WAVEFORMATEX))
  175.                     dw = sizeof(WAVEFORMATEX);
  176.                 dw = ck.cksize;
  177.                 if (mmioRead(m_Readhmmio, (HPSTR)&(m_WaveFormat), dw) != (LONG)dw)goto wio_Close_End;
  178.                 break;
  179.             case mmioFOURCC('d', 'a', 't', 'a'):
  180. m_dwDataOffset=m_ReadFileOffset=ck.dwDataOffset;
  181. m_dwDataSize=ck.cksize;
  182. werr=TRUE;
  183. goto wio_End;
  184.             case mmioFOURCC('f', 'a', 'c', 't'):
  185.                 break;
  186.         }
  187.         mmioAscend(m_Readhmmio, &ck, 0);
  188.     }
  189. wio_Close_End:
  190. mmioClose(m_Readhmmio,0l);
  191. wio_End:
  192. m_bFileExist=werr;
  193.     return (werr);
  194. }
  195. void CWaveBase::Wave_CloseReadFile()
  196. {
  197. mmioClose(m_Readhmmio,0l);
  198. }