2013-12-20 01:25:00 -05:00

1 line
14 KiB

** SoundMusicSys.h
** Structures for handling the sounds used by system
** (c) 1989-1994 by Halestorm, Inc, All Rights Reserved
** History -
** 7/20/89 Created
** 7/24/89 Created Asyncronous Sample List Player.
** 12/3/89 Modified all tools to work with the Sound Driver instead of the
** Sound Manager (He got fired.)
** 12/21/89 Added PlayTheSample.
** 2/1/90 Added Sound Manager (he got hired as a consultant) and use it
** when system 6.0 or greater is around. (Better sound. !!?!??)
** 4/10/90 Fixed pause/resume sound to allocate/deallocate sound channel.
** 7/3/90 Added a REST mechanisim to the SampleList player
** 7/28/90 Added IsSoundListFinished() to the SampleList player
** 7/31/90 Added IsSoundFXFinished()
** 8/13/90 Moved example and StandAlone code to a seperate project.
** 12/12/90 Added GetSoundWaveform() & GetSoundLength() & GetSoundDefaultRate().
** 1/9/91 Added sound done call back function.
** 3/4/91 Completed work on Sound Driver's call back.
** 4/10/91 Fixed a bug in CalcPlaybackLength that calculated the wrong length.
** 4/10/91 Added purgability of the samples.
** 4/23/91 Added better compatibility to Think C version 3.0
** 4/30/91 Put in support for snd resource type 1 and type 2.
** 5/18/91 Changed to zone calls instead of globals.
** 5/20/91 Mucking around for bug that Mick is having.
** 5/20/91 Added csnd compressed resource based upon the LZSS algo.
** 5/25/91 Added a FinisSoundChannel/InitSoundChannel inside of EndSound() for Mick
** 5/27/91 Fixed potential bug with BeginSoundList() in which the sound may be
** loaded during a VBL!
** 5/28/91 Modified to new Think C MPW like header names.
** 6/18/91 Added delay to the starting of a new sound with BeginSound (4 Ticks).
** 7/24/91 Added delay to the starting of a new sound with PlayTheSample (4 Ticks).
** 8/5/91 Removed duplicate code in BeginSound & PlayTheSample.
** 8/5/91 Added 2 tick delay to soundLength. Used in IsSoundFXFinished.
** 8/5/91 Added BeginSoundReverse & BeginSoundSection.
** 8/6/91 Fixed some memory management problems with SoundMemorySize.
** 8/6/91 Added a semaphore to the vbl task.
** 9/9/91 Cleaned up for Think C 5.0
** 9/9/91 Added PLAY_ALL_SAMPLE
** 9/9/91 Changed all 'int's to 'short int'. Sorry guys. This is because I want
** 16 bit integers.
** 10/8/91 Added sound looping features. BeginSoundLoop(), BeginSoundEnvelope(),
** and BeginSoundEnvelopeProc().
** 11/11/91 Added SoundLock().
** 1/22/92 Put in buffer SndDoCommands for looped & enveloped sounds
** 3/9/92 Modifed for MPW and removed all THINK C 3 & 4 compiler stuff
** 3/23/92 Added access to"Private-Sound/Music.h"
** 5/1/92 Added the SoundChannelRestart() function
** 7/10/92 Combined SoundSys.h & MusicSys.h into new and improved version
** 7/10/92 Added new calls to initilize & clean up the system
** 7/10/92 Heavily modified for Rev 3 of the sound system.
** 7/10/92 Now calling jim's sound mixer
** 7/13/92 Added BeginMasterFadeOut & FadeLevel
** 7/18/92 Fully intergrated the SoundManager out and replaced with "SoundGod"
** 7/26/92 Added ChangeOuputQuality() and fixed bug with BeginSongLooped
** 7/31/92 Fixed weird bug with MPW passing of 32-bit value "shorts"!!
** 7/31/92 Fixed BeginMasterFadeOut code.
** 8/4/92 Change playback rate command to 16.16 fixed value. Sorry guys.
** 8/6/92 Built a mult-voice tracker, to work with sound effects.
** 8/23/92 Added 2 pt intrepolation
** 8/24/92 Added ChangeSystemVoices
** 12/4/92 Added LoadSound
** 12/9/92 Added FreeSound
** 12/29/92 ResumeSoundMusicSystem and PauseSoundMusicSystem now return
** errors
** 3/6/93 Fixed the SoundDone callback system.
** 3/6/93 Elimated the playback decay govenour.
** 3/16/93 Added BeginMasterFadeIn
** 3/19/93 Added SetSongDoneCallBack
** 5/31/93 Made LoadSong/FreeSong work
** 6/14/93 Changed VBL task to be out of the system heap
** 6/24/93 Added StartFilePlayback, EndFilePlayback, and ChangeFilePlaybackRate
** 6/24/93 Added IsThisSoundFXFinished
** 7/2/93 Added EndSoundList
** 7/13/93 Fixed File streaming stop bug
** 7/14/93 Worked on stopping callback bug
** 7/15/93 Think I fixed the callback bug
** 7/21/93 Forced callbacks to use a long for MPW
** 7/25/93 Fixed bug with resume while file playback is in progress
** 7/26/93 Changed all callbacks to be pascal based
** 9/2/93 Fixed macro bug with FreeSong
** 9/15/93 Fixed a looping bug with BeginSongLoop
** 9/19/93 Exposed DeltaDecompressHandle for Larry, for those who want to decompress a 'csnd' resource
** 10/27/93 Fixed bug with ReleaseRegisteredSounds that caused a crash
** 11/18/93 Added ServiceFilePlayback to the API for StartFilePlayback
** 11/18/93 Added GetSoundLoopStart & GetSoundLoopEnd
** 11/18/93 Added SetMasterVolume & GetMasterVolume
** 12/4/93 Added code/data cache flush to callback
** 12/4/93 Added GetCurrentMidiClock() & SetCurrentMidiClock()
** 1/11/94 Cleaned header up a bit.
** 2/28/94 Added PlayTheSampleWithID
** 3/15/94 Found a nasty callback problem and fixed it.
** 4/5/94 Fixed memory leak with instrument loading
** 4/29/94 Removed external div and mul function references for A4 land.
** 6/23/94 Updated to CodeWarrior
** 9/2/94 Added mixedmode manager support
#ifdef __cplusplus
extern "C" {
/* Definitions for Sound resources */
#define SOUND_END -1 /* End Sound for list */
/* Defines for sound functions */
#define SOUND_RATE_DEFAULT 0L /* Default rate */
#define SOUND_RATE_FAST 0x56EE8BA3L /* Fast */
#define SOUND_RATE_MEDIUM 0x2B7745D1L /* Medium */
#define REST_SAMPLE -1L /* When using the SampleList mechanisim, this will
** rest (no sound) for the duration of the length
#define PLAY_ALL_SAMPLE -2L /* When using the SampleList mechanisim, this will
** play the entire sound if this is put into the SampleList
** theLength parameter.
#define CUSTOM_PLAY_ID ((short int)0x8000) /* ID value of samples played with PlayTheSample */
#define FILE_PLAY_1_ID ((short int)0x8001) /* ID value of samples played with StartFilePlayback (Buffer 1) */
#define FILE_PLAY_2_ID ((short int)0x8002) /* ID value of samples played with StartFilePlayback (Buffer 1) */
/* Ranges for SetMasterFade() and FadeLevel() */
#define MAX_VOLUME 0x100
#define MIN_VOLUME 0
/* Structure for a list of samples to play asynchronously
#pragma options align=mac68k
struct SampleList
short int theSampleID; /* Sample resource ID or REST_SAMPLE for no sound */
long theRate; /* Sample playback rate */
short int theLength; /* Length of note in 1/60ths of a second */
typedef struct SampleList SampleList;
#pragma options align=reset
// SoundQuality
#define jxNoDriver 0 // no driver
#define jxAnalyzeQuality 1 // best driver for speed of mac
#define jxLowQuality 2 // lowest quality (11khz) no intrepolation
#define jxHighQuality 3 // high quality (22khz) no intrepolation
#define jxIntrepLowQuality 4 // lowest quality with 2 pt intrepolation
#define jxIntrepHighQuality 5 // high quality with 2 pt intrepolation
#define jxIntrepBestLowQuality 6 // low quality with 128K memory intrepolation
#define jxIntrepBestHighQuality 7 // high quality with 128K memory intrepolation
// Support for hystrical reasons. Bad spellings
#define jxAnalyizeQuality jxAnalyzeQuality
/* NOTE:
** For future revisions, the numbers will change into bit fields for features as we add
** support for 16 bit, stereo, etc. Use the defines to pass the values you want. If you
** don't now, you may get in trouble in the future.
typedef short int SoundQuality;
OSErr InitSoundMusicSystem(short int maxSongVoices,
short int maxNormalizedVoices,
short int maxEffectVoices,
SoundQuality quality);
void FinisSoundMusicSystem(void);
OSErr ChangeSystemVoices (short int maxSongVoices,
short int maxNormalizedVoices,
short int maxEffectVoices);
OSErr PauseSoundMusicSystem(void);
OSErr ResumeSoundMusicSystem(void);
Handle DeltaDecompressHandle(Handle theData);
OSErr RegisterSounds(short int *pSoundID, Boolean prePurge);
void ReleaseRegisteredSounds(void);
long SoundMemorySize(short int *pSoundID);
void ChangeSoundPitch(short int theID, long theRate);
void BeginSoundList(SampleList * sampleList, short int totalSamples);
Boolean IsSoundListFinished(void);
void BeginSound(short int theID, long theRate);
void LoadSound(short int theID);
void FreeSound(short int theID);
void BeginSoundReverse(short int theID, long theRate);
void BeginSoundSection(short int theID, long theRate, long sectionStart, long sectionEnd);
void BeginSoundLoop(short int theID, long theRate, long loopStart, long loopEnd);
void BeginSoundEnvelope(short int theID, long theRate, short int loopTime);
void BeginSoundEnvelopeProc(short int theID, long theRate, pascal Boolean (*theLoopProc)(short int sampleID));
Boolean IsSoundFXFinished(void);
Boolean IsThisSoundFXFinished(short theID);
void PlayTheSample(Ptr pSamp, long sampSize, long sampRate);
void PlayTheSampleWithID(Ptr pSamp, long sampSize, long sampRate, short int theID);
void SetSoundDoneCallBack(pascal void (*theProcPtr)(short int theID));
void SetSongDoneCallBack(pascal void (*theProcPtr)(short int theID));
void SetMasterVolume(short int theVolume);
short int GetMasterVolume(void);
void SetSoundVBCallBack(pascal void (*theProc)(void));
Byte * GetSoundWaveform(short int theID);
long GetSoundLength(short int theID);
long GetSoundDefaultRate(short int theID);
long GetSoundLoopStart(short int theID);
long GetSoundLoopEnd(short int theID);
short int GetSoundTime(short int theID, long sampRate);
short int CalcPlaybackLength(long theRate, long theLength);
void EndAllSound(void);
void EndSound(short int theID);
void EndSoundList(void);
void PurgeAllSounds(unsigned long minMemory);
OSErr StartFilePlayback(FSSpec *theFile, long theRate, long bufferSize);
Boolean ServiceFilePlayback(void);
void ChangeFilePlaybackRate(long theNewRate);
void EndFilePlayback(void);
#define kBeginSong (short int)0 // kBeginSong, theSongID
#define kBeginSongLooped (short int)1 // kBeginSongLooped, theSongID
#define kEndSong (short int)2 // kEndSong, 0
#define kIsSongDone (short int)3 // kIsSongDone, 0
#define kTicksSinceStart (short int)4 // kTicksSinceStart, 0
#define kPurgeFlag (short int)5 // kPurgeFlag, Boolean
#define kLockFlag (short int)6 // kLockFlag, Boolean
#define kLoopSongFlag (short int)7 // kLoopSongFlag, Boolean
#define kFadeOutput (short int)8 // kFadeOutput, level (0 to 256)
#define kAutoFadeSoundOut (short int)10 // kAutoFadeSoundOut, ticks for how fast
#define kAutoFadeSoundIn (short int)11 // kAutoFadeSoundIn, ticks for how fast
#define kFadeLevel (short int)12 // kFadeLevel, short int
#define kSetMasterFade (short int)13 // kSetMasterFade, short int
#define kChangeOutputQuality (short int)14 // kChangeOutputQuality, SoundQuality
#define kLoadSong (short int)15 // kLoadSong, theSongID
#define kFreeSong (short int)16 // kFreeSong
#define kGetErrors (short int)17 // kGetErrors, char *
#define kGetMidiClock (short int)18 // kGetMidiClock
#define kGetMidiBeat (short int)19 // kGetMidiBeat
#define kGetNextMidiBeat (short int)20 // kGetNextMidiBeat
#define kSetMidiClock (short int)21 // kSetMidiClock, pos
#define kGetTempo (short int)22 // kGetTempo
#define kGetSongLength (short int)23 // kGetSongLength
#if !THINK_C
#define MUSICDRIVERHANDLER MusicDriverHandler
pascal unsigned long MusicDriverHandler(short int theMessage, long theData);
// Function call interface:
#define BeginSong(theSong) MusicDriverHandler(kBeginSong, (long)(theSong))
#define BeginSongLooped(theSong) MusicDriverHandler(kBeginSongLooped, (long)(theSong))
#define LoadSong(theSong) MusicDriverHandler(kLoadSong, (long)(theSong))
#define FreeSong() MusicDriverHandler(kFreeSong, 0L)
#define SetLoopSongFlag(theFlag) MusicDriverHandler(kLoopSongFlag, (long)(theFlag))
#define EndSong() MusicDriverHandler(kEndSong, 0L)
#define IsSongDone() MusicDriverHandler(kIsSongDone, 0L)
#define SongTicks() MusicDriverHandler(kTicksSinceStart, 0L)
#define PurgeSongs(purge) MusicDriverHandler(kPurgeFlag, (long)(purge))
#define LockSongs(lock) MusicDriverHandler(kLockFlag, (long)(lock))
#define BeginMasterFadeOut(time) MusicDriverHandler(kAutoFadeSoundOut, (long)(time))
#define BeginMasterFadeIn(time) MusicDriverHandler(kAutoFadeSoundIn, (long)(time))
#define SetMasterFade(level) MusicDriverHandler(kSetMasterFade, (long)(level))
#define FadeLevel() MusicDriverHandler(kFadeLevel, 0L)
#define ChangeOuputQuality(qual) MusicDriverHandler(kChangeOutputQuality, (long)(qual))
#define GetErrors(buffer) MusicDriverHandler(kGetErrors, (long)(buffer))
#define GetCurrentMidiClock() MusicDriverHandler(kGetMidiClock, 0L)
#define GetCurrentMidiBeat() MusicDriverHandler(kGetMidiBeat, 0L)
#define GetNextBeatMidiClock() MusicDriverHandler(kGetNextMidiBeat, 0L);
#define SetCurrentMidiClock(clock) MusicDriverHandler(kSetMidiClock, (long)(clock))
#define GetCurrentTempo() MusicDriverHandler(kGetTempo, 0L)
#define GetSongLength() MusicDriverHandler(kGetSongLength, 0L)
OSErr BeginSongFromMemory(short int theID, Handle theSongResource, Handle theMidiResource, Boolean loopSong);
long MaxVoiceLoad(void);
#ifdef __cplusplus