/************************************************************ * * * sound.c * * * * * LPGE 1997 * * * * Copyright (C) 1996 Sony Computer Entertainment Inc. * * All Rights Reserved * * * ***********************************************************/ /**************************************************************************** includes ****************************************************************************/ #include "sound.h" /**************************************************************************** globals ****************************************************************************/ static short vab0; static VoiceChannelHandler TheVoices[MAX_VOICES]; static int jasonTuneVoiceID; /**************************************************************************** functions ****************************************************************************/ void InitialiseSound (void) { SsSetMVol(127, 127); // always do this JasonTuneOnFlag = FALSE; #if SOUND_ON { int i; #if (DEVELOPMENT_ENVIRONMENT==DEV_KIT) { SsInit(); SsSetTickMode(SS_TICK240); } #endif // transfer VAB data vab0 = SsVabTransfer((u_char *)VH0_ADDRESS, (u_char *)VB0_ADDRESS, -1, 1); if (vab0 < 0) { printf("VAB open failed\n"); HERE; ResetGraph(3); exit(1); } SsSetMVol(127, 127); #if (DEVELOPMENT_ENVIRONMENT==DEV_KIT) { SsStart(); } #endif // background tune as VAB looped sample rather than using an SEQ; // just turn it on and never touch again for (i = 0; i < MAX_VOICES; i++) { TheVoices[i].value = 0; TheVoices[i].statusFlag = OFF; TheVoices[i].frameToStartOn = -1; TheVoices[i].duration = -1; TheVoices[i].program = -1; TheVoices[i].tone = -1; TheVoices[i].note = 60; // default 60 (seems very common ... ) TheVoices[i].leftVolume = 127; // default: max volume levels TheVoices[i].rightVolume = 127; } } #endif } // two functions to toggle the main background tune void PlayJasonsTune (void) { #if SOUND_ON if (JasonTuneOnFlag == FALSE) { jasonTuneVoiceID = SsUtKeyOn(vab0, 0, 0, 60, 0, 127, 127); JasonTuneOnFlag = TRUE; } #endif } void TurnOffJasonsTune (void) { #if SOUND_ON if (JasonTuneOnFlag == TRUE) { SsUtKeyOff(jasonTuneVoiceID, vab0, 0, 0, 60); JasonTuneOnFlag = FALSE; } #endif } void MakeClunk (void) { int unusedVar; unusedVar = SsUtKeyOn(vab0, 1, 0, 60, 0, 127, 127); } void HandleSound (void) { #if SOUND_ON int i; VoiceChannelHandler* data; for (i = 0; i < MAX_VOICES; i++) { data = &TheVoices[i]; switch(data->statusFlag) { case OFF: break; case WAITING_TO_START: if (frameNumber == data->frameToStartOn) { // turn on data->value = SsUtKeyOn(vab0, data->program, data->tone, data->note, 0, data->leftVolume, data->rightVolume); data->statusFlag = PLAYING; } break; case PLAYING: if (frameNumber == data->frameToStartOn + data->duration) { // turn off SsUtKeyOff(data->value, vab0, data->program, data->tone, data->note); data->statusFlag = OFF; } break; default: assert(FALSE); } } #endif } void TurnOnSound (int whichProgram, int whichTone, int whichNote, int delayFromNow, int howLong, int leftVolume, int rightVolume) { #if SOUND_ON int soundIndex = -1; // index into array TheVoices int i; VoiceChannelHandler* data; assert(whichProgram >= 0); assert(whichTone >= 0); for (i = 0; i < MAX_VOICES; i++) { if (TheVoices[i].statusFlag == OFF) // a free one { soundIndex = i; break; } } if (soundIndex == -1) { printf("no free sound voices\n"); return; } data = &TheVoices[soundIndex]; data->statusFlag = WAITING_TO_START; data->program = whichProgram; data->tone = whichTone; data->note = whichNote; data->frameToStartOn = frameNumber + delayFromNow; data->duration = howLong; data->leftVolume = leftVolume; data->rightVolume = rightVolume; #endif } void CleanUpSound (void) { #if SOUND_ON { int i; // turn off background tune SsUtKeyOff(jasonTuneVoiceID, vab0, 0, 0, 60); // libsnd seems to need this pause to quit properly for (i = 0; i < 30; i++) { VSync(0); } // close entire VAB file SsVabClose(vab0); #if (DEVELOPMENT_ENVIRONMENT==DEV_KIT) { SsEnd(); SsQuit(); } #endif } #endif }