aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorJamieson Christian2003-05-25 16:21:55 +0000
committerJamieson Christian2003-05-25 16:21:55 +0000
commit9d53046039c38d8c562a8f211929a01eb771d054 (patch)
treede39a4def0e9a91f5e796e1ca9120ee06b2dabf1 /scumm
parentcd1493447dc02baa3148ff412f070e6e65e6161d (diff)
downloadscummvm-rg350-9d53046039c38d8c562a8f211929a01eb771d054.tar.gz
scummvm-rg350-9d53046039c38d8c562a8f211929a01eb771d054.tar.bz2
scummvm-rg350-9d53046039c38d8c562a8f211929a01eb771d054.zip
Fixed music starting at incorrect location when loading game
svn-id: r7961
Diffstat (limited to 'scumm')
-rw-r--r--scumm/imuse_internal.h3
-rw-r--r--scumm/imuse_player.cpp36
2 files changed, 19 insertions, 20 deletions
diff --git a/scumm/imuse_internal.h b/scumm/imuse_internal.h
index 90caaa792b..08257d4100 100644
--- a/scumm/imuse_internal.h
+++ b/scumm/imuse_internal.h
@@ -164,7 +164,6 @@ protected:
int8 _detune;
byte _vol_eff;
- uint _song_index;
uint _track_index;
uint _loop_to_beat;
uint _loop_from_beat;
@@ -219,7 +218,7 @@ protected:
// Sequencer part
void setTempo(uint32 data);
- int start_seq_sound(int sound);
+ int start_seq_sound (int sound, bool reset_vars = true);
int query_param(int param);
public:
diff --git a/scumm/imuse_player.cpp b/scumm/imuse_player.cpp
index 134fe3af25..9feadcd441 100644
--- a/scumm/imuse_player.cpp
+++ b/scumm/imuse_player.cpp
@@ -60,7 +60,6 @@ _pan (0),
_transpose (0),
_detune (0),
_vol_eff (0),
-_song_index (0),
_track_index (0),
_loop_to_beat (0),
_loop_from_beat (0),
@@ -156,19 +155,20 @@ void Player::hook_clear() {
memset(&_hook, 0, sizeof(_hook));
}
-int Player::start_seq_sound(int sound) {
+int Player::start_seq_sound (int sound, bool reset_vars) {
byte *ptr;
- _song_index = sound;
- _loop_to_beat = 1;
- _loop_from_beat = 1;
- _track_index = 0;
- _loop_counter = 0;
- _loop_to_tick = 0;
- _loop_from_tick = 0;
+ if (reset_vars) {
+ _loop_to_beat = 1;
+ _loop_from_beat = 1;
+ _track_index = 0;
+ _loop_counter = 0;
+ _loop_to_tick = 0;
+ _loop_from_tick = 0;
- setTempo(500000);
- setSpeed(128);
+ setTempo(500000);
+ setSpeed(128);
+ }
ptr = _se->findStartOfSound (sound);
if (ptr == NULL)
@@ -219,7 +219,7 @@ void Player::uninit_parts() {
void Player::setSpeed(byte speed) {
_speed = speed;
if (_parser)
- _parser->setTimerRate ((_midi->getBaseTempo() * speed) >> 7);
+ _parser->setTimerRate ((_midi->getBaseTempo() * speed) / 128);
}
void Player::send (uint32 b) {
@@ -719,6 +719,7 @@ void Player::key_off(uint8 chan, uint8 note) {
bool Player::jump(uint track, uint beat, uint tick) {
if (!_parser)
return false;
+ _track_index = track;
_parser->setTrack (track);
if (!_parser->jumpToTick ((beat - 1) * TICKS_PER_BEAT + tick))
return false;
@@ -1122,12 +1123,11 @@ void Player::fixAfterLoad() {
if (!_midi) {
clear();
} else {
- start_seq_sound (_id);
+ start_seq_sound (_id, false);
setTempo (_tempo);
- if (_parser) {
- _parser->setTrack (_track_index);
- _parser->jumpToTick (_music_tick);
- }
+ setSpeed (_speed);
+ if (_parser)
+ _parser->jumpToTick (_music_tick); // start_seq_sound already switched tracks
_isMT32 = _se->isMT32 (_id);
_isGM = _se->isGM (_id);
}
@@ -1174,7 +1174,7 @@ int Player::save_or_load(Serializer *ser) {
MKLINE(Player, _vol_chan, sleUint16, VER_V8),
MKLINE(Player, _vol_eff, sleByte, VER_V8),
MKLINE(Player, _speed, sleByte, VER_V8),
- MKLINE(Player, _song_index, sleUint16, VER_V8),
+ MK_OBSOLETE(Player, _song_index, sleUint16, VER_V8, VER_V19),
MKLINE(Player, _track_index, sleUint16, VER_V8),
MK_OBSOLETE(Player, _timer_counter, sleUint16, VER_V8, VER_V17),
MKLINE(Player, _loop_to_beat, sleUint16, VER_V8),