diff options
author | Jerome Fisher | 2004-11-27 14:53:37 +0000 |
---|---|---|
committer | Jerome Fisher | 2004-11-27 14:53:37 +0000 |
commit | 8d0ab890f8597c90d8f51caf1ed416e1df60848a (patch) | |
tree | 75d956f5d5e7998d7028c72002448fbc5e32dd38 /scumm/imuse.cpp | |
parent | 1a7ca2dc2a71fed65673b4e3934f2151cc8475d1 (diff) | |
download | scummvm-rg350-8d0ab890f8597c90d8f51caf1ed416e1df60848a.tar.gz scummvm-rg350-8d0ab890f8597c90d8f51caf1ed416e1df60848a.tar.bz2 scummvm-rg350-8d0ab890f8597c90d8f51caf1ed416e1df60848a.zip |
To really, truly fix the multi-midi race condition, the adlib driver is now always created before iMuse initialisation. This necessitated removing the multimidi toggle from the debug console.
svn-id: r15912
Diffstat (limited to 'scumm/imuse.cpp')
-rw-r--r-- | scumm/imuse.cpp | 40 |
1 files changed, 9 insertions, 31 deletions
diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp index 61e29fe5b7..dd4f304d63 100644 --- a/scumm/imuse.cpp +++ b/scumm/imuse.cpp @@ -1077,24 +1077,6 @@ uint32 IMuseInternal::property(int prop, uint32 value) { initMT32(_midi_native); break; - case IMuse::PROP_MULTI_MIDI: - _enable_multi_midi = (value > 0); - if (!_enable_multi_midi && _midi_native && _midi_adlib) { - MidiDriver *driver = _midi_adlib; - _midi_adlib = NULL; - int i; - for (i = 0; i < ARRAYSIZE(_players); ++i) { - if (_players[i].isActive() && _players[i].getMidiDriver() == driver) - _players[i].clear(); - } - driver->close(); - // FIXME: shouldn't we delete 'driver' here, too ? - } else if (_enable_multi_midi && _midi_adlib == NULL) { - _midi_adlib = MidiDriver_ADLIB_create(_mixer); - initMidiDriver(_midi_adlib); - } - break; - case IMuse::PROP_OLD_ADLIB_INSTRUMENTS: _old_adlib_instruments = (value > 0); break; @@ -1120,25 +1102,21 @@ void IMuseInternal::setBase(byte **base) { _base_sounds = base; } -IMuseInternal *IMuseInternal::create(OSystem *syst, SoundMixer *mixer, MidiDriver *native_midi) { +IMuseInternal *IMuseInternal::create(OSystem *syst, MidiDriver *nativeMidiDriver, MidiDriver *adlibMidiDriver) { IMuseInternal *i = new IMuseInternal; - i->initialize(syst, mixer, native_midi); + i->initialize(syst, nativeMidiDriver, adlibMidiDriver); return i; } -int IMuseInternal::initialize(OSystem *syst, SoundMixer *mixer, MidiDriver *native_midi) { +int IMuseInternal::initialize(OSystem *syst, MidiDriver *native_midi, MidiDriver *adlib_midi) { int i; - _mixer = mixer; _midi_native = native_midi; - if (native_midi) + _midi_adlib = adlib_midi; + if (native_midi != NULL) initMidiDriver(_midi_native); - if (!native_midi || _enable_multi_midi) { - _midi_adlib = MidiDriver_ADLIB_create(_mixer); - initMidiDriver(_midi_adlib); - } else { - _midi_adlib = NULL; - } + if (adlib_midi != NULL) + initMidiDriver(adlib_midi); if (!_tempoFactor) _tempoFactor = 100; _master_volume = 255; @@ -1785,8 +1763,8 @@ void IMuse::terminate() { in(); _target->terminate1(); out(); _target->terminate // The IMuse::create method provides a front-end factory // for creating IMuseInternal without exposing that class // to the client. -IMuse *IMuse::create(OSystem *syst, SoundMixer *mixer, MidiDriver *midi) { - IMuseInternal *engine = IMuseInternal::create(syst, mixer, midi); +IMuse *IMuse::create(OSystem *syst, MidiDriver *nativeMidiDriver, MidiDriver *adlibMidiDriver) { + IMuseInternal *engine = IMuseInternal::create(syst, nativeMidiDriver, adlibMidiDriver); return new IMuse(syst, engine); } |