mirror of
https://github.com/softdorothy/GliderPRO.git
synced 2024-11-22 05:31:29 +00:00
1 line
8.5 KiB
C
1 line
8.5 KiB
C
|
//============================================================================
//----------------------------------------------------------------------------
// Music.c
//----------------------------------------------------------------------------
//============================================================================
#include <Resources.h>
#include <Sound.h>
#include "Environ.h"
#include "Externs.h"
#define kBaseBufferMusicID 2000
#define kMaxMusic 7
#define kLastMusicPiece 16
#define kLastGamePiece 6
pascal void MusicCallBack (SndChannelPtr, SndCommand *);
OSErr LoadMusicSounds (void);
OSErr DumpMusicSounds (void);
OSErr OpenMusicChannel (void);
OSErr CloseMusicChannel (void);
SndCallBackUPP musicCallBackUPP;
SndChannelPtr musicChannel;
Ptr theMusicData[kMaxMusic];
short musicSoundID, musicCursor;
short musicScore[kLastMusicPiece];
short gameScore[kLastGamePiece];
short musicMode;
Boolean isMusicOn, isPlayMusicIdle, isPlayMusicGame;
Boolean failedMusic, dontLoadMusic;
extern Boolean isSoundOn;
//============================================================== Functions
//-------------------------------------------------------------- StartMusic
OSErr StartMusic (void)
{
SndCommand theCommand;
OSErr theErr;
short soundVolume;
theErr = noErr;
if (dontLoadMusic)
return(theErr);
UnivGetSoundVolume(&soundVolume, thisMac.hasSM3);
if ((soundVolume != 0) && (!failedMusic))
{
theCommand.cmd = bufferCmd;
theCommand.param1 = 0;
theCommand.param2 = (long)(theMusicData[musicSoundID]);
theErr = SndDoCommand(musicChannel, &theCommand, false);
if (theErr != noErr)
return (theErr);
theCommand.cmd = 0;
theCommand.param1 = 1964;
theCommand.param2 = SetCurrentA5();
theErr = SndDoCommand(musicChannel, &theCommand, false);
if (theErr != noErr)
return (theErr);
musicCursor++;
if (musicCursor >= kLastMusicPiece)
musicCursor = 0;
musicSoundID = musicScore[musicCursor];
theCommand.cmd = bufferCmd;
theCommand.param1 = 0;
theCommand.param2 = (long)(theMusicData[musicSoundID]);
theErr = SndDoCommand(musicChannel, &theCommand, false);
if (theErr != noErr)
return (theErr);
theCommand.cmd = callBackCmd;
theCommand.param1 = 0;
theCommand.param2 = SetCurrentA5();
theErr = SndDoCommand(musicChannel, &theCommand, false);
isMusicOn = true;
}
return (theErr);
}
//-------------------------------------------------------------- StopTheMusic
void StopTheMusic (void)
{
SndCommand theCommand;
OSErr theErr;
if (dontLoadMusic)
return;
theErr = noErr;
if ((isMusicOn) && (!failedMusic))
{
theCommand.cmd = flushCmd;
theCommand.param1 = 0;
theCommand.param2 = 0L;
theErr = SndDoImmediate(musicChannel, &theCommand);
theCommand.cmd = quietCmd;
theCommand.param1 = 0;
theCommand.param2 = 0L;
theErr = SndDoImmediate(musicChannel, &theCommand);
isMusicOn = false;
}
}
//-------------------------------------------------------------- ToggleMusicWhilePlaying
void ToggleMusicWhilePlaying (void)
{
OSErr theErr;
if (dontLoadMusic)
return;
if (isPlayMusicGame)
{
if (!isMusicOn)
theErr = StartMusic();
}
else
{
if (isMusicOn)
StopTheMusic();
}
}
//-------------------------------------------------------------- SetMusicalPiece
void SetMusicalMode (short newMode)
{
if (dontLoadMusic)
return;
switch (newMode)
{
case kKickGameScoreMode:
musicCursor = 2;
break;
case kProdGameScoreMode:
musicCursor = -1;
break;
default:
musicMode = newMode;
musicCursor = 0;
break;
}
}
//-------------------------------------------------------------- MusicCallBack
pascal void MusicCallBack (SndChannelPtr theChannel, SndCommand *theCommand)
{
#pragma unused (theChannel)
long thisA5, gameA5;
OSErr theErr;
// gameA5 = theCommand.param2;
// thisA5 = SetA5(gameA5);
switch (musicMode)
{
case kPlayGameScoreMode:
musicCursor++;
if (musicCursor >= kLastGamePiece)
musicCursor = 1;
musicSoundID = gameScore[musicCursor];
if (musicSoundID < 0
|