home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-08-03 | 7.1 KB | 326 lines | [TEXT/CWIE] |
- /*
- File: BSDSoundLib.c
-
- Contains: Sound Routines.
-
- Version: Technology: Torture Chamber v1.0
- Package: BSDSoundLib v1.0.3
-
- Copyright: © 1997, BuggySoft™ Development.
- By Scott Dunbar
- */
-
- #ifndef __BSDSOUNDLIB_
- #include "BSDSoundLib.h"
- #endif
-
- #define volume(lvol, rvol) (rvol << 16L | lvol)
-
- short numChannels = 0, curSndLoc;
- Boolean sndChanActive[kMaxSndChans], loopingActive;
- SndChannelPtr sndChan[kMaxSndChans], loopingSndChan;
- SndCallBackUPP soundCallBackUPP, loopingCallBackUPP;
-
- static SoundHeaderPtr GetSoundHeader (Handle sndHandle);
- static pascal void SoundCallBack (SndChannelPtr chan, SndCommand cmd);
- SndChannelPtr InitChannel (long chanMode, SndCallBackUPP callBackProc);
- void DisposeChannel (SndChannelPtr chan);
- void DisposeLoopingChannel (void);
- static pascal void loopingCallBack (SndChannelPtr chan, SndCommand cmd);
-
- void SetChanVol (short chanNum, short balance) {
- SndCommand sc;
- long rightvol; // FVM 27/4/97
- long leftvol;
- long resultvol;
-
- if (sndChan[chanNum] != nil) {
- if (balance < -128) balance = -128;
- if (balance > 128) balance = 128;
-
- rightvol = 128 + balance;
- leftvol = 128 - balance;
- resultvol = (rightvol << 16) | leftvol;
-
- sc.cmd = volumeCmd;
- sc.param1 = 0;
- sc.param2 = resultvol; // FVM 27/4/97
- SndDoImmediate(sndChan[chanNum], &sc);
- }
- }
-
- void SetChanVolLR (short chanNum, short left, short right) {
- SndChannelPtr chan;
- SndCommand sc;
- long vol;
-
- if (chanNum == kLoopingChan) chan = loopingSndChan;
- else chan = sndChan[chanNum];
-
- if (chan != nil) {
- if (left < -128) left = -128;
- if (left > 128) left = 128;
- if (right < -128) right = -128;
- if (right > 128) right = 128;
- vol = (right << 16L | left);
- sc.cmd = volumeCmd;
- sc.param1 = 0;
- sc.param2 = vol;
- SndDoImmediate(chan, &sc);
- }
- }
-
- void BalanceSndChannels (void) {
- short x;
-
- for (x = 0; x < numChannels; x++)
- if (sndChanActive[x] == false) SetChanVol(x, kBalanced);
- }
-
- short FindFreeChannel (void) {
- short x;
-
- for (x = 0; x < numChannels; x++)
- if (sndChanActive[x] == false) return(x);
- return(kNoFreeChannels);
- }
-
- SndChannelPtr InitSoundChanPtr (long init) {
- SndChannelPtr tempChan = nil;
-
- tempChan = InitChannel(init, nil);
- return(tempChan);
- }
-
- short InitSoundChan (long init) {
- short chanNum = ++numChannels;
-
- sndChan[chanNum] = InitChannel(init, soundCallBackUPP);
- if (sndChan[chanNum] != nil) {
- sndChanActive[chanNum] = false;
- numChannels++;
- return(chanNum);
- }
-
- return(mFulErr);
- }
-
- void DisposeSoundChan (short chanNum) {
- if (sndChan[chanNum] != nil) {
- DisposeChannel(sndChan[chanNum]);
- sndChanActive[chanNum] = false;
- numChannels--;
- }
- }
-
- void InitSoundUtils (short num) {
- short x, y = 0, maxChannels;
-
- numChannels = 0;
- maxChannels = num;
-
- soundCallBackUPP = NewSndCallBackProc(SoundCallBack);
-
- if (maxChannels != kNone) {
- for (x = 0; x <= maxChannels; x++) {
- sndChan[y] = InitChannel(initStereo, soundCallBackUPP);
- if (sndChan[y] != nil) {
- sndChanActive[y] = false;
- numChannels++;
- y++;
- } else y--;
- }
- }
- }
-
- void DisposeSoundUtils (void) {
- short x;
-
- for (x = 0; x < numChannels; x++) DisposeChannel(sndChan[x]);
- DisposeRoutineDescriptor(soundCallBackUPP);
- }
-
- static SoundHeaderPtr GetSoundHeader (Handle sndHandle) {
- long offset;
-
- if (GetSoundHeaderOffset((SndListHandle)sndHandle, &offset) != noErr) return nil;
- else return ((SoundHeaderPtr)((Ptr)(*sndHandle) + offset));
- }
-
- static pascal void SoundCallBack (SndChannelPtr chan, SndCommand cmd) {
- sndChanActive[chan->userInfo] = false;
- }
-
- SndChannelPtr InitChannel (long chanMode, SndCallBackUPP callBackProc) {
- SndChannelPtr chan = nil;
- long init = chanMode;
-
- if (init != (initChanLeft|initChanRight|initNoInterp|initNoDrop|initMono|initStereo))
- init = initMono + initNoInterp;
- if ((SndNewChannel(&chan, sampledSynth, init, callBackProc) != noErr) || (MemError() != noErr) || (chan == nil))
- DisposePtr((Ptr)chan);
- return(chan);
- }
-
- void DisposeChannel (SndChannelPtr chan) {
- SndCommand sc;
-
- if (chan != nil) {
- sc.cmd = flushCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoImmediate(chan, &sc);
-
- sc.cmd = quietCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoImmediate(chan, &sc);
-
- SndDisposeChannel(chan, false);
- DisposePtr((Ptr)chan);
- }
- }
-
- void SilenceChannel (short chanNum) {
- SndCommand sc;
-
- if (sndChan[chanNum] != nil) {
- sc.cmd = flushCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoImmediate(sndChan[chanNum], &sc);
- sc.cmd = quietCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoImmediate(sndChan[chanNum], &sc);
-
- sndChanActive[chanNum] = false;
- }
- }
-
- void SilenceChanPtr (SndChannelPtr chan) {
- SndCommand sc;
-
- if (chan != nil) {
- sc.cmd = flushCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoImmediate(chan, &sc);
-
- sc.cmd = quietCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoImmediate(chan, &sc);
- }
- }
-
- void PlaySoundChanPtr (SndChannelPtr chan, Handle snd) {
- SndCommand sc;
-
- if ((chan != nil) && (snd != nil)) {
- sc.cmd = bufferCmd;
- sc.param1 = 0;
- sc.param2 = (long)GetSoundHeader(snd);
- SndDoImmediate(chan, &sc);
- }
- }
-
- void PlaySndVol (Handle snd, short balance) {
- short chanNum;
- chanNum = FindFreeChannel();
- SetChanVol(chanNum, balance); // I put this BEFORE the PlaySoundChan() now instead..
- PlaySoundChan(chanNum, snd); // pretty stupid to change the volume after the sound has
- } // already started :) 8/3/97
-
- void PlaySnd (Handle snd) {
- PlaySoundChan(FindFreeChannel(), snd);
- }
-
- void PlaySoundChan (short chanNum, Handle snd) {
- SndCommand sc;
-
- if ((sndChan[chanNum] != nil) && (snd != nil)) {
- sc.cmd = bufferCmd;
- sc.param1 = 0;
- sc.param2 = (long)GetSoundHeader(snd);
- SndDoImmediate(sndChan[chanNum], &sc);
-
- sndChanActive[chanNum] = true;
- sndChan[chanNum]->userInfo = chanNum;
-
- sc.cmd = callBackCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoCommand(sndChan[chanNum], &sc, true);
- }
- }
-
- Boolean SndChanPtrBusy (SndChannelPtr chan) {
- SCStatus scs;
-
- SndChannelStatus(chan, sizeof(SCStatus), &scs);
- return(scs.scChannelBusy);
- }
-
- void InitLoopingSounds (void) {
- loopingCallBackUPP = NewSndCallBackProc(loopingCallBack);
- loopingSndChan = InitChannel(initStereo, loopingCallBackUPP);
- }
-
- void DisposeLoopingSounds (void) {
- DisposeLoopingChannel();
- DisposeRoutineDescriptor(loopingCallBackUPP);
- }
-
- void PlayLoopingSound (Handle snd) {
- SndCommand sc;
-
- if ((loopingSndChan != nil) && (snd != nil)) {
- loopingSndChan->userInfo = (long)GetSoundHeader(snd);
-
- sc.cmd = callBackCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoCommand(loopingSndChan, &sc, false);
- }
- }
-
- void SilenceLoopingChannel (void) {
- SndCommand sc;
-
- if (loopingSndChan != nil) {
- sc.cmd = flushCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoImmediate(loopingSndChan, &sc);
-
- sc.cmd = quietCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoImmediate(loopingSndChan, &sc);
-
- loopingActive = false;
- }
- }
-
- void DisposeLoopingChannel (void) {
- if (loopingSndChan != nil) {
- SilenceLoopingChannel();
-
- SndDisposeChannel(loopingSndChan, false);
- DisposePtr((Ptr)loopingSndChan);
- }
- }
-
- static pascal void loopingCallBack (SndChannelPtr chan, SndCommand cmd) {
- SndCommand sc;
- sc.cmd = bufferCmd;
- sc.param1 = 0;
- sc.param2 = chan->userInfo;
- SndDoImmediate(chan, &sc);
-
- sc.cmd = callBackCmd;
- sc.param1 = 0;
- sc.param2 = 0;
- SndDoCommand(chan, &sc, true);
- }