mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
SCUMM: (DOTT) - fix bug no. 12776 ("Use after free error in DOTT intro")
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user