[Scummvm-cvs-logs] SF.net SVN: scummvm: [25928] scummvm/trunk/engines/scumm/imuse_digi

eriktorbjorn at users.sourceforge.net eriktorbjorn at users.sourceforge.net
Fri Mar 2 18:30:30 CET 2007


Revision: 25928
          http://scummvm.svn.sourceforge.net/scummvm/?rev=25928&view=rev
Author:   eriktorbjorn
Date:     2007-03-02 09:30:29 -0800 (Fri, 02 Mar 2007)

Log Message:
-----------
Applied my own patch #1672572, after discussing it with Fingolfin. We no longer
store mixer flags in our savegames. Instead, we store different flags which
just happen to have the exact same values as the mixer flags have right now.
This should keep savegames working even if the mixer flags ever change.

Modified Paths:
--------------
    scummvm/trunk/engines/scumm/imuse_digi/dimuse.cpp
    scummvm/trunk/engines/scumm/imuse_digi/dimuse.h
    scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse.cpp	2007-03-02 15:34:22 UTC (rev 25927)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse.cpp	2007-03-02 17:30:29 UTC (rev 25928)
@@ -76,6 +76,21 @@
 	free(_audioNames);
 }
 
+int32 IMuseDigital::makeMixerFlags(int32 flags) {
+	int32 mixerFlags = 0;
+	if (flags & kFlagUnsigned)
+		mixerFlags |= Audio::Mixer::FLAG_UNSIGNED;
+	if (flags & kFlag16Bits)
+		mixerFlags |= Audio::Mixer::FLAG_16BITS;
+	if (flags & kFlagLittleEndian)
+		mixerFlags |= Audio::Mixer::FLAG_LITTLE_ENDIAN;
+	if (flags & kFlagStereo)
+		mixerFlags |= Audio::Mixer::FLAG_STEREO;
+	if (flags & kFlagReverseStereo)
+		mixerFlags |= Audio::Mixer::FLAG_REVERSE_STEREO;
+	return mixerFlags;
+}
+
 void IMuseDigital::resetState() {
 	_curMusicState = 0;
 	_curMusicSeq = 0;
@@ -122,7 +137,7 @@
 		MKLINE(Track, soundType, sleInt32, VER(31)),
 		MKLINE(Track, iteration, sleInt32, VER(31)),
 		MKLINE(Track, mod, sleInt32, VER(31)),
-		MKLINE(Track, mixerFlags, sleInt32, VER(31)),
+		MKLINE(Track, flags, sleInt32, VER(31)),
 		MK_OBSOLETE(Track, mixerVol, sleInt32, VER(31), VER(42)),
 		MK_OBSOLETE(Track, mixerPan, sleInt32, VER(31), VER(42)),
 		MKLINE(Track, compressed, sleByte, VER(45)),
@@ -171,25 +186,25 @@
 			int channels = _sound->getChannels(track->soundHandle);
 			int freq = _sound->getFreq(track->soundHandle);
 			track->iteration = freq * channels;
-			track->mixerFlags = 0;
+			track->flags = 0;
 			if (channels == 2)
-				track->mixerFlags = Audio::Mixer::FLAG_STEREO | Audio::Mixer::FLAG_REVERSE_STEREO;
+				track->flags = kFlagStereo | kFlagReverseStereo;
 
 			if ((bits == 12) || (bits == 16)) {
-				track->mixerFlags |= Audio::Mixer::FLAG_16BITS;
+				track->flags |= kFlag16Bits;
 				track->iteration *= 2;
 			} else if (bits == 8) {
-				track->mixerFlags |= Audio::Mixer::FLAG_UNSIGNED;
+				track->flags |= kFlagUnsigned;
 			} else
 				error("IMuseDigital::saveOrLoad(): Can't handle %d bit samples", bits);
 
 #ifdef SCUMM_LITTLE_ENDIAN
 			if (track->compressed)
-				track->mixerFlags |= Audio::Mixer::FLAG_LITTLE_ENDIAN;
+				track->flags |= kFlagLittleEndian;
 #endif
 
 			track->stream2 = NULL;
-			track->stream = Audio::makeAppendableAudioStream(freq, track->mixerFlags);
+			track->stream = Audio::makeAppendableAudioStream(freq, makeMixerFlags(track->flags));
 
 			const int pan = (track->pan != 64) ? 2 * track->pan - 127 : 0;
 			const int vol = track->vol / 1000;

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse.h
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse.h	2007-03-02 15:34:22 UTC (rev 25927)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse.h	2007-03-02 17:30:29 UTC (rev 25928)
@@ -44,6 +44,23 @@
 class Serializer;
 class ScummEngine_v7;
 
+// These flag bits correspond exactly to the sound mixer flags of March 2007.
+// We don't want to use the mixer flags directly, because then our saved games
+// will break in interesting ways if the mixer flags are ever assigned new
+// values. Now they should keep working, as long as these flags don't change.
+
+enum {
+	kFlagUnsigned = 1 << 0,
+	kFlag16Bits = 1 << 1,
+	kFlagLittleEndian = 1 << 2,
+	kFlagStereo = 1 << 3,
+	kFlagReverseStereo = 1 << 4
+
+	// Not used by Digital iMUSE
+	// kFlagAutoFree = 1 << 5,
+	// kFlagLoop = 1 << 6
+};
+
 class IMuseDigital : public MusicEngine {
 private:
 
@@ -76,7 +93,7 @@
 		int32 soundType;
 		int32 iteration;
 		int32 mod;
-		int32 mixerFlags;
+		int32 flags;
 
 		ImuseDigiSndMgr::soundStruct *soundHandle;
 		Audio::SoundHandle handle;
@@ -104,6 +121,7 @@
 	int32 _curMusicSeq;
 	int32 _curMusicCue;
 
+	int32 makeMixerFlags(int32 flags);
 	static void timer_handler(void *refConf);
 	void callback();
 	void switchToNextRegion(Track *track);

Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp	2007-03-02 15:34:22 UTC (rev 25927)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_track.cpp	2007-03-02 17:30:29 UTC (rev 25928)
@@ -103,7 +103,7 @@
 	track->dataOffset = 0;
 	track->regionOffset = 0;
 	track->mod = 0;
-	track->mixerFlags = 0;
+	track->flags = 0;
 	track->toBeRemoved = false;
 	track->readyToRemove = false;
 	track->soundType = soundType;
@@ -143,19 +143,19 @@
 
 		track->iteration = freq * channels;
 		if (channels == 2)
-			track->mixerFlags = Audio::Mixer::FLAG_STEREO | Audio::Mixer::FLAG_REVERSE_STEREO;
+			track->flags = kFlagStereo | kFlagReverseStereo;
 
 		if ((bits == 12) || (bits == 16)) {
-			track->mixerFlags |= Audio::Mixer::FLAG_16BITS;
+			track->flags |= kFlag16Bits;
 			track->iteration *= 2;
 		} else if (bits == 8) {
-			track->mixerFlags |= Audio::Mixer::FLAG_UNSIGNED;
+			track->flags |= kFlagUnsigned;
 		} else
 			error("IMuseDigital::startSound(): Can't handle %d bit samples", bits);
 
 #ifdef SCUMM_LITTLE_ENDIAN
 		if (track->compressed)
-			track->mixerFlags |= Audio::Mixer::FLAG_LITTLE_ENDIAN;
+			track->flags |= kFlagLittleEndian;
 #endif
 	}
 
@@ -177,7 +177,7 @@
 
 		// setup 1 second stream wrapped buffer
 		track->stream2 = NULL;
-		track->stream = Audio::makeAppendableAudioStream(freq, track->mixerFlags);
+		track->stream = Audio::makeAppendableAudioStream(freq, makeMixerFlags(track->flags));
 		_mixer->playInputStream(type, &track->handle, track->stream, -1, vol, pan, false);
 		track->started = true;
 	}
@@ -328,7 +328,7 @@
 	fadeTrack->curRegion = track->curRegion;
 	fadeTrack->curHookId = track->curHookId;
 	fadeTrack->iteration = track->iteration;
-	fadeTrack->mixerFlags = track->mixerFlags;
+	fadeTrack->flags = track->flags;
 	fadeTrack->mod = track->mod;
 	fadeTrack->toBeRemoved = track->toBeRemoved;
 	fadeTrack->readyToRemove = track->readyToRemove;
@@ -355,7 +355,7 @@
 		type = Audio::Mixer::kMusicSoundType;
 
 	// setup 1 second stream wrapped buffer
-	fadeTrack->stream = Audio::makeAppendableAudioStream(_sound->getFreq(fadeTrack->soundHandle), fadeTrack->mixerFlags);
+	fadeTrack->stream = Audio::makeAppendableAudioStream(_sound->getFreq(fadeTrack->soundHandle), makeMixerFlags(fadeTrack->flags));
 	_mixer->playInputStream(type, &fadeTrack->handle, fadeTrack->stream, -1, fadeTrack->vol / 1000, fadeTrack->pan, false);
 	fadeTrack->started = true;
 	fadeTrack->used = true;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list