/***********************************************************************/ /* Simple CD Player --- 24 October 1992 */ /* This module provides the CD commands. */ /* */ /* Written by John A. Junod using code ideas presented in the SDK */ /* documentation. */ /* */ /* Modify this as much as you wish and redistribute however you wish, */ /* but I do ask that you give me some of the credit and that you let */ /* other people use the final product for FREE and don't charge some */ /* silly shareware fee of $25. */ /***********************************************************************/ #include "cd.h" extern HWND hMainWnd; extern char szBuffer[]; extern HCURSOR hHourGlass; extern BOOL bCanEject; DWORD CD_GetDeviceInfo(UINT wDeviceID) { HCURSOR hSaveCursor; DWORD dwReturn; MCI_GETDEVCAPS_PARMS mciGDCparms; MCI_STATUS_PARMS mciStatusParms; WAITON(); // can this drive eject? mciGDCparms.dwItem=MCI_GETDEVCAPS_CAN_EJECT; if(dwReturn=mciSendCommand(wDeviceID,MCI_GETDEVCAPS, MCI_GETDEVCAPS_ITEM, (DWORD)(LPVOID)&mciGDCparms)) { WAITOFF(); return(dwReturn); } bCanEject=mciGDCparms.dwReturn; mciStatusParms.dwItem=MCI_STATUS_MEDIA_PRESENT; if(dwReturn=mciSendCommand(wDeviceID,MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms)) { WAITOFF(); return(dwReturn); } WAITOFF(); if(!(mciStatusParms.dwReturn)) MessageBox(hMainWnd,"No media present.","CD Audio Player",MB_OK); return(0L); } DWORD CD_ShowTrackTimes(UINT wDeviceID,LPSTR szTimeString) { HCURSOR hSaveCursor; int i, iNumTracks, iStatus; DWORD dwReturn; DWORD dwPosition; DWORD *pMem; char szTempString[64]; MCI_SET_PARMS mciSetParms; MCI_STATUS_PARMS mciStatusParms; WAITON(); // set time format to minute/second/frame mciSetParms.dwTimeFormat=MCI_FORMAT_MSF; if(dwReturn=mciSendCommand(wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT, (DWORD)(LPVOID)&mciSetParms)) { WAITOFF(); return(dwReturn); } // get number of tracks (limit to 20) mciStatusParms.dwItem=MCI_STATUS_NUMBER_OF_TRACKS; if(dwReturn=mciSendCommand(wDeviceID,MCI_STATUS,MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms)) { WAITOFF(); return(dwReturn); } iNumTracks=mciStatusParms.dwReturn; wsprintf(szTimeString," CD Player\nJohn A. Junod\nTracks: %2d\n", iNumTracks); // iNumTracks=min(iNumTracks,20); // get device status mciStatusParms.dwItem=MCI_STATUS_MODE; if((dwReturn=mciSendCommand(wDeviceID,MCI_STATUS,MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms))==0L) { iStatus=mciStatusParms.dwReturn; wsprintf(szTempString,"Status: %d\nEject: %d\n",iStatus,bCanEject); lstrcat(szTimeString,szTempString); // alloc memory for start if((pMem=(DWORD *)LocalAlloc(LPTR,iNumTracks*sizeof(DWORD)))!=NULL) { // for each track, get and save start position and build string for(i=1;i<=iNumTracks;i++) { mciStatusParms.dwItem=MCI_STATUS_LENGTH; mciStatusParms.dwTrack=i; if(dwReturn=mciSendCommand(wDeviceID,MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK, (DWORD)(LPVOID)&mciStatusParms)) { LocalFree((HANDLE)pMem); WAITOFF(); return(dwReturn); } pMem[i-1]=mciStatusParms.dwReturn; wsprintf(szTempString,"Track %2d - %02d:%02d:%02d\n", i,MCI_MSF_MINUTE(pMem[i-1]), MCI_MSF_SECOND(pMem[i-1]), MCI_MSF_FRAME(pMem[i-1])); lstrcat(szTimeString,szTempString); } // display results MessageBox(hMainWnd,szTimeString,"Track Times", MB_OK); // free memory and close device LocalFree((HANDLE)pMem); dwReturn=0L; } else dwReturn= -1L; // pMem failed } WAITOFF(); return(dwReturn); } int CD_GetCurrentTrack(UINT wDeviceID) { DWORD dwReturn; int iCurrentTrack; MCI_SET_PARMS mciSetParms; MCI_STATUS_PARMS mciStatusParms; // set time format to minute/second/frame mciSetParms.dwTimeFormat=MCI_FORMAT_MSF; if(dwReturn=mciSendCommand(wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT, (DWORD)(LPVOID)&mciSetParms)) iCurrentTrack= -1; else { // get current track that we are playing mciStatusParms.dwItem=MCI_STATUS_CURRENT_TRACK; if(dwReturn=mciSendCommand(wDeviceID,MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms)) iCurrentTrack= -1; else iCurrentTrack=mciStatusParms.dwReturn; } // if(iCurrentTrack== -1) showMCIError(dwReturn); return(iCurrentTrack); } int CD_GetCurrentStatus(UINT wDeviceID) { DWORD dwReturn; MCI_STATUS_PARMS mciStatusParms; int iRetCode; iRetCode=0; mciStatusParms.dwItem=MCI_STATUS_MODE; if(dwReturn=mciSendCommand(wDeviceID,MCI_STATUS,MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatusParms)) { iRetCode= -1; } else { switch(mciStatusParms.dwReturn) { case MCI_MODE_PLAY: iRetCode=1; break; case MCI_MODE_PAUSE: iRetCode=2; break; case MCI_MODE_OPEN: iRetCode=4; break; case MCI_MODE_SEEK: iRetCode=3; break; case MCI_MODE_NOT_READY: iRetCode=3; break; } } // if(iRetCode== -1) showMCIError(dwReturn); return(iRetCode); } // play a given cdaudio track DWORD CD_PlayTrack(UINT wDeviceID,BYTE bStartTrack,BYTE bEndTrack) { HCURSOR hSaveCursor; DWORD dwParams; DWORD dwReturn; MCI_SET_PARMS mciSetParms; MCI_PLAY_PARMS mciPlayParms; WAITON(); // set time format to track/minute/second/frame mciSetParms.dwTimeFormat=MCI_FORMAT_TMSF; if(dwReturn=mciSendCommand(wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT, (DWORD)(LPVOID)&mciSetParms)) { WAITOFF(); return(dwReturn); } // notify on completion dwParams=MCI_NOTIFY; mciPlayParms.dwCallback=(DWORD)hMainWnd; // if start is not specified, we pick up where we left off if(bStartTrack>0) dwParams |= MCI_FROM; mciPlayParms.dwFrom=MCI_MAKE_TMSF(bStartTrack,0,0,0); // if end is not specified, we play the rest of the cd if(bEndTrack>bStartTrack) dwParams |= MCI_TO; mciPlayParms.dwTo =MCI_MAKE_TMSF(bEndTrack,0,0,0); // execute the command dwReturn=mciSendCommand(wDeviceID,MCI_PLAY, dwParams,(DWORD)(LPVOID) &mciPlayParms); WAITOFF(); return(dwReturn); } // pause cdaudio DWORD CD_Pause(UINT wDeviceID) { HCURSOR hSaveCursor; DWORD dwReturn; MCI_GENERIC_PARMS mciGenericParms; WAITON(); mciGenericParms.dwCallback=(DWORD)hMainWnd; dwReturn=mciSendCommand(wDeviceID,MCI_PAUSE,MCI_NOTIFY, (DWORD)(LPVOID)&mciGenericParms); WAITOFF(); return(dwReturn); } DWORD CD_ResumePlay(UINT wDeviceID){ HCURSOR hSaveCursor; DWORD dwReturn; MCI_GENERIC_PARMS mciGenericParms; MCI_PLAY_PARMS mciPlayParms; WAITON(); mciGenericParms.dwCallback=(DWORD)hMainWnd; mciPlayParms.dwCallback =(DWORD)hMainWnd; // attempt a resume command, if it fails (device doesn't support it), // then do a play with no parameters. if(dwReturn=mciSendCommand(wDeviceID,MCI_RESUME,MCI_NOTIFY, (DWORD)(LPVOID)&mciGenericParms)) dwReturn=mciSendCommand(wDeviceID,MCI_PLAY,MCI_NOTIFY, (DWORD)(LPVOID)&mciPlayParms); WAITOFF(); return(dwReturn); } DWORD CD_Stop(UINT wDeviceID){ HCURSOR hSaveCursor; DWORD dwReturn; MCI_GENERIC_PARMS mciGenericParms; WAITON(); mciGenericParms.dwCallback=(DWORD)hMainWnd; dwReturn=mciSendCommand(wDeviceID,MCI_STOP,MCI_NOTIFY, (DWORD)(LPVOID)&mciGenericParms); WAITOFF(); return(dwReturn); } DWORD CD_Open(UINT wDeviceID){ HCURSOR hSaveCursor; DWORD dwReturn; MCI_SET_PARMS mciSetParms; WAITON(); mciSetParms.dwCallback=(DWORD)hMainWnd; dwReturn=mciSendCommand(wDeviceID,MCI_SET_DOOR_OPEN,MCI_NOTIFY, (DWORD)(LPVOID)&mciSetParms); WAITOFF(); return(dwReturn); } DWORD CD_Close(UINT wDeviceID){ HCURSOR hSaveCursor; DWORD dwReturn; MCI_SET_PARMS mciSetParms; WAITON(); mciSetParms.dwCallback=(DWORD)hMainWnd; dwReturn=mciSendCommand(wDeviceID,MCI_SET_DOOR_CLOSED,MCI_NOTIFY, (DWORD)(LPVOID)&mciSetParms); WAITOFF(); return(dwReturn); } DWORD CD_ChangeTrack(UINT wDeviceID,int iNoffs) { int iNewTrack; iNewTrack=CD_GetCurrentTrack(wDeviceID)+iNoffs; if(iNewTrack<1) return(0L); return(CD_PlayTrack(wDeviceID,iNewTrack,0)); }