[Scummvm-cvs-logs] CVS: scummvm/sound midiparser.h,1.11,1.12 midiparser.cpp,1.8,1.9

Jamieson Christian jamieson630 at users.sourceforge.net
Fri May 23 08:05:09 CEST 2003


Update of /cvsroot/scummvm/scummvm/sound
In directory sc8-pr-cvs1:/tmp/cvs-serv2559/scummvm/sound

Modified Files:
	midiparser.h midiparser.cpp 
Log Message:
Fixed problem with hanging notes on some synth modules.
Various little MidiParser fixes.

Index: midiparser.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/midiparser.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- midiparser.h	23 May 2003 04:18:26 -0000	1.11
+++ midiparser.h	23 May 2003 15:04:41 -0000	1.12
@@ -157,7 +157,7 @@
 
 public:
 	MidiParser();
-	virtual ~MidiParser() { }
+	virtual ~MidiParser() { allNotesOff(); }
 
 	virtual bool loadMusic (byte *data, uint32 size) = 0;
 	virtual void unloadMusic() = 0;

Index: midiparser.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/midiparser.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- midiparser.cpp	23 May 2003 04:35:50 -0000	1.8
+++ midiparser.cpp	23 May 2003 15:04:41 -0000	1.9
@@ -117,14 +117,23 @@
 			if (ptr->time_left && ptr->time_left < time_left)
 				return;
 			best = ptr;
-			if (ptr->time_left)
+			if (ptr->time_left) {
+				_driver->send (0x80 | channel | note << 8);
 				--_hanging_notes_count;
+			}
 			break;
 		} else if (!best && ptr->time_left == 0) {
 			best = ptr;
 		}
 	}
 
+	// Occassionally we might get a zero or negative note
+	// length, if the note should be turned on and off in
+	// the same iteration. For now just set it to 1 and
+	// we'll turn it off in the next cycle.
+	if (!time_left || time_left & 0x80000000)
+		time_left = 1;
+
 	if (best) {
 		best->channel = channel;
 		best->note = note;
@@ -187,12 +196,12 @@
 			if (info.ext.type == 0x2F) {
 				// End of Track must be processed by us,
 				// as well as sending it to the output device.
-				allNotesOff();
 				if (_autoLoop) {
-					_position._play_pos = _tracks[_active_track];
+					jumpToTick (0);
 					parseNextEvent (_next_event);
 				} else {
-					_position._play_pos = 0;
+					allNotesOff();
+					resetTracking();
 					_driver->metaEvent (info.ext.type, info.ext.data, (uint16) info.length);
 				}
 				return;





More information about the Scummvm-git-logs mailing list