[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