diff options
author | Jamieson Christian | 2002-12-14 02:51:37 +0000 |
---|---|---|
committer | Jamieson Christian | 2002-12-14 02:51:37 +0000 |
commit | e2cb8112e50d4a88e85d9b08ab4e38ddf48d398e (patch) | |
tree | 5d6ad55fa2358b8732bf0080e840fdefa7e48546 | |
parent | 7f46dc6690b652edcf6fccc4870928de9851f11e (diff) | |
download | scummvm-rg350-e2cb8112e50d4a88e85d9b08ab4e38ddf48d398e.tar.gz scummvm-rg350-e2cb8112e50d4a88e85d9b08ab4e38ddf48d398e.tar.bz2 scummvm-rg350-e2cb8112e50d4a88e85d9b08ab4e38ddf48d398e.zip |
Fixed last bad artifacts of Sam & Max carnival music.
Hopefully this fix doesn't break anything else....
svn-id: r5948
-rw-r--r-- | scumm/imuse.cpp | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp index 5a4d3b5435..25afda6666 100644 --- a/scumm/imuse.cpp +++ b/scumm/imuse.cpp @@ -813,6 +813,19 @@ bool IMuseInternal::start_sound(int sound) Player *player; void *mdhd; + // Do not start a sound if it is already set to + // start on an ImTrigger event. This fixes carnival + // music problems where a sound has been set to trigger + // at the right time, but then is started up immediately + // anyway, only to be restarted later when the trigger + // occurs. + int i; + ImTrigger *trigger = _snm_triggers; + for (i = ARRAYSIZE (_snm_triggers); i; --i, ++trigger) { + if (trigger->sound && trigger->id && trigger->command[0] == 8 && trigger->command[1] == sound) + return false; + } + mdhd = findTag(sound, MDHD_TAG, 0); if (!mdhd) { mdhd = findTag(sound, MDPG_TAG, 0); @@ -829,7 +842,6 @@ bool IMuseInternal::start_sound(int sound) // race conditions that were observed in MI2. Reference // Bug #590511 and Patch #607175 (which was reversed to fix // an FOA regression: Bug #622606). - int i; for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) { if (player->_active && player->_id == sound) break; @@ -1452,7 +1464,7 @@ int32 IMuseInternal::do_command(int a, int b, int c, int d, int e, int f, int g, } return -1; case 15: - // Sam & Max: Unconditional Jump? + // Sam & Max: Set hook for a "maybe" jump for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) { if (player->_active && player->_id == (uint16)b) { player->_hook._jump = d; @@ -1604,11 +1616,11 @@ int32 IMuseInternal::ImSetTrigger (int sound, int id, int a, int b, int c, int d // represented by MIDI SysEx block 00 xx (F7) // where "xx" is the marker ID. uint16 oldest_trigger = 0; - int oldest_index = -1; + ImTrigger *oldest_ptr = NULL; int i; - for (i = 0; i < 16; ++i) { - ImTrigger *trig = &_snm_triggers [i]; + ImTrigger *trig = _snm_triggers; + for (i = ARRAYSIZE (_snm_triggers); i; --i, ++trig) { if (!trig->id) break; if (trig->id == id && trig->sound == sound) @@ -1620,26 +1632,31 @@ int32 IMuseInternal::ImSetTrigger (int sound, int id, int a, int b, int c, int d else diff = 0x10000 - trig->expire + _snm_trigger_index; - if (oldest_index < 0 || oldest_trigger < diff) { - oldest_index = i; + if (!oldest_ptr || oldest_trigger < diff) { + oldest_ptr = trig; oldest_trigger = diff; } } // If we didn't find a trigger, see if we can expire one. - if (i >= 16) { - if (oldest_index < 0) + if (!i) { + if (!oldest_ptr) return -1; - i = oldest_index; + trig = oldest_ptr; } - _snm_triggers [i].id = id; - _snm_triggers [i].sound = sound; - _snm_triggers [i].expire = (++_snm_trigger_index & 0xFFFF); - _snm_triggers [i].command [0] = a; - _snm_triggers [i].command [1] = b; - _snm_triggers [i].command [2] = c; - _snm_triggers [i].command [3] = d; + trig->id = id; + trig->sound = sound; + trig->expire = (++_snm_trigger_index & 0xFFFF); + trig->command [0] = a; + trig->command [1] = b; + trig->command [2] = c; + trig->command [3] = d; + + // If the command is to start a sound, stop that sound if it's already playing. + // This fixes some carnival music problems. + if (trig->command [0] == 8 && get_sound_status (trig->command [1])) + stop_sound (trig->command [1]); return 0; } |