SOUND.CPP
上传用户:lianyisd
上传日期:2019-11-03
资源大小:5188k
文件大小:5k
源码类别:

midi

开发平台:

Visual C++

  1. // Media.cpp: implementation of the CSound class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Multimedia.h"
  6. #include "Media.h"
  7. #include "string.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. Media::CMedia()
  17. {
  18. m_nDeviceID = 1;
  19. m_nElementID = 0;
  20. dwResult = 0;
  21. mciPlayParms.dwFrom = 0;
  22. closed = stopped = true;
  23. paused = false;
  24. }
  25. CSound::~CMedia()
  26. {
  27. }
  28. DWORD CMedia::OpenDevice(LPCSTR pFileName,LPCSTR pFileExt)
  29. {
  30. if(!closed)
  31. {
  32. CloseDevice();
  33. closed = true;
  34. m_nDeviceID = 1;
  35. }
  36. if(paused)
  37. paused = false;
  38. if (m_nDeviceID)
  39.     {
  40. if(strcmp(pFileExt,"WAV") == 0 || strcmp(pFileExt,"wav") == 0)
  41. {
  42. mciOpenParms.lpstrDeviceType = "waveaudio";
  43. type = WAVE;
  44. }
  45. else if(strcmp(pFileExt,"MID") == 0 || strcmp(pFileExt,"mid") == 0)
  46. {
  47. mciOpenParms.lpstrDeviceType="sequencer";
  48. type = MIDI;
  49. }
  50. else if(strcmp(pFileExt,"CD") == 0 || strcmp(pFileExt,"cd") == 0)
  51. {
  52. mciOpenParms.lpstrDeviceType = "cdaudio";
  53. type = CD;
  54. }
  55. else if(strcmp(pFileExt,"AVI") == 0 || strcmp(pFileExt,"avi") == 0)
  56. {
  57. mciOpenParms.lpstrDeviceType = "avivideo";
  58. type = AVI;
  59. }
  60. //open the sound device
  61. mciOpenParms.wDeviceID = 0;
  62. mciOpenParms.lpstrElementName = pFileName;
  63. dwResult = mciSendCommand(NULL, MCI_OPEN,  MCI_WAIT|MCI_OPEN_TYPE|
  64.  MCI_OPEN_ELEMENT,(DWORD)(LPMCI_OPEN_PARMS)&mciOpenParms);
  65.         //save device identifier,will use eith other MCI commands
  66. m_nDeviceID = mciOpenParms.wDeviceID;
  67. //display error message if failed 
  68. if(dwResult)
  69. DisplayErrorMsg(dwResult);
  70. else
  71. {
  72. stopped = closed =false;
  73. }
  74. }
  75. //return result of MCI operation
  76. return dwResult;
  77. }
  78. void CSound::DisplayErrorMsg(DWORD dwError)
  79. {
  80. //check if there was an error
  81.     if(dwError)
  82.     {
  83. //character string that contains error message
  84. char szErrorMsg[MAXERRORLENGTH];
  85. //retrieve string associated error message
  86. if(!mciGetErrorString(dwError,szErrorMsg,sizeof(szErrorMsg)))
  87. strcpy(szErrorMsg,"Unknown Error");
  88. //display error string in message box
  89. AfxMessageBox(szErrorMsg);
  90.     }
  91. }
  92. DWORD CSound::Play(CWnd* pWnd,LPCSTR pFileName)
  93. {
  94. m_nElementID=mciOpenParms.wDeviceID;
  95. //instruct device to play file
  96. if(paused && type == WAVE)
  97. {
  98. dwResult = mciSendCommand(m_nDeviceID,MCI_RESUME,MCI_WAIT,
  99. (DWORD) (LPMCI_GENERIC_PARMS) &mciGenericParms);
  100. paused = false;
  101. }
  102. else
  103. dwResult = mciSendCommand(m_nDeviceID,MCI_PLAY,
  104. MCI_FROM,(DWORD)(LPMCI_PLAY_PARMS)&mciPlayParms);
  105. //display error and close element if failed
  106. if(dwResult)
  107.         {
  108. DisplayErrorMsg(dwResult);
  109. Stop();
  110. stopped = true;
  111. }
  112. else
  113. stopped = false;
  114. //return result of MCI operation
  115. return dwResult;
  116. }
  117. DWORD CSound::Stop()
  118. {
  119. //close if element is currently open
  120. if(m_nDeviceID)
  121. {
  122. dwResult = mciSendCommand(m_nDeviceID,MCI_STOP,
  123. MCI_WAIT,(DWORD) (LPMCI_GENERIC_PARMS) &mciStopParms);
  124. //display error message if failed
  125. if(dwResult)
  126. DisplayErrorMsg(dwResult);
  127. //set identifier to closed state
  128. else
  129. m_nDeviceID=0;
  130. }
  131. stopped = true;
  132. return dwResult;
  133. }
  134. DWORD CSound::CloseDevice()
  135. {
  136. //close if currently open
  137. if(m_nDeviceID && !stopped)
  138. {
  139. //close the MCI device
  140. dwResult=mciSendCommand(m_nDeviceID,MCI_CLOSE,MCI_WAIT,NULL);
  141. //display error message if failed
  142. if(dwResult)
  143. DisplayErrorMsg(dwResult);
  144. //set identifier to close state
  145. else 
  146. m_nDeviceID=0;
  147. }
  148. //return result of MCI operation
  149. closed = true;
  150. return dwResult;
  151. }
  152. DWORD CSound::Pause()
  153. {
  154. if(m_nDeviceID)
  155. {
  156. dwResult = mciSendCommand (m_nDeviceID, 
  157. MCI_PAUSE, MCI_WAIT,(DWORD)(LPMCI_GENERIC_PARMS) &mciGenericParms);
  158. if(dwResult)
  159. {
  160. DisplayErrorMsg(dwResult);
  161. return dwResult;
  162. }
  163. }
  164. paused = true;
  165. return dwResult;
  166. }
  167. DWORD CSound::BeginRecord()
  168. {
  169. if(m_nDeviceID)
  170. {
  171. dwResult = mciSendCommand (m_nDeviceID, MCI_RECORD, 
  172. NULL, (DWORD)(LPMCI_RECORD_PARMS)&mciRecordParms);
  173. if(dwResult)
  174. DisplayErrorMsg(dwResult);
  175. }
  176. return dwResult;
  177. }
  178. DWORD CSound::SaveRecord(LPCSTR pFilename)
  179. {
  180. if(m_nDeviceID)
  181. {
  182. mciSaveParms.lpfilename = pFilename;
  183. dwResult = mciSendCommand (m_nDeviceID, MCI_SAVE, 
  184. MCI_SAVE_FILE | MCI_WAIT,(DWORD)(LPMCI_SAVE_PARMS) &mciSaveParms);
  185. if(dwResult)
  186. DisplayErrorMsg(dwResult);
  187. }
  188. return dwResult;
  189. }