Index: scummvm/scumm/imuse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse.cpp,v
retrieving revision 1.39
diff -u -r1.39 imuse.cpp
--- scummvm/scumm/imuse.cpp	6 Oct 2002 15:44:16 -0000	1.39
+++ scummvm/scumm/imuse.cpp	7 Oct 2002 14:11:53 -0000
@@ -323,10 +323,11 @@
 	friend struct Player;
 private:
 	IMuseDriver * _driver;
+	OSystem *_system;
 
 	byte **_base_sounds;
 
-	byte _locked;
+	void *_locked;
 	byte _hardware_type;
 
 private:
@@ -759,12 +760,12 @@
 
 void IMuseInternal::lock()
 {
-	_locked++;
+	_system->lock_mutex (_locked);
 }
 
 void IMuseInternal::unlock()
 {
-	_locked--;
+	_system->unlock_mutex (_locked);
 }
 
 byte *IMuseInternal::findTag(int sound, char *tag, int index)
@@ -868,12 +869,18 @@
 			return false;
 		}
 	}
+
+	lock();
 	player = allocate_player(128);
-	if (!player)
+	if (!player) {
+		unlock();
 		return false;
+	}
 
 	player->clear();
-	return player->start_sound(sound);
+	bool ret = player->start_sound(sound);
+	unlock();
+	return ret;
 }
 
 
@@ -955,7 +962,9 @@
 
 	for (i = ARRAYSIZE(_players); i != 0; i--, player++) {
 		if (player->_active && player->_id == sound) {
+			lock();
 			player->clear();
+			unlock();
 			r = 0;
 		}
 	}
@@ -967,16 +976,18 @@
 	Player *player = _players;
 	int i;
 
+	lock();
 	for (i = ARRAYSIZE(_players); i != 0; i--, player++) {
 		if (player->_active)
 			player->clear();
 	}
+	unlock();
 	return 0;
 }
 
 void IMuseInternal::on_timer()
 {
-	if (_locked || _paused)
+	if (_paused)
 		return;
 
 	lock();
@@ -1190,7 +1201,9 @@
 			// 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()) {
+				lock();
 				player->clear();
+				unlock();
 				continue;
 			}
 			return 1;
@@ -1350,10 +1363,12 @@
 	vol = vol * _music_volume / 128;
 
 	_master_volume = vol;
+	lock();
 	for (int i = 0; i != 8; i++)
 		_channel_volume_eff[i] = (_channel_volume[i] + 1) * vol >> 7;
 	update_volumes();
 
+	unlock();
 	return 0;
 }
 
@@ -1378,6 +1393,7 @@
 		delete _driver;
 		_driver = NULL;
 	}
+	_system->delete_mutex (_locked);
 	return 0;
 	/* not implemented */
 }
@@ -1439,7 +1455,9 @@
 
 				for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) {
 					if (player->_active && player->_id == (uint16)b) {
+						lock();
 						player->fade_vol(e, f);
+						unlock();
 						return 0;
 					}
 				}
@@ -1449,7 +1467,9 @@
 				Player *player;
 				for (i = ARRAYSIZE(_players), player = _players; i != 0; i--, player++) {
 					if (player->_active && player->_id == (uint16)b) {
+						lock();
 						player->jump(player->_track_index + 1, 0, 0);
+						unlock();
 						return 0;
 					}
 				}
@@ -1485,64 +1505,70 @@
 			}
 		}
 
+		int32 ret = -1;
+		lock();
+
 		switch (cmd) {
 		case 0:
-			return player->get_param(c, d);
+			ret = player->get_param(c, d); break;
 		case 1:
 			player->set_priority(c);
-			return 0;
+			ret = 0; break;
 		case 2:
-			return player->set_vol(c);
+			ret = player->set_vol(c); break;
 		case 3:
 			player->set_pan(c);
-			return 0;
+			ret = 0; break;
 		case 4:
-			return player->set_transpose(c, d);
+			ret = player->set_transpose(c, d); break;
 		case 5:
 			player->set_detune(c);
-			return 0;
+			ret = 0; break;
 		case 6:
 			player->set_speed(c);
-			return 0;
+			ret = 0; break;
 		case 7:
-			return player->jump(c, d, e) ? 0 : -1;
+			ret = player->jump(c, d, e) ? 0 : -1; break;
 		case 8:
-			return player->scan(c, d, e);
+			ret = player->scan(c, d, e); break;
 		case 9:
-			return player->set_loop(c, d, e, f, g) ? 0 : -1;
+			ret = player->set_loop(c, d, e, f, g) ? 0 : -1; break;
 		case 10:
 			player->clear_loop();
-			return 0;
+			ret = 0; break;
 		case 11:
 			((Part *)player)->set_onoff(d != 0);
-			return 0;
+			ret = 0; break;
 		case 12:
-			return player->_hook.set(c, d, e);
+			ret = player->_hook.set(c, d, e); break;
 		case 13:
-			return player->fade_vol(c, d);
+			ret = player->fade_vol(c, d); break;
 		case 14:
-			return enqueue_trigger(b, c);
+			ret = enqueue_trigger(b, c); break;
 		case 15:
-			return enqueue_command(b, c, d, e, f, g, h);
+			ret = enqueue_command(b, c, d, e, f, g, h); break;
 		case 16:
-			return clear_queue();
+			ret = clear_queue(); break;
 		case 19:
-			return player->get_param(c, d);
+			ret = player->get_param(c, d); break;
 		case 20:
-			return player->_hook.set(c, d, e);
+			ret = player->_hook.set(c, d, e); break;
 		case 21:
-			return -1;
+			ret = -1; break;
 		case 22:
 			((Part *)player)->set_vol(d);
-			return 0;
+			ret = 0; break;
 		case 23:
-			return query_queue(b);
+			ret = query_queue(b); break;
 		case 24:
-			return 0;
+			ret = 0; break;
 		default:
 			warning("IMuseInternal::do_command default midi command %d", cmd);
-			return -1;
+			ret = -1;
 		}
+
+		unlock();
+		return ret;
 	}
 
 	return -1;
@@ -1713,10 +1739,12 @@
 		driv = new IMuseGM(midi);
 	}
 
+	_system = syst;
 	_driver = driv;
 	_hardware_type = driv->get_hardware_type();
 	_game_tempo = driv->get_base_tempo();
 
+	_locked = _system->create_mutex();
 	driv->init(this, syst);
 
 	_master_volume = 127;
@@ -3011,12 +3039,16 @@
 		MKEND()
 	};
 
+	lock();
+
 	if (!ser->isSaving()) {
 		stop_all_sounds();
 	}
 #ifdef _WIN32_WCE								// Don't break savegames made with andys' build
-	if (!ser->isSaving() && ser->checkEOFLoadStream())
+	if (!ser->isSaving() && ser->checkEOFLoadStream()) {
+		unlock();
 		return 0;
+	}
 #endif
 
 	ser->_ref_me = this;
@@ -3037,6 +3069,7 @@
 		_driver->update_pris();
 	}
 
+	unlock();
 	return 0;
 }
 
