diff -ur ScummVM-cvs20020910/scummvm/scumm/imuse.cpp ScummVM-cvs20020910+hack/scummvm/scumm/imuse.cpp
--- ScummVM-cvs20020910/scummvm/scumm/imuse.cpp	2002-09-09 07:03:55.000000000 +0200
+++ ScummVM-cvs20020910+hack/scummvm/scumm/imuse.cpp	2002-09-10 21:38:09.000000000 +0200
@@ -170,6 +170,7 @@
 	int query_param(int param);
 
 	int fade_vol(byte vol, int time);
+	bool is_fading_out();
 	void sequencer_timer();
 };
 
@@ -185,7 +186,9 @@
 
 	void initialize() {
 		active = false;
-	} void on_timer();
+	}
+	void on_timer(bool probe);
+	byte fading_to();
 };
 
 struct SustainingNotes {
@@ -1134,12 +1137,12 @@
 	for (i = ARRAYSIZE(_volume_fader); i != 0; i--, vf++) {
 		if (vf->active) {
 			_active_volume_faders = true;
-			vf->on_timer();
+			vf->on_timer(false);
 		}
 	}
 }
 
-void VolumeFader::on_timer()
+void VolumeFader::on_timer(bool probe)
 {
 	byte newvol;
 
@@ -1152,13 +1155,15 @@
 	}
 
 	if (curvol != newvol) {
+		curvol = newvol;
 		if (!newvol) {
-			player->clear();
+			if (!probe)
+				player->clear();
 			active = false;
 			return;
 		}
-		curvol = newvol;
-		player->set_vol(newvol);
+		if (!probe)
+			player->set_vol(newvol);
 	}
 
 	if (!--num_steps) {
@@ -1166,14 +1171,53 @@
 	}
 }
 
+byte VolumeFader::fading_to()
+{
+	byte newvol;
+	byte orig_curvol;
+	uint16 orig_speed_lo_counter, orig_num_steps;
+
+	if (!active)
+		return 127;
+
+	// It would be so much easier to just store the fade-to volume in a
+	// variable, but then we'd have to break savegame compatibility. So
+	// instead we do a "dry run" fade.
+
+	orig_speed_lo_counter = speed_lo_counter;
+	orig_num_steps = num_steps;
+	orig_curvol = curvol;
+
+	while (active)
+		on_timer(true);
+
+	active = true;
+	newvol = curvol;
+
+	speed_lo_counter = orig_speed_lo_counter;
+	num_steps = orig_num_steps;
+	curvol = orig_curvol;
+
+	return newvol;
+}
+
 int IMuseInternal::get_sound_status(int sound)
 {
 	int i;
 	Player *player;
 
 	for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) {
-		if (player->_active && player->_id == (uint16)sound)
+		if (player->_active && player->_id == (uint16)sound) {
+			// Assume that anyone asking for the sound status is
+			// really asking "is it ok if I start playing this
+			// sound now?" So if the sound is about to fade out,
+			// shut it down and pretend it wasn't playing.
+			if (player->is_fading_out()) {
+				player->clear();
+				continue;
+			}
 			return 1;
+		}
 	}
 	return get_queue_sound_status(sound);
 }
@@ -1781,6 +1825,18 @@
 	return 0;
 }
 
+bool Player::is_fading_out()
+{
+	VolumeFader *vf = _se->_volume_fader;
+	int i;
+
+	for (i = 0; i < 8; i++, vf++) {
+		if (vf->active && vf->direction < 0 && vf->player == this && vf->fading_to() == 0)
+			return true;
+	}
+	return false;
+}
+
 void Player::clear()
 {
 	uninit_seq();
