home *** CD-ROM | disk | FTP | other *** search
/ Game Audio Programming / GameAudioProgramming.iso / Game_Audio / audio_sdk / src / AudioLib / CDPlayer.cpp < prev    next >
C/C++ Source or Header  |  2002-07-15  |  6KB  |  244 lines

  1. /***********************************************************\
  2. Copyright (C) James Boer, 2002. 
  3. All rights reserved worldwide.
  4.  
  5. This software is provided "as is" without express or implied
  6. warranties. You may freely copy and compile this source into
  7. applications you distribute provided that the copyright text
  8. below is included in the resulting source code, for example:
  9. "Portions Copyright (C) James Boer, 2002"
  10. \***********************************************************/
  11.  
  12. /*
  13. Notes:
  14.  
  15. In the window's message handler, you should check for the case 
  16. MM_MCINOTIFY, and call the OnMCINotify() function in response.
  17.  
  18. This is an example of what a typical Win32 program's message 
  19. handler might look like:
  20.  
  21. long WINAPI _export WindowProc(HWND window, UINT message,
  22.     UINT wParam, LONG lParam)
  23. {
  24.     switch (message)
  25.     {
  26.  
  27.     .
  28.     .
  29.     .
  30.  
  31.     case MM_MCINOTIFY:
  32.  
  33.         CDPlayer()->OnMCINotify(wParam, lParam);
  34.         break;
  35.     }
  36.  
  37. */
  38.  
  39. #include "Audio.h"
  40.  
  41. using namespace Audio;
  42.  
  43. //------------------------------------------------------------------------//
  44. // Constructor for the cd player.  
  45. CDPlay::CDPlay()
  46. {
  47.     Clear();
  48. }
  49.  
  50.  
  51. //------------------------------------------------------------------------//
  52. CDPlay::~CDPlay()
  53. {
  54.     Term();
  55. }
  56.  
  57.  
  58. //------------------------------------------------------------------------//
  59. void CDPlay::Clear()
  60. {
  61.     m_bLoop = false;
  62.     m_nCurrentTrack = 1;
  63.     m_Status = CDSTATUS_STOPPED;
  64.     m_hWindow = NULL;
  65.     m_iDeviceID = 0;
  66.     m_bInitialized = false;
  67. }
  68.  
  69.  
  70. //------------------------------------------------------------------------//
  71. // The open function prepares the CD player for playing and
  72. // checks to see if it is ready
  73. bool CDPlay::Init(HWND hWindow, const char* pDrive)
  74. {
  75.     if(m_bInitialized)
  76.         return Error::Handle("CD Player is already initialized");
  77.  
  78.     // This tells which window should receive the MCI messages
  79.     m_hWindow = hWindow;
  80.  
  81.     // Open the MCI cdaudio device
  82.     MCI_OPEN_PARMS OpenParms;
  83.     OpenParms.lpstrDeviceType = "cdaudio";
  84.     DWORD dwFlags = MCI_OPEN_TYPE | MCI_WAIT;
  85.     // If a user has specified a drive letter, then try
  86.     // to initialize that device by name.
  87.     if(pDrive)
  88.     {
  89.         TCHAR    szElementName[4];
  90.         if((strlen(pDrive) > 1) && (pDrive[1] == ':'))
  91.             wsprintf(szElementName, TEXT("%s"), pDrive);
  92.         else
  93.             wsprintf(szElementName, TEXT("%s:"), pDrive);
  94.         OpenParms.lpstrElementName = szElementName;
  95.         dwFlags |= MCI_OPEN_ELEMENT;
  96.     }
  97.     MCIERROR error = mciSendCommand(0, MCI_OPEN, dwFlags,
  98.         (DWORD)(LPVOID)&OpenParms);
  99.     if(error)
  100.         return Error::Handle("Could not initialize CD Player");
  101.  
  102.     // Store this value for later comparison when checking
  103.     // MCI Windows messages.
  104.     m_iDeviceID = OpenParms.wDeviceID;
  105.  
  106.     // Set the proper time format
  107.     MCI_SET_PARMS SetParms;
  108.     SetParms.dwTimeFormat = MCI_FORMAT_TMSF;
  109.     error = mciSendCommand(m_iDeviceID, MCI_SET, MCI_SET_TIME_FORMAT,
  110.         (DWORD)(LPVOID)&SetParms);
  111.     if(error)
  112.         return Error::Handle("Could not open CD Player.");
  113.  
  114.     m_bInitialized = true;
  115.  
  116.     return true;
  117. }
  118.  
  119.  
  120.  
  121. //------------------------------------------------------------------------//
  122. // Closes the CD Audio device.  Make sure this function is
  123. // called before the program exits, or it may leave the device
  124. // in limbo.
  125. void CDPlay::Term()
  126. {
  127.     // make sure the CD stops before closing it.
  128.     if(IsPlaying())
  129.         Stop();
  130.  
  131.     mciSendCommand(m_iDeviceID, MCI_CLOSE, 0, NULL);
  132.  
  133.     Clear();
  134. }
  135.  
  136.  
  137. //------------------------------------------------------------------------//
  138. // This play function plays a single track.  If the looping
  139. // variable is set then it will play this track repeatedly.
  140. bool CDPlay::Play()
  141. {
  142.     if(!m_bInitialized)
  143.         return Error::Handle("CD Player is not initialized");
  144.     MCIERROR error;
  145.     // Depending on whether we're paused or not, either send
  146.     // a Resume or a Play command to the CD device.
  147.     if(IsPaused())
  148.     {
  149.         MCI_GENERIC_PARMS DefaultParms;
  150.         DefaultParms.dwCallback = MAKELONG(m_hWindow, 0);
  151.         error = mciSendCommand(m_iDeviceID, MCI_RESUME, 0, 
  152.             (DWORD)(LPVOID)&DefaultParms);
  153.     }
  154.     else
  155.     {
  156.         MCI_PLAY_PARMS PlayParms;
  157.         PlayParms.dwFrom = m_nCurrentTrack;
  158.         PlayParms.dwTo = m_nCurrentTrack + 1;
  159.         PlayParms.dwCallback = DWORD(m_hWindow);
  160.         error = mciSendCommand(m_iDeviceID, MCI_PLAY, 
  161.             MCI_FROM | MCI_TO | MCI_NOTIFY, (DWORD)(LPVOID)&PlayParms);
  162.     }
  163.     if(error)
  164.     {
  165.         m_Status = CDSTATUS_STOPPED;
  166.         return Error::Handle("Could not play CD Track %d", m_nCurrentTrack);
  167.     }
  168.     m_Status = CDSTATUS_PLAY;
  169.     return true;
  170. }
  171.  
  172.  
  173. //------------------------------------------------------------------------//
  174. bool CDPlay::Pause()
  175. {
  176.     if(!m_bInitialized)
  177.         return Error::Handle("CD Player is not initialized");
  178.     MCIERROR error;
  179.     MCI_GENERIC_PARMS DefaultParms;
  180.     DefaultParms.dwCallback = MAKELONG(m_hWindow, 0);
  181.     error = mciSendCommand(m_iDeviceID, MCI_PAUSE, 
  182.         MCI_NOTIFY, (DWORD)(LPVOID)&DefaultParms);
  183.     if(error)
  184.         return Error::Handle("Could not pause CD Audio");
  185.     m_Status = CDSTATUS_PAUSED;
  186.     return true;
  187. }
  188.  
  189. //------------------------------------------------------------------------//
  190. bool CDPlay::Stop()
  191. {
  192.     if(!m_bInitialized)
  193.         return Error::Handle("CD Player is not initialized");
  194.     MCIERROR error;
  195.     MCI_GENERIC_PARMS DefaultParms;
  196.     DefaultParms.dwCallback = MAKELONG(m_hWindow, 0);
  197.     error = mciSendCommand(m_iDeviceID, MCI_STOP, 
  198.         0, (DWORD)(LPVOID)&DefaultParms);
  199.     if(error)
  200.         return Error::Handle("Could not stop CD player");
  201.     m_Status = CDSTATUS_STOPPED;
  202.     return true;
  203. }
  204.  
  205. //------------------------------------------------------------------------//
  206. // The Continue function should be called from a window's
  207. // message handling loop.  See above notes for details
  208. // on how to check for the appropriate messages.
  209. bool CDPlay::OnMCINotify(WPARAM wParam, LPARAM lParam)
  210. {
  211.     if(!m_bInitialized)
  212.         return Error::Handle("CD Player is not initialized");
  213.     if(long(lParam) == m_iDeviceID)
  214.     {
  215.         switch(wParam)
  216.         {
  217.         // An MCI command has successfully completed
  218.         case MCI_NOTIFY_SUCCESSFUL:
  219.             switch(m_Status)
  220.             {
  221.             case CDSTATUS_STOPPED:
  222.                 break;
  223.             case CDSTATUS_PLAY:
  224.                 if(m_bLoop)
  225.                 {
  226.                     if(!Play())
  227.                         return Error::Handle("Could not play selected CD track");
  228.                 }
  229.                 else
  230.                     m_Status = CDSTATUS_STOPPED;
  231.                 break;
  232.             break;
  233.             };
  234.         // An MCI command has superceded a previously executed command
  235.         case MCI_NOTIFY_SUPERSEDED:
  236.             break;
  237.         };
  238.     }
  239.  
  240.     return true;
  241. }
  242.  
  243.  
  244.