diff options
| author | Willem Jan Palenstijn | 2010-01-02 20:20:36 +0000 | 
|---|---|---|
| committer | Willem Jan Palenstijn | 2010-01-02 20:20:36 +0000 | 
| commit | 13a242838fc9ad8c25fd6e250b0931d8564460a4 (patch) | |
| tree | cf5027f07259f85e53d67ebecbba5ceb17a6de96 | |
| parent | 0b3d3c37a590b116e280f0ffefc26cd3d27b16fd (diff) | |
| download | scummvm-rg350-13a242838fc9ad8c25fd6e250b0931d8564460a4.tar.gz scummvm-rg350-13a242838fc9ad8c25fd6e250b0931d8564460a4.tar.bz2 scummvm-rg350-13a242838fc9ad8c25fd6e250b0931d8564460a4.zip  | |
SCI/new music code: Don't stop notes when looping for a hold
svn-id: r46897
| -rw-r--r-- | engines/sci/sfx/midiparser.cpp | 11 | ||||
| -rw-r--r-- | sound/midiparser.cpp | 24 | ||||
| -rw-r--r-- | sound/midiparser.h | 2 | 
3 files changed, 16 insertions, 21 deletions
diff --git a/engines/sci/sfx/midiparser.cpp b/engines/sci/sfx/midiparser.cpp index 87cbfb48d6..5ddccf5a01 100644 --- a/engines/sci/sfx/midiparser.cpp +++ b/engines/sci/sfx/midiparser.cpp @@ -146,16 +146,9 @@ void MidiParser_SCI::parseNextEvent(EventInfo &info) {  			case kMidiHold:  				// Check if the hold ID marker is the same as the hold ID  				// marker set for that song by cmdSetSoundHold. -				// If it is, loop back - -				// FIXME: this is currently broken, as seen in the -				// scene in LSL5 where Larry first arrives at the airport -				// in the limo. The engine sound is stopped instead of -				// continuing. As a possible direction to look at for a fix, -				// removing the allNotesOff() call in jumpToTick() lets the -				// engine sound continue. +				// If it is, loop back, but don't stop notes when jumping.  				if (info.basic.param2 == _pSnd->hold) -					jumpToTick(_loopTick); +					jumpToTick(_loopTick, false, false);  				break;  			case kUpdateCue:  				switch (_soundVersion) { diff --git a/sound/midiparser.cpp b/sound/midiparser.cpp index 5aa458a792..99319461e9 100644 --- a/sound/midiparser.cpp +++ b/sound/midiparser.cpp @@ -353,7 +353,7 @@ void MidiParser::hangAllActiveNotes() {  	}  } -bool MidiParser::jumpToTick(uint32 tick, bool fireEvents) { +bool MidiParser::jumpToTick(uint32 tick, bool fireEvents, bool stopNotes) {  	if (_active_track >= _num_tracks)  		return false; @@ -402,18 +402,20 @@ bool MidiParser::jumpToTick(uint32 tick, bool fireEvents) {  		}  	} -	if (!_smartJump || !currentPos._play_pos) { -		allNotesOff(); -	} else { -		EventInfo targetEvent(_next_event); -		Tracker targetPosition(_position); +	if (stopNotes) { +		if (!_smartJump || !currentPos._play_pos) { +			allNotesOff(); +		} else { +			EventInfo targetEvent(_next_event); +			Tracker targetPosition(_position); -		_position = currentPos; -		_next_event = currentEvent; -		hangAllActiveNotes(); +			_position = currentPos; +			_next_event = currentEvent; +			hangAllActiveNotes(); -		_next_event = targetEvent; -		_position = targetPosition; +			_next_event = targetEvent; +			_position = targetPosition; +		}  	}  	_abort_parse = true; diff --git a/sound/midiparser.h b/sound/midiparser.h index 2e0824c943..0ba12ce2b1 100644 --- a/sound/midiparser.h +++ b/sound/midiparser.h @@ -379,7 +379,7 @@ public:  	void stopPlaying();  	bool setTrack(int track); -	bool jumpToTick(uint32 tick, bool fireEvents = false); +	bool jumpToTick(uint32 tick, bool fireEvents = false, bool stopNotes = true);  	uint32 getPPQN() { return _ppqn; }  	virtual uint32 getTick() { return _position._play_tick; }  | 
