void digi_kill_sound_linked_to_object( int objnum ) { int i,killed; if (!digi_initialized) return; killed = 0; for (i=0; i<MAX_SOUND_OBJECTS; i++ ) { if ( (SoundObjects[i].flags & SOF_USED) && (SoundObjects[i].flags & SOF_LINK_TO_OBJ ) ) { if (SoundObjects[i].link_type.obj.objnum == objnum) { if ( SoundObjects[i].flags & SOF_PLAYING ) { EndSound(SoundObjects[i].soundnum); } SoundObjects[i].flags = 0; // Mark as dead, so some other sound can use this sound killed++; } } } // If this assert happens, it means that there were 2 sounds // that got deleted. Weird, get John. if ( killed > 1 ) { mprintf( (1, "ERROR: More than 1 sounds were deleted from object %d\n", objnum )); } }
void digi_kill_sound_linked_to_segment( int segnum, int sidenum, int soundnum ) { int i,killed; soundnum = digi_xlat_sound(soundnum); if (!digi_initialized) return; killed = 0; for (i=0; i<MAX_SOUND_OBJECTS; i++ ) { if ( (SoundObjects[i].flags & SOF_USED) && (SoundObjects[i].flags & SOF_LINK_TO_POS) ) { if ((SoundObjects[i].link_type.pos.segnum == segnum) && (SoundObjects[i].soundnum==(short)soundnum ) && (SoundObjects[i].link_type.pos.sidenum==sidenum) ) { if ( SoundObjects[i].flags & SOF_PLAYING ) { EndSound(SoundObjects[i].soundnum); } SoundObjects[i].flags = 0; // Mark as dead, so some other sound can use this sound killed++; } } } // If this assert happens, it means that there were 2 sounds // that got deleted. Weird, get John. if ( killed > 1 ) { mprintf( (1, "ERROR: More than 1 sounds were deleted from seg %d\n", segnum )); } }
void FreeStage(Map *map, int *stageState, int bgm) { EndSound(); DrawMain = NULL; *stageState = 0; FreeMap(map); FreeSound(bgm); }
void digi_pause_all() { int i; if (!digi_initialized) return; if (!digi_paused) { for (i=0; i<MAX_SOUND_OBJECTS; i++ ) { if ( (SoundObjects[i].flags & SOF_USED ) && (SoundObjects[i].flags & SOF_PLAYING) && (SoundObjects[i].flags && SOF_PLAY_FOREVER) ) { EndSound(SoundObjects[i].soundnum); SoundObjects[i].flags &= ~SOF_PLAYING; // Mark sound as not playing } } #ifdef MAC_SHAREWARE PauseMusicOnly(); #else redbook_pause(1); #endif digi_paused = 1; } }
void digi_sync_sounds() { int i; int oldvolume, oldpan; SndCommand snd_cmd; if (!digi_initialized) return; for (i=0; i<MAX_SOUND_OBJECTS; i++ ) { if ( SoundObjects[i].flags & SOF_USED ) { oldvolume = SoundObjects[i].volume; oldpan = SoundObjects[i].pan; if ( !(SoundObjects[i].flags & SOF_PLAY_FOREVER) ) { // Check if its done. if (SoundObjects[i].flags & SOF_PLAYING) { if ( IsThisSoundFXFinished(SoundObjects[i].soundnum) ) { SoundObjects[i].flags = 0; // Mark as dead, so some other sound can use this sound continue; // Go on to next sound... } } } if ( SoundObjects[i].flags & SOF_LINK_TO_POS ) { digi_get_sound_loc( &Viewer->orient, &Viewer->pos, Viewer->segnum, &SoundObjects[i].link_type.pos.position, SoundObjects[i].link_type.pos.segnum, SoundObjects[i].max_volume, &SoundObjects[i].volume, &SoundObjects[i].pan, SoundObjects[i].max_distance ); } else if ( SoundObjects[i].flags & SOF_LINK_TO_OBJ ) { object * objp; objp = &Objects[SoundObjects[i].link_type.obj.objnum]; if ((objp->type==OBJ_NONE) || (objp->signature!=SoundObjects[i].link_type.obj.objsignature)) { // The object that this is linked to is dead, so just end this sound if it is looping. if ( (SoundObjects[i].flags & SOF_PLAYING) && (SoundObjects[i].flags & SOF_PLAY_FOREVER)) { EndSound(SoundObjects[i].soundnum); } SoundObjects[i].flags = 0; // Mark as dead, so some other sound can use this sound continue; // Go on to next sound... } else { digi_get_sound_loc( &Viewer->orient, &Viewer->pos, Viewer->segnum, &objp->pos, objp->segnum, SoundObjects[i].max_volume, &SoundObjects[i].volume, &SoundObjects[i].pan, SoundObjects[i].max_distance ); } } if (oldvolume != SoundObjects[i].volume) { if ( SoundObjects[i].volume < 1 ) { // Sound is too far away, so stop it from playing. if ((SoundObjects[i].flags & SOF_PLAYING)&&(SoundObjects[i].flags & SOF_PLAY_FOREVER)) { EndSound(SoundObjects[i].soundnum); SoundObjects[i].flags &= ~SOF_PLAYING; // Mark sound as not playing } } else { if (!(SoundObjects[i].flags & SOF_PLAYING)) { digi_start_sound_object(i); } else { int vol; vol = fixmuldiv(SoundObjects[i].volume, digi_volume,F1_0); ChangeSoundVolume(SoundObjects[i].soundnum, fixmuldiv(SoundObjects[i].volume,digi_volume,F1_0) ); } } } if (oldpan != SoundObjects[i].pan) { if (SoundObjects[i].flags & SOF_PLAYING) { ChangeSoundStereoPosition( SoundObjects[i].soundnum, SoundObjects[i].pan ); } } } } }