diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h index 51687170c60..ca95a250c42 100644 --- a/engines/scumm/imuse/imuse_internal.h +++ b/engines/scumm/imuse/imuse_internal.h @@ -178,8 +178,16 @@ protected: static uint16 _active_notes[128]; protected: + enum ParserType { + kParserTypeNone = 0, + kParserTypeRO, + kParserTypeXMI, + kParserTypeSMF + }; + MidiDriver *_midi; MidiParser *_parser; + ParserType _parserType; Part *_parts; bool _active; diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp index 48d35b5c274..454fd8c3a25 100644 --- a/engines/scumm/imuse/imuse_player.cpp +++ b/engines/scumm/imuse/imuse_player.cpp @@ -82,7 +82,8 @@ Player::Player() : _se(0), _vol_chan(0), _abort(false), - _music_tick(0) { + _music_tick(0), + _parserType(kParserTypeNone) { } Player::~Player() { @@ -151,9 +152,9 @@ void Player::clear() { if (_parser) { _parser->unloadMusic(); - delete _parser; - _parser = 0; + _parser->setMidiDriver(NULL); } + uninit_parts(); _se->ImFireAllTriggers(_id); _active = false; @@ -181,17 +182,28 @@ int Player::start_seq_sound(int sound, bool reset_vars) { ptr = _se->findStartOfSound(sound); if (ptr == NULL) return -1; - delete _parser; if (!memcmp(ptr, "RO", 2)) { // Old style 'RO' resource - _parser = MidiParser_createRO(); + if (_parserType != kParserTypeRO) { + delete _parser; + _parser = MidiParser_createRO(); + _parserType = kParserTypeRO; + } } else if (!memcmp(ptr, "FORM", 4)) { // Humongous Games XMIDI resource - _parser = MidiParser::createParser_XMIDI(); + if (_parserType != kParserTypeXMI) { + delete _parser; + _parser = MidiParser::createParser_XMIDI(); + _parserType = kParserTypeXMI; + } } else { // SCUMM SMF resource - _parser = MidiParser::createParser_SMF(); + if (_parserType != kParserTypeSMF) { + delete _parser; + _parser = MidiParser::createParser_SMF(); + _parserType = kParserTypeSMF; + } } _parser->setMidiDriver(this); @@ -1010,6 +1022,7 @@ void Player::fixAfterLoad() { if (!_midi) { clear(); } else { + _parserType = kParserTypeNone; start_seq_sound(_id, false); setSpeed(_speed); if (_parser)