From 2186d5f3f95cd74a070a490d899291648d58667a Mon Sep 17 00:00:00 2001 From: Steven Fuller Date: Sun, 1 Jul 2001 00:55:22 +0000 Subject: Initial revision --- src/win95/cd_player.c | 602 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 602 insertions(+) create mode 100644 src/win95/cd_player.c (limited to 'src/win95/cd_player.c') diff --git a/src/win95/cd_player.c b/src/win95/cd_player.c new file mode 100644 index 0000000..f6e2861 --- /dev/null +++ b/src/win95/cd_player.c @@ -0,0 +1,602 @@ +#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"); + } +} -- cgit v1.3