home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Borland Programmer's Resource
/
Borland_Programmers_Resource_CD_1995.iso
/
sounds
/
audiocd
/
cd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-18
|
9KB
|
267 lines
/***********************************************************************/
/* Simple CD Player --- 24 October 1992 */
/* */
/* Written by John A. Junod using code ideas presented in the SDK */
/* documentation and uses the basic code form from Quick Case. */
/* */
/* This program opens "CDAUDIO" when the program starts, keeps it open */
/* while the program is running and closes it on exit. This does make */
/* some actions take less time. Error recovery is basically non- */
/* existant beyond giving the user a basically useless error message. */
/* */
/* This program has no "main" window and relies on a dialog box to do */
/* everything. */
/* */
/* 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"
HWND hInst;
HWND hMainWnd;
char szBuffer[4096]; /* general purpose large buffer */
char szBuf[256]; /* general purpose small buffer */
char szTitle[100]; /* window title */
UINT wDeviceID; /* open cd device id */
int iCDstatus; /* cd status */
#define CD_STOPPED 0
#define CD_PLAYING 1
#define CD_PAUSED 2
#define CD_NOTRDY 3
#define CD_OPEN 4
char *szStatus[5]={"stopped","playing","paused","notready","open"};
HCURSOR hHourGlass;
HCURSOR hSaveCursor;
HICON hIcon;
BOOL bCanEject;
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
/***********************************************************************/
/* HANDLE hInstance; handle for this instance */
/* HANDLE hPrevInstance; handle for possible previous instances */
/* LPSTR lpszCmdLine; long pointer to exec command line */
/* int nCmdShow; Show code for main window display */
/***********************************************************************/
MCI_OPEN_PARMS mciOpenParms;
FARPROC lpMainDlg;
DWORD dwMCIerr;
hInst = hInstance;
if(hPrevInstance) return(0);
hHourGlass=LoadCursor(NULL,IDC_WAIT);
hIcon=LoadIcon(hInst,"CDICON");
// open the compact disc device
mciOpenParms.lpstrDeviceType="cdaudio";
if(dwMCIerr=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE,
(DWORD)(LPVOID)&mciOpenParms)) {
// failed to open, show the error and end this program.
showMCIError(dwMCIerr);
return(FALSE);
}
// opened successfully
wDeviceID=mciOpenParms.wDeviceID;
if(dwMCIerr=CD_GetDeviceInfo(wDeviceID))
showMCIError(dwMCIerr);
iCDstatus=CD_GetCurrentStatus(wDeviceID);
if((lpMainDlg=MakeProcInstance((FARPROC)MainDlg,hInst))==NULL)
MessageBox(NULL,"MakeProc Failed","CD Error",MB_OK);
else
if(DialogBox(hInst,"CDBox",hMainWnd,lpMainDlg)== -1)
MessageBox(NULL,"Couldn't create dialog box","CD Error",MB_OK);
else
FreeProcInstance(lpMainDlg);
// close the CD device and exit program
if(dwMCIerr=mciSendCommand(wDeviceID,MCI_CLOSE,0,NULL))
showMCIError(dwMCIerr);
return TRUE;
} /* End of WinMain */
BOOL FAR PASCAL MainDlg(HWND hDlg, unsigned message, WORD wParam, LONG lParam)
{
DWORD dwMCIerr;
UINT uAUXerr;
DWORD volume;
HMENU hMenu;
switch(message) {
case WM_INITDIALOG:
// change the system menus of this dialog box!
hMenu=GetSystemMenu(hDlg,FALSE);
RemoveMenu(hMenu,4,MF_BYPOSITION);
AppendMenu(hMenu,MF_SEPARATOR,0,NULL);
AppendMenu(hMenu,MF_STRING,IDM_SHAUTH,"About...");
AppendMenu(hMenu,MF_SEPARATOR,0,NULL);
AppendMenu(hMenu,MF_STRING,IDM_EJECT,"Eject");
AppendMenu(hMenu,MF_STRING,IDM_STOP,"Stop");
AppendMenu(hMenu,MF_STRING,IDM_PAUSE,"Pause");
AppendMenu(hMenu,MF_STRING,IDM_PLAY,"Play");
AppendMenu(hMenu,MF_STRING,IDM_BACK,"Backward");
AppendMenu(hMenu,MF_STRING,IDM_FORWARD,"Forward");
AppendMenu(hMenu,MF_STRING,IDM_STATUS,"Tracks...");
// sub-routines use the global hMainWnd as the window to notify
hMainWnd=hDlg;
// format the window title line
wsprintf(szTitle,"CD (%s) %d",
(LPSTR)szStatus[CD_GetCurrentStatus(wDeviceID)],
CD_GetCurrentTrack(wDeviceID));
// display new title
SetWindowText(hDlg,szTitle);
// set a timer ~5 seconds to update title
SetTimer(hDlg,1,5000,NULL);
return(TRUE);
// timer click updates title to reflect status of CD
case WM_TIMER:
case MM_MCINOTIFY:
iCDstatus=CD_GetCurrentStatus(wDeviceID);
// format the window title line
wsprintf(szBuffer,"CD (%s) %d",
(LPSTR)szStatus[iCDstatus],
CD_GetCurrentTrack(wDeviceID));
// only update it if it changes as we don't like flashing
if(lstrcmp(szBuffer,szTitle)!=0) {
lstrcpy(szTitle,szBuffer);
SetWindowText(hDlg,szTitle);
}
break;
case WM_SYSCOMMAND:
case WM_COMMAND:
switch(wParam) {
// show some useful info???
case IDM_STATUS:
if((dwMCIerr=CD_ShowTrackTimes(wDeviceID,szBuffer))!=0L)
showMCIError(dwMCIerr);
break;
// start play at track 1
case IDM_PLAY:
if((dwMCIerr=CD_PlayTrack(wDeviceID,1,0))!=0L)
showMCIError(dwMCIerr);
else {
iCDstatus=CD_PLAYING;
wsprintf(szTitle,"CD (%s) %d",(LPSTR)szStatus[iCDstatus],
CD_GetCurrentTrack(wDeviceID));
SetWindowText(hDlg,szTitle);
}
break;
// if the CD is playing, backup one track, else play
case IDM_BACK:
if(iCDstatus==CD_PLAYING) {
if((dwMCIerr=CD_ChangeTrack(wDeviceID,-1))!=0L)
showMCIError(dwMCIerr);
} else SendMessage(hDlg,WM_COMMAND,IDM_PLAY,0L);
break;
// if the CD is playing, forward one track, else play
case IDM_FORWARD:
if(iCDstatus==CD_PLAYING) {
if((dwMCIerr=CD_ChangeTrack(wDeviceID,1))!=0L)
showMCIError(dwMCIerr);
} else SendMessage(hDlg,WM_COMMAND,IDM_PLAY,0L);
break;
// if the CD is playing, pause it, else resume play
case IDM_PAUSE:
if(iCDstatus==CD_PLAYING) {
if((dwMCIerr=CD_Pause(wDeviceID))!=0L)
showMCIError(dwMCIerr);
else iCDstatus=CD_PAUSED;
} else
SendMessage(hDlg,WM_COMMAND,IDM_RESUME,0L);
break;
// if the CD is paused, resume play (play at current location)
case IDM_RESUME:
if(iCDstatus==CD_PAUSED || iCDstatus==CD_STOPPED) {
if((dwMCIerr=CD_ResumePlay(wDeviceID))!=0L)
showMCIError(dwMCIerr);
else {
iCDstatus=CD_PLAYING;
wsprintf(szTitle,"CD (%s) %d",(LPSTR)szStatus[iCDstatus],
CD_GetCurrentTrack(wDeviceID));
SetWindowText(hDlg,szTitle);
}
}
break;
// if the CD is playing or pause, stop it
case IDM_STOP:
if(iCDstatus==CD_PLAYING || iCDstatus==CD_PAUSED) {
if((dwMCIerr=CD_Stop(wDeviceID))!=0L)
showMCIError(dwMCIerr);
else iCDstatus=CD_STOPPED;
}
break;
// untested (mine doesn't support) toggle door open/closed
case IDM_EJECT:
if(iCDstatus!=CD_OPEN) {
if((dwMCIerr=CD_Open(wDeviceID))!=0L)
showMCIError(dwMCIerr);
else iCDstatus=CD_OPEN;
} else if((dwMCIerr=CD_Close(wDeviceID))!=0L)
showMCIError(dwMCIerr);
else iCDstatus=CD_STOPPED;
break;
// this is a test routine (activated by non-visible button)
case IDM_SHVOL:
uAUXerr=auxGetVolume(wDeviceID,(LPDWORD)&volume);
wsprintf(szBuf,"E:%u VL:%d VH:%d",uAUXerr,
LOWORD(volume),HIWORD(volume));
MessageBox(hDlg,szBuf,"CD Volume",MB_OK);
break;
// brag routine (actived by non-visible button)
case IDM_SHAUTH:
MessageBox(hDlg,
"Created by John A. Junod\nzj8549@trotter.usma.edu",
"CD Author",MB_OK);
break;
// if they select close, turn off the timer and exit
case IDCANCEL:
KillTimer(hDlg,1);
EndDialog(hDlg,NULL);
return(TRUE);
default:
return(DefWindowProc(hDlg,message,wParam,lParam));
}
return(TRUE);
case WM_CLOSE:
KillTimer(hDlg,1);
break;
}
return(FALSE);
}
// use mciGetErrorString to display error
void showMCIError(DWORD dwError) {
char szErrorBuf[MAXERRORLENGTH];
MessageBeep(MB_ICONEXCLAMATION);
if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH))
MessageBox(hMainWnd,szErrorBuf,"MCI Error",MB_ICONEXCLAMATION);
else
MessageBox(hMainWnd,"Unknown Error","MCI Error",MB_ICONEXCLAMATION);
}