diff options
Diffstat (limited to 'sword2/driver')
| -rw-r--r-- | sword2/driver/d_sound.cpp | 56 | ||||
| -rw-r--r-- | sword2/driver/d_sound.h | 4 | 
2 files changed, 59 insertions, 1 deletions
diff --git a/sword2/driver/d_sound.cpp b/sword2/driver/d_sound.cpp index 6dabc572ac..e4020b370b 100644 --- a/sword2/driver/d_sound.cpp +++ b/sword2/driver/d_sound.cpp @@ -308,6 +308,62 @@ int32 Sword2Sound::ReverseStereo(void) {  	return RD_OK;  } +// Save/Restore information about current music so that we can restore it +// after the credits. + +void Sword2Sound::saveMusicState() { +	StackLock lock(_mutex); + +	int saveStream; + +	if (music[0]._streaming && !music[0]._fading) { +		saveStream = 0; +	} else if (music[1]._streaming && !music[0]._fading) { +		saveStream = 1; +	} else { +		music[2]._streaming = false; +		return; +	} + +	music[2]._streaming = true; +	music[2]._fading = 0; +	music[2]._looping = music[saveStream]._looping; +	music[2]._fileStart = music[saveStream]._fileStart; +	music[2]._filePos = music[saveStream]._filePos; +	music[2]._fileEnd = music[saveStream]._fileEnd; +	music[2]._lastSample = music[saveStream]._lastSample; +} + +void Sword2Sound::restoreMusicState() { +	StackLock lock(_mutex); + +	int restoreStream; + +	if (!music[2]._streaming) +		return; + +	// Fade out any music that happens to be playing + +	for (int i = 0; i < MAXMUS; i++) { +		if (music[i]._streaming && !music[i]._fading) +			music[i]._fading = FADE_SAMPLES; +	} + +	if (!music[0]._streaming && !music[0]._fading) { +		restoreStream = 0; +	} else { +		restoreStream = 1; +	} + +	music[restoreStream]._streaming = true; +	music[restoreStream]._fading = 0; +	music[restoreStream]._looping = music[2]._looping; +	music[restoreStream]._fileStart = music[2]._fileStart; +	music[restoreStream]._filePos = music[2]._filePos; +	music[restoreStream]._fileEnd = music[2]._fileEnd; +	music[restoreStream]._lastSample = music[2]._lastSample; +} +  // --------------------------------------------------------------------------  // This function returns the index of the sound effect with the ID passed in.  // -------------------------------------------------------------------------- diff --git a/sword2/driver/d_sound.h b/sword2/driver/d_sound.h index 2d59a1d625..520a320446 100644 --- a/sword2/driver/d_sound.h +++ b/sword2/driver/d_sound.h @@ -100,6 +100,8 @@ class Sword2Sound {  		int32 PauseMusic(void);  		int32 UnpauseMusic(void);  		int32 StreamCompMusic(const char *filename, uint32 musicId, bool looping); +		void saveMusicState(); +		void restoreMusicState();  		int32 MusicTimeRemaining();  		int32 ReverseStereo(void);  		uint8 GetFxVolume(void); @@ -129,7 +131,7 @@ class Sword2Sound {  		RateConverter *_converter;  		FxHandle fx[MAXFX]; -		MusicHandle music[MAXMUS]; +		MusicHandle music[MAXMUS + 1];  		// We used to have two music volumes - one for each channel -  		// but they were always set to the same value.  | 
