CDAudio.cpp
上传用户:sdpcwz
上传日期:2009-12-14
资源大小:1237k
文件大小:9k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // CDAudio.cpp
  2. #include "stdafx.h"
  3. #include <mmsystem.h>
  4. #include "CDAudio.h"
  5. CCDAudio::CCDAudio()
  6. {
  7. m_bOpened = m_bPaused = m_bPlaying = FALSE;
  8. m_wDeviceID = 0;
  9. }
  10. CCDAudio::~CCDAudio()
  11. {
  12. Close();
  13. }
  14. //打开设备
  15. BOOL CCDAudio::Open( void )
  16. {
  17. if( m_bOpened )
  18. return( TRUE );
  19. m_bPaused = m_bPlaying = FALSE;
  20. m_wDeviceID = 0;
  21. //发送打开设备命令
  22. MCI_OPEN_PARMS OpenParms;
  23. OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO;
  24. OpenParms.wDeviceID = 0;
  25. if( mciSendCommand( NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE, (DWORD)(LPVOID) &OpenParms ) )
  26. return( FALSE );
  27. m_wDeviceID = OpenParms.wDeviceID;
  28. m_bOpened = TRUE;
  29. MCI_SET_PARMS SetParms;
  30. SetParms.dwTimeFormat = MCI_FORMAT_TMSF;
  31. if( mciSendCommand( m_wDeviceID, MCI_SET, MCI_WAIT | MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms ) ){
  32. Close ();
  33. return( FALSE );
  34. }
  35. mciSendCommand( m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL );
  36. return( TRUE );
  37. }
  38. //关闭设备
  39. void CCDAudio::Close( void )
  40. {
  41. if( !m_bOpened )
  42. return;
  43. if( m_bPlaying || m_bPaused )
  44. mciSendCommand( m_wDeviceID, MCI_STOP, NULL, NULL );
  45. mciSendCommand( m_wDeviceID, MCI_CLOSE, MCI_WAIT, NULL );
  46. m_bOpened = m_bPaused = m_bPlaying = FALSE;
  47. m_wDeviceID = 0;
  48. }
  49. //播放
  50. BOOL CCDAudio::Play (void)
  51. {
  52. if( !Open() )
  53. return( FALSE );
  54. if( !IsAudioTrack( GetCurrentTrack() ) )
  55. return( FALSE );
  56. MCI_PLAY_PARMS PlayParms;
  57. PlayParms.dwCallback = NULL;
  58. PlayParms.dwFrom = MCI_MAKE_TMSF( GetCurrentTrack(), GetMinutes(), GetSeconds(), GetFrames() );
  59. if( mciSendCommand( m_wDeviceID, MCI_PLAY, MCI_FROM, (DWORD)(LPVOID) &PlayParms ) )
  60. return( FALSE );
  61. m_bPaused = FALSE;
  62. m_bPlaying = TRUE;
  63. return( TRUE );
  64. }
  65. //停止
  66. void CCDAudio::Stop( void )
  67. {
  68. if( !m_bOpened || !m_bPlaying )
  69. return;
  70. mciSendCommand( m_wDeviceID, MCI_STOP, MCI_WAIT, NULL );
  71. mciSendCommand( m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL );
  72. m_bPlaying = FALSE;
  73. m_bPaused = FALSE;
  74. }
  75. //暂停
  76. void CCDAudio::Pause( void )
  77. {
  78. if( !m_bOpened || !m_bPlaying )
  79. return;
  80. MCI_PLAY_PARMS PlayParms;
  81. if( mciSendCommand( m_wDeviceID, MCI_PAUSE, 0, (DWORD)(LPVOID) &PlayParms ) )
  82. return;
  83. m_bPaused = TRUE;
  84. }
  85. //获得曲目数量
  86. int CCDAudio::GetTotalTracks( void )
  87. {
  88. if( !m_bOpened )
  89. return( -1 );
  90. MCI_STATUS_PARMS StatusParms;
  91. StatusParms.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
  92. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms ) )
  93. return( -1 );
  94. return( (int) StatusParms.dwReturn );
  95. }
  96. //获得所有曲目的总长度(时间)
  97. void CCDAudio::GetTotalLength( int *pnMinutes, int *pnSeconds )
  98. {
  99. *pnMinutes = -1;
  100. *pnSeconds = -1;
  101. if( !m_bOpened )
  102. return;
  103. MCI_STATUS_PARMS StatusParms;
  104. StatusParms.dwItem = MCI_STATUS_LENGTH;
  105. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms ) )
  106. return;
  107. *pnMinutes = MCI_MSF_MINUTE( StatusParms.dwReturn );
  108. *pnSeconds = MCI_MSF_SECOND( StatusParms.dwReturn );
  109. }
  110. //获得一个曲目的长度
  111. void CCDAudio::GetTrackLength( int nTrack, int *pnMinutes, int *pnSeconds )
  112. {
  113. *pnMinutes = -1;
  114. *pnSeconds = -1;
  115. if( !m_bOpened )
  116. return;
  117. MCI_STATUS_PARMS StatusParms;
  118. StatusParms.dwItem = MCI_STATUS_LENGTH;
  119. StatusParms.dwTrack = (DWORD) nTrack;
  120. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM | MCI_TRACK, (DWORD)(LPVOID) &StatusParms ) )
  121. return;
  122. *pnMinutes = MCI_MSF_MINUTE( StatusParms.dwReturn );
  123. *pnSeconds = MCI_MSF_SECOND( StatusParms.dwReturn );
  124. }
  125. //获得当前播放的曲目
  126. int CCDAudio::GetCurrentTrack( void )
  127. {
  128. if( !m_bOpened )
  129. return( -1 );
  130. MCI_STATUS_PARMS StatusParms;
  131. StatusParms.dwItem = MCI_STATUS_POSITION;
  132. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms ) )
  133. return( -1 );
  134. return( MCI_TMSF_TRACK( StatusParms.dwReturn ) );
  135. }
  136. //获得当前播放曲目前已经播放的分钟数
  137. int CCDAudio::GetMinutes( void )
  138. {
  139. if( !m_bOpened )
  140. return( -1 );
  141. MCI_STATUS_PARMS StatusParms;
  142. StatusParms.dwItem = MCI_STATUS_POSITION;
  143. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms ) )
  144. return( -1 );
  145. return( MCI_TMSF_MINUTE( StatusParms.dwReturn ) );
  146. }
  147. //获得当前播放曲目前经播放的秒数
  148. int CCDAudio::GetSeconds( void )
  149. {
  150. if( !m_bOpened )
  151. return( -1 );
  152. MCI_STATUS_PARMS StatusParms;
  153. StatusParms.dwItem = MCI_STATUS_POSITION;
  154. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms ) )
  155. return( -1 );
  156. return( MCI_TMSF_SECOND( StatusParms.dwReturn ) );
  157. }
  158. //获得帧数
  159. int CCDAudio::GetFrames( void )
  160. {
  161. if( !m_bOpened )
  162. return( -1 );
  163. MCI_STATUS_PARMS StatusParms;
  164. StatusParms.dwItem = MCI_STATUS_POSITION;
  165. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms ) )
  166. return( -1 );
  167. return( MCI_TMSF_FRAME( StatusParms.dwReturn ) );
  168. }
  169. //判断光驱里的cd是否正常
  170. BOOL CCDAudio::IsDriveReady( void )
  171. {
  172. if( !m_bOpened )
  173. return( FALSE );
  174. MCI_STATUS_PARMS StatusParms;
  175. StatusParms.dwItem = MCI_STATUS_MODE;
  176. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms ) )
  177. return( FALSE );
  178. if( StatusParms.dwReturn == MCI_MODE_NOT_READY || StatusParms.dwReturn == MCI_MODE_OPEN )
  179. return( FALSE );
  180. StatusParms.dwItem = MCI_STATUS_MEDIA_PRESENT;
  181. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms ) )
  182. return( FALSE );
  183. return( (BOOL) StatusParms.dwReturn );
  184. }
  185. //判断曲目是否是音乐
  186. BOOL CCDAudio::IsAudioTrack( int nTrack )
  187. {
  188. if( !m_bOpened )
  189. return( FALSE );
  190. MCI_STATUS_PARMS StatusParms;
  191. StatusParms.dwItem = MCI_CDA_STATUS_TYPE_TRACK;
  192. StatusParms.dwTrack = nTrack;
  193. if( mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK, (DWORD)(LPVOID) &StatusParms ) )
  194. return( FALSE );
  195. if( StatusParms.dwReturn == MCI_CDA_TRACK_AUDIO )
  196. return( TRUE );
  197. return( FALSE );
  198. }
  199. //判断是否正在播放
  200. BOOL CCDAudio::IsPlaying( BOOL *pbPaused )
  201. {
  202. *pbPaused = m_bPaused;
  203. return( m_bPlaying );
  204. }
  205. //跳跃到某个曲目的恰当地方
  206. BOOL CCDAudio::SeekTo( int nTrack, int nMinute, int nSecond, int nFrame )
  207. {
  208. if( !m_bOpened )
  209. return( FALSE );
  210. MCI_SEEK_PARMS SeekParms;
  211. SeekParms.dwTo = MCI_MAKE_TMSF( nTrack, nMinute, nSecond, nFrame );
  212. if( m_bPlaying && !m_bPaused )
  213. mciSendCommand( m_wDeviceID, MCI_PAUSE, 0, NULL );
  214. if( mciSendCommand( m_wDeviceID, MCI_SEEK, MCI_TO | MCI_WAIT, (DWORD)(LPVOID) &SeekParms ) )
  215. return( FALSE );
  216. if( m_bPlaying && !m_bPaused )
  217. Play();
  218. return( TRUE );
  219. }
  220. //向前跳跃给定时间
  221. void CCDAudio::SkipForward( int nSeconds )
  222. {
  223. if( !m_bOpened )
  224. return;
  225. MCI_SET_PARMS SetParms;
  226. SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
  227. mciSendCommand( m_wDeviceID, MCI_SET, MCI_WAIT | MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms );
  228. MCI_STATUS_PARMS StatusParms;
  229. DWORD dwPos;
  230. StatusParms.dwItem = MCI_STATUS_POSITION;
  231. mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms );
  232. dwPos = StatusParms.dwReturn;
  233. dwPos += (DWORD) nSeconds * 1000;
  234. MCI_SEEK_PARMS SeekParms;
  235. SeekParms.dwTo = dwPos;
  236. if( m_bPlaying && !m_bPaused )
  237. mciSendCommand( m_wDeviceID, MCI_PAUSE, 0, NULL );
  238. mciSendCommand( m_wDeviceID, MCI_SEEK, MCI_TO | MCI_WAIT, (DWORD)(LPVOID) &SeekParms );
  239. SetParms.dwTimeFormat = MCI_FORMAT_TMSF;
  240. mciSendCommand( m_wDeviceID, MCI_SET, MCI_WAIT | MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms );
  241. if( m_bPlaying && !m_bPaused )
  242. Play();
  243. }
  244. //向后跳跃给定时间
  245. void CCDAudio::SkipBack( int nSeconds )
  246. {
  247. if( !m_bOpened )
  248. return;
  249. MCI_SET_PARMS SetParms;
  250. SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
  251. mciSendCommand( m_wDeviceID, MCI_SET, MCI_WAIT | MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms );
  252. MCI_STATUS_PARMS StatusParms;
  253. DWORD dwPos;
  254. StatusParms.dwItem = MCI_STATUS_POSITION;
  255. mciSendCommand( m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms );
  256. dwPos = StatusParms.dwReturn;
  257. dwPos -= (DWORD) nSeconds * 1000;
  258. MCI_SEEK_PARMS SeekParms;
  259. SeekParms.dwTo = dwPos;
  260. if( m_bPlaying && !m_bPaused )
  261. mciSendCommand( m_wDeviceID, MCI_PAUSE, 0, NULL );
  262. mciSendCommand( m_wDeviceID, MCI_SEEK, MCI_TO | MCI_WAIT, (DWORD)(LPVOID) &SeekParms );
  263. SetParms.dwTimeFormat = MCI_FORMAT_TMSF;
  264. mciSendCommand( m_wDeviceID, MCI_SET, MCI_WAIT | MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms );
  265. if( m_bPlaying && !m_bPaused )
  266. Play();
  267. }
  268. //打开光驱
  269. void CCDAudio::OpenDrive( void )
  270. {
  271. if( m_bOpened ){
  272. Stop();
  273. mciSendCommand( m_wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, NULL );
  274. }
  275. }
  276. //关闭光驱
  277. void CCDAudio::CloseDrive( void )
  278. {
  279. if( m_bOpened ){
  280. mciSendCommand( m_wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, NULL );
  281. Stop();
  282. }
  283. }