home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Borland Programmer's Resource
/
Borland_Programmers_Resource_CD_1995.iso
/
sounds
/
audiocd
/
cd_cmds.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-18
|
8KB
|
282 lines
/***********************************************************************/
/* 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));
}