#include "3dc.h" #include "inline.h" #include "psndplat.h" #include "cd_player.h" #define UseLocalAssert Yes #include "ourasert.h" /* KJL 12:40:35 07/05/98 - This is code derived from Patrick's original stuff & moved into it's own file. */ /* Patrick 10/6/97 ------------------------------------------------------------- CDDA Support ----------------------------------------------------------------------------*/ #define NO_DEVICE -1 int cdDeviceID = NO_DEVICE; int cdAuxDeviceID = NO_DEVICE; /* Patrick 9/6/97 ------------------------------------------------------------- ---------------------------------------------------------------------------- CDDA Support ----------------------------------------------------------------------------- -----------------------------------------------------------------------------*/ static int CDDASwitchedOn = 0; static int CDDAIsInitialised = 0; static int CDDAVolume = CDDA_VOLUME_DEFAULT; CDOPERATIONSTATES CDDAState; static DWORD PreGameCDVolume;//windows cd volume before the game started static CDTRACKID TrackBeingPlayed; static enum CDCOMMANDID LastCommandGiven; extern HWND hWndMain; int CDPlayerVolume; // volume control from menus int CDTrackMax=-1; //highest track number on cd void CDDA_Start(void) { CDDAVolume = CDDA_VOLUME_DEFAULT; CDPlayerVolume = CDDAVolume; CDDAState = CDOp_Idle; CDDAIsInitialised = 0; if(PlatStartCDDA()!=SOUND_PLATFORMERROR) { CDDAIsInitialised = 1; CDDA_SwitchOn(); CDDA_ChangeVolume(CDDAVolume); /* init the volume */ CDDA_CheckNumberOfTracks(); } LastCommandGiven = CDCOMMANDID_Start; } void CDDA_End(void) { if(!CDDAIsInitialised) return; CDDA_Stop(); PlatChangeCDDAVolume(CDDA_VOLUME_RESTOREPREGAMEVALUE); PlatEndCDDA(); CDDA_SwitchOff(); CDDAIsInitialised = 0; LastCommandGiven = CDCOMMANDID_End; } void CDDA_Management(void) { if(!CDDASwitchedOn) return; /* CDDA is off */ if(CDDAState==CDOp_Playing) return; /* already playing */ PlatCDDAManagement(); } void CDDA_Play(int CDDATrack) { int ok; if(!CDDASwitchedOn) return; /* CDDA is off */ if(CDDAState==CDOp_Playing) return; /* already playing */ if((CDDATrack<=0)||(CDDATrack>=CDTrackMax)) return; /* no such track */ ok = PlatPlayCDDA((int)CDDATrack); if(ok!=SOUND_PLATFORMERROR) { CDDAState=CDOp_Playing; LastCommandGiven = CDCOMMANDID_Play; TrackBeingPlayed = CDDATrack; } } void CDDA_PlayLoop(int CDDATrack) { int ok; if(!CDDASwitchedOn) return; /* CDDA is off */ if(CDDAState==CDOp_Playing) return; /* already playing */ if((CDDATrack<=0)||(CDDATrack>=CDTrackMax)) return; /* no such track */ ok = PlatPlayCDDA((int)CDDATrack); if(ok!=SOUND_PLATFORMERROR) { CDDAState=CDOp_Playing; LastCommandGiven = CDCOMMANDID_PlayLoop; TrackBeingPlayed = CDDATrack; } } extern void CheckCDVolume(void) { if (CDDAVolume != CDPlayerVolume) { CDDA_ChangeVolume(CDPlayerVolume); } } void CDDA_ChangeVolume(int volume) { if(!CDDASwitchedOn) return; /* CDDA is off */ if(volumeCDDA_VOLUME_MAX) return; if(CDDA_IsOn()) { if(PlatChangeCDDAVolume(volume)) { CDDAVolume=volume; CDPlayerVolume = volume; LastCommandGiven = CDCOMMANDID_ChangeVolume; } } } int CDDA_GetCurrentVolumeSetting(void) { return CDDAVolume; } void CDDA_Stop() { int ok; if(!CDDASwitchedOn) return; /* CDDA is off */ if(CDDAState!=CDOp_Playing) return; /* nothing playing */ ok = PlatStopCDDA(); CDDAState=CDOp_Idle; LastCommandGiven = CDCOMMANDID_Stop; } void CDDA_SwitchOn() { LOCALASSERT(!CDDA_IsPlaying()); if(CDDAIsInitialised) CDDASwitchedOn = 1; } void CDDA_SwitchOff() { if(!CDDASwitchedOn) return; /* CDDA is off already */ if(CDDA_IsPlaying()) CDDA_Stop(); CDDASwitchedOn = 0; } int CDDA_IsOn() { return CDDASwitchedOn; } int CDDA_IsPlaying() { if(CDDAState==CDOp_Playing) { LOCALASSERT(CDDASwitchedOn); return 1; } return 0; } int CDDA_CheckNumberOfTracks() { int numTracks=0; if(CDDA_IsOn()) { PlatGetNumberOfCDTracks(&numTracks); //if there is only one track , then it probably can't be used anyway if(numTracks==1) numTracks=0; //store the maximum allowed track number CDTrackMax=numTracks; } return numTracks; } /* win95 specific */ int PlatStartCDDA(void) { static void PlatGetCDDAVolumeControl(void); DWORD dwReturn; MCI_OPEN_PARMS mciOpenParms; /* Initialise device handles */ cdDeviceID = NO_DEVICE; cdAuxDeviceID = NO_DEVICE; /* try to open mci cd-audio device */ mciOpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO; dwReturn = mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID,(DWORD)(LPVOID)&mciOpenParms); if(dwReturn) { /* error */ cdDeviceID = NO_DEVICE; return SOUND_PLATFORMERROR; } cdDeviceID = mciOpenParms.wDeviceID; /* now try to get the cd volume control, by obtaining the auxiliary device id for the cd-audio player*/ PlatGetCDDAVolumeControl(); return 0; } /* this is a support function for PlatStartCDDA() */ #if 0 static void PlatGetCDDAVolumeControl(void) { MMRESULT mmres; unsigned int numAuxDevs,i; numAuxDevs = auxGetNumDevs(); /* search the auxilary device list for the cd player */ for(i=0;i VOLUME_CDDA_MAXPLAT) channelVolume = VOLUME_CDDA_MAXPLAT; /* set left and right channels (if there is only one channel, should still work ok)*/ newVolume = channelVolume|(channelVolume<<16); } PlatGetCDDAVolumeControl(); mmres = auxSetVolume((UINT)cdAuxDeviceID,(DWORD)newVolume); if(mmres==MMSYSERR_NOERROR) return 1; else return SOUND_PLATFORMERROR; } #else int PlatChangeCDDAVolume(int volume) { MMRESULT mmres; unsigned int newVolume; int i; int numDev = mixerGetNumDevs(); /* check the cdDeviceId */ if(cdDeviceID==NO_DEVICE) return SOUND_PLATFORMERROR; //go through the mixer devices searching for one that can deal with the cd volume for(i=0;icontrol.Bounds.dwMaximum) newVolume=control.Bounds.dwMaximum; } //fill in the volume in the control details structure detailValue.dwValue=newVolume; mmres = mixerSetControlDetails(handle,&details,MIXER_SETCONTROLDETAILSF_VALUE); mixerClose(handle); if(mmres==MMSYSERR_NOERROR) return 1; else return SOUND_PLATFORMERROR; } } mixerClose(handle); } } return SOUND_PLATFORMERROR; } #endif void PlatCDDAManagement(void) { /* does nothing for Win95: use call back instead */ } void PlatCDDAManagementCallBack(WPARAM flags, LONG deviceId) { extern CDOPERATIONSTATES CDDAState; /* check the cdDeviceId */ if(cdDeviceID==NO_DEVICE) return; /* compare with the passed device id */ if((UINT)deviceId!=(UINT)cdDeviceID) return; if(flags&MCI_NOTIFY_SUCCESSFUL) { CDDAState = CDOp_Idle; //NewOnScreenMessage("CD COMMAND RETURNED WITH SUCCESSFUL"); /* Play it again, sam */ if (LastCommandGiven == CDCOMMANDID_PlayLoop) { CDDA_PlayLoop(TrackBeingPlayed); } } else if(flags&MCI_NOTIFY_FAILURE) { /* error while playing: abnormal termination */ //NewOnScreenMessage("CD COMMAND FAILED"); CDDAState = CDOp_Idle; } else if(flags&MCI_NOTIFY_SUPERSEDED) { //NewOnScreenMessage("CD COMMAND SUPERSEDED"); } else if(flags&MCI_NOTIFY_ABORTED) { /* aborted or superceeded: try and stop the device */ //NewOnScreenMessage("CD COMMAND ABORTED(?)"); // CDDA_Stop(); } else { //NewOnScreenMessage("CD COMMAND RETURNED WITH UNKNOWN MESSAGE"); } }