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

多媒体

开发平台:

Visual C++

  1. // Wave.cpp: implementation of the CWave class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Wave.h"
  6. //
  7. #include <afxwin.h>
  8. #include <mmsystem.h>
  9. //
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CWave::CWave()
  19. {
  20. m_nType = 0;
  21. m_bRecording = FALSE;
  22. m_bOpened = FALSE;
  23. m_pSoundData = NULL;
  24. m_wDeviceID = 0;
  25. }
  26. CWave::~CWave()
  27. {
  28. Close ();
  29. }
  30. int CWave::GetDevices (void)
  31. {
  32. return waveOutGetNumDevs ();
  33. }
  34. BOOL CWave::LoadFromDisk (CString Filename)
  35. {
  36. Close ();
  37. CFile File;
  38. if (!File.Open (Filename, CFile::modeRead))
  39. return FALSE;
  40. DWORD dwLength = File.GetLength ();
  41. m_pSoundData = AllocMem (dwLength);
  42. if (!m_pSoundData){
  43. File.Close ();
  44. return FALSE;
  45. }
  46. if (File.ReadHuge (m_pSoundData, dwLength) != dwLength){
  47. File.Close ();//把数据读入该内存
  48. return FALSE;
  49. }
  50. File.Close ();
  51. m_bOpened = TRUE;
  52. m_nType = 1;//标志:从磁盘文件读入数据
  53. return TRUE;
  54. }
  55. /*
  56. BOOL CWave::LoadFromDisk (CString Filename,DWORD BeginPoint,DWORD Length)//added by myself;
  57. {
  58. Close ();
  59. CFile File;
  60. if (!File.Open (Filename, CFile::modeRead))
  61. return FALSE;
  62. if(BeginPoint+Length>File.GetLength ())
  63. return FALSE;
  64. m_pSoundData = AllocMem (Length);
  65. if (!m_pSoundData)
  66. {
  67. File.Close ();
  68. return FALSE;
  69. }
  70. File.Seek(BeginPoint,CFile::begin);
  71. if (File.ReadHuge (m_pSoundData, Length) != Length)
  72. {
  73. File.Close ();//把数据读入该内存
  74. return FALSE;
  75. }
  76. File.Close ();
  77. m_bOpened = TRUE;
  78. m_nType = 1;//标志:从磁盘文件读入数据
  79. return TRUE;
  80. }
  81. */
  82. BOOL CWave::LoadFromRes (CString ResID, HINSTANCE hInstance)
  83. {
  84. Close ();
  85. m_hInstance = hInstance;
  86. HANDLE hResInfo;
  87. hResInfo = FindResource (m_hInstance, ResID, "WAVE");
  88. if (!hResInfo) 
  89. return FALSE;
  90. m_hResHandle = LoadResource (m_hInstance, (HRSRC) hResInfo);
  91. if (!m_hResHandle) 
  92. return FALSE;
  93. m_pSoundData = LockResource (m_hResHandle);
  94. if (!m_pSoundData)
  95. return FALSE;
  96. m_bOpened = TRUE;
  97. m_nType = 2;//标记:从资源读入数据
  98. return TRUE;
  99. }
  100. void CWave::Close (void)
  101. {
  102. PlaySound (NULL, NULL, NULL);
  103. if (m_pSoundData){
  104. if (m_nType == 1)//释放内存
  105. FreeMem (m_pSoundData);
  106. if (m_nType == 2){
  107. UnlockResource (m_hResHandle);
  108. FreeResource (m_hResHandle);
  109. }
  110. m_pSoundData = NULL;
  111. }
  112. m_nType = 0;
  113. m_bRecording = FALSE;
  114. m_bOpened = FALSE;
  115. if (m_wDeviceID)
  116. {
  117. mciSendCommand (m_wDeviceID, MCI_STOP, MCI_WAIT, NULL);
  118. mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);
  119. }
  120. m_wDeviceID = 0;
  121. }
  122. BOOL CWave::Play (BOOL bLoop)
  123. {
  124. if (m_bOpened)
  125. {
  126. if (m_bRecording)
  127. {
  128. Stop ();
  129. MCI_PLAY_PARMS PlayParms;
  130. mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
  131. if (mciSendCommand (m_wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID) &PlayParms))
  132. return FALSE;
  133. else
  134. return TRUE;
  135. }
  136. else
  137. {
  138. DWORD dwFlags = SND_MEMORY | SND_ASYNC | SND_NODEFAULT;
  139. if (bLoop)
  140. dwFlags |= SND_LOOP;
  141. return PlaySound ((char *) m_pSoundData, NULL, dwFlags);
  142. }
  143. }
  144. return FALSE;
  145. }
  146. void CWave::Stop (void)
  147. {
  148. if (m_bRecording)
  149. mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);
  150. else
  151. PlaySound (NULL, NULL, NULL);
  152. }
  153. BOOL CWave::Record (void)
  154. {
  155. Close ();
  156. MCI_OPEN_PARMS OpenParms;
  157. OpenParms.lpstrDeviceType = "waveaudio";
  158. OpenParms.lpstrElementName = "";
  159. if (mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_ELEMENT |
  160.     MCI_OPEN_TYPE | MCI_WAIT, (DWORD)(LPVOID) &OpenParms))
  161. return FALSE;
  162. m_wDeviceID = OpenParms.wDeviceID;
  163. MCI_RECORD_PARMS RecordParms;
  164. if (mciSendCommand (m_wDeviceID, MCI_RECORD, NULL,
  165.                (DWORD)(LPVOID) &RecordParms))
  166. return FALSE;
  167. m_bRecording = TRUE;
  168. m_bOpened = TRUE;
  169. return TRUE;
  170. }
  171. BOOL CWave::Save (CString Filename)
  172. {//只用于存储录音得到的数据!
  173. if (!m_bRecording)
  174. return FALSE;
  175. Stop ();
  176. MCI_SAVE_PARMS SaveParms;
  177. SaveParms.lpfilename = (LPCSTR) Filename;
  178. if (mciSendCommand (m_wDeviceID, MCI_SAVE, MCI_SAVE_FILE |
  179.                 MCI_WAIT, (DWORD)(LPVOID) &SaveParms))
  180. return FALSE;
  181. m_bRecording = FALSE;
  182. //LoadFromDisk (Filename);//我注释掉的/QSD
  183. return TRUE;
  184. }
  185. BOOL CWave::PlayFromDisk (CString Filename)
  186. {
  187. return PlaySound (Filename, NULL, SND_FILENAME | SND_SYNC | SND_NODEFAULT);
  188. }
  189. BOOL CWave::PlayFromRes (CString ResID, HINSTANCE hInstance)
  190. {
  191. return PlaySound (ResID, hInstance, SND_RESOURCE | SND_SYNC | SND_NODEFAULT);
  192. }
  193. void *CWave::AllocMem (DWORD dwSize)
  194. {
  195. HGLOBAL Global;
  196. HGLOBAL *pGlobal;
  197. unsigned char *pMem;
  198. Global = GlobalAlloc (GMEM_FIXED, (DWORD) dwSize + 10);
  199. if (!Global) return (NULL);
  200. pMem = (unsigned char *) GlobalLock (Global);
  201. pGlobal = (HGLOBAL *) pMem;
  202. *pGlobal = Global;
  203. pMem += sizeof (HGLOBAL);
  204. return (pMem);
  205. }
  206. void CWave::FreeMem (void far *pMem)
  207. {
  208. HGLOBAL Global;
  209. HGLOBAL *pGlobal;
  210. unsigned char *pUChar;
  211. pUChar = (unsigned char *) pMem;
  212. pUChar -= sizeof (HGLOBAL);
  213. pGlobal = (HGLOBAL *) pUChar;
  214. Global = *pGlobal;
  215. GlobalUnlock (Global);
  216. GlobalFree (Global);
  217. }