[Scummvm-cvs-logs] CVS: scummvm/scumm imuse.cpp,2.25,2.26

Jamieson Christian jamieson630 at users.sourceforge.net
Thu May 15 12:40:04 CEST 2003


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv29851/scummvm/scumm

Modified Files:
	imuse.cpp 
Log Message:
More streamlining

Index: imuse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse.cpp,v
retrieving revision 2.25
retrieving revision 2.26
diff -u -d -r2.25 -r2.26
--- imuse.cpp	15 May 2003 18:24:59 -0000	2.25
+++ imuse.cpp	15 May 2003 19:39:10 -0000	2.26
@@ -31,7 +31,7 @@
 
 // Unremark this statement to activate some of
 // the most common iMuse diagnostic messages.
-// #define IMUSE_DEBUG
+#define IMUSE_DEBUG
 
 //
 // Some constants
@@ -268,8 +268,8 @@
 	void set_onoff(bool on);
 	void fix_after_load();
 
-	void update_pris();
-	void changed(uint16 what);
+	void sendAll();
+	bool clearToTransmit();
 	
 	Part() {
 		memset(this,0,sizeof(Part));
@@ -316,12 +316,10 @@
 	void init(IMuseInternal *eng, OSystem *os);
 	void update_pris();
 	void part_off(Part *part);
-	int part_update_active(Part *part, uint16 *active);
 
 	void set_instrument(uint slot, byte *instr);
 	void part_load_global_instrument (Part *part, byte slot);
 	void part_set_param(Part *part, byte param, int value) {}
-	void part_changed(Part *part, uint16 what);
 	void get_channel_instrument (byte channel, Instrument *instrument) { _midi_instrument_last[channel].copy_to (instrument); }
 
 	MidiChannel *getPercussionChannel() { return _md->getPercussionChannel(); }
@@ -2042,7 +2040,7 @@
 			part = get_part (p[0] & 0x0F);
 			if (part) {
 				part->_instrument.roland (p - 1);
-				part->changed (IMuseDriver::pcProgram);
+				if (part->clearToTransmit()) part->_instrument.send (part->_mc);
 			}
 		} else {
 			warning ("Unknown SysEx manufacturer 0x%02X", (int) a);
@@ -2086,10 +2084,10 @@
 				if (part->_percussion) {
 					if (part->_mc) {
 						part->off();
-						part->update_pris();
+						_se->_driver->update_pris();
 					}
 				} else {
-					part->changed (IMuseDriver::pcAll);
+					part->sendAll();
 				}
 			}
 		} else {
@@ -3071,53 +3069,65 @@
 
 void Part::set_detune(int8 detune) {
 	_detune_eff = clamp((_detune = detune) + _player->_detune, -128, 127);
-	changed(IMuseDriver::pcMod);
+	if (clearToTransmit()) {
+		_mc->pitchBend (clamp(_pitchbend +
+						(_detune_eff * 64 / 12) +
+						(_transpose_eff * 8192 / 12), -8192, 8191));
+	}
 }
 
 void Part::set_pitchbend(int value) {
 	_pitchbend = value;
-	changed(IMuseDriver::pcMod);
+	if (clearToTransmit()) {
+		_mc->pitchBend (clamp(_pitchbend +
+						(_detune_eff * 64 / 12) +
+						(_transpose_eff * 8192 / 12), -8192, 8191));
+	}
 }
 
 void Part::set_vol(uint8 vol) {
 	_vol_eff = ((_vol = vol) + 1) * _player->_vol_eff >> 7;
-	changed(IMuseDriver::pcVolume);
+	if (clearToTransmit()) _mc->volume (_vol_eff);
 }
 
 void Part::set_pri(int8 pri) {
 	_pri_eff = clamp((_pri = pri) + _player->_priority, 0, 255);
-	changed(IMuseDriver::pcPriority);
+	if (clearToTransmit()) _mc->priority (_pri_eff);
 }
 
 void Part::set_pan(int8 pan) {
 	_pan_eff = clamp((_pan = pan) + _player->_pan, -64, 63);
-	changed(IMuseDriver::pcPan);
+	if (clearToTransmit()) _mc->panPosition (_pan_eff + 0x40);
 }
 
 void Part::set_transpose(int8 transpose) {
 	_transpose_eff = transpose_clamp((_transpose = transpose) + _player->_transpose, -12, 12);
-	changed(IMuseDriver::pcMod);
+	if (clearToTransmit()) {
+		_mc->pitchBend (clamp(_pitchbend +
+						(_detune_eff * 64 / 12) +
+						(_transpose_eff * 8192 / 12), -8192, 8191));
+	}
 }
 
 void Part::set_pedal(bool value) {
 	_pedal = value;
-	changed(IMuseDriver::pcPedal);
+	if (clearToTransmit()) _mc->sustain (_pedal);
 }
 
 void Part::set_modwheel(uint value) {
 	_modwheel = value;
-	changed(IMuseDriver::pcModwheel);
+	if (clearToTransmit()) _mc->modulationWheel (_modwheel);
 }
 
 void Part::set_chorus(uint chorus) {
 	_chorus = chorus;
-	changed(IMuseDriver::pcChorus);
+	if (clearToTransmit()) _mc->chorusLevel (_effect_level);
 }
 
 void Part::set_effect_level(uint level)
 {
 	_effect_level = level;
-	changed(IMuseDriver::pcEffectLevel);
+	if (clearToTransmit()) _mc->effectLevel (_effect_level);
 }
 
 void Part::fix_after_load() {
@@ -3127,7 +3137,7 @@
 	set_pri(_pri);
 	set_pan(_pan);
 	if (_program < 128) _instrument.program (_program, _player->_mt32emulate);
-	changed (IMuseDriver::pcAll);
+	sendAll();
 }
 
 void Part::set_pitchbend_factor(uint8 value) {
@@ -3135,7 +3145,7 @@
 		return;
 	set_pitchbend(0);
 	_pitchbend_factor = value;
-	changed (IMuseDriver::pcPitchBendFactor);
+	if (clearToTransmit()) _mc->pitchBendFactor (_pitchbend_factor);
 }
 
 void Part::set_onoff(bool on) {
@@ -3144,13 +3154,13 @@
 		if (!on)
 			off();
 		if (!_percussion)
-			update_pris();
+			_drv->update_pris();
 	}
 }
 
 void Part::set_instrument(byte * data) {
 	_instrument.adlib (data);
-	changed(IMuseDriver::pcProgram);
+	if (clearToTransmit()) _instrument.send (_mc);
 }
 
 void Part::load_global_instrument (byte slot) {
@@ -3163,9 +3173,11 @@
 
 	// DEBUG
 	if (_unassigned_instrument && !_percussion) {
-		warning ("[%02d] No instrument specified", (int) _chan);
 		_unassigned_instrument = false;
-		return;
+		if (!_instrument.isValid()) {
+			warning ("[%02d] No instrument specified", (int) _chan);
+			return;
+		}
 	}
 
 	if (mc && _instrument.isValid()) {
@@ -3236,7 +3248,7 @@
 	_mc = NULL;
 
 	if (_instrument.isValid())
-		changed (IMuseDriver::pcAll);
+		sendAll();
 }
 
 void Part::uninit() {
@@ -3260,20 +3272,57 @@
 	_drv->part_off(this);
 }
 
-void Part::changed(uint16 what) {
-	_drv->part_changed(this, what);
+bool Part::clearToTransmit() {
+	if (_mc) return true;
+	_drv->update_pris();
+	return false;
 }
 
-void Part::set_param(byte param, int value) {
-	_drv->part_set_param(this, param, value);
+void Part::sendAll() {
+	if (!clearToTransmit()) return;
+	_mc->pitchBendFactor (_pitchbend_factor);
+	_mc->pitchBend (clamp(_pitchbend +
+	                (_detune_eff * 64 / 12) +
+	                (_transpose_eff * 8192 / 12), -8192, 8191));
+	_mc->volume (_vol_eff);
+	_mc->sustain (_pedal);
+	_mc->modulationWheel (_modwheel);
+	_mc->panPosition (_pan_eff + 0x40);
+	_mc->effectLevel (_effect_level);
+	if (_instrument.isValid()) {
+		_instrument.send (_mc);
+//		part->_instrument.copy_to (&_midi_instrument_last [part->_chan]);
+	}
+	_mc->chorusLevel (_effect_level);
+	_mc->priority (_pri_eff);
 }
 
-void Part::update_pris() {
-	_drv->update_pris();
+void Part::set_param(byte param, int value) {
+	_drv->part_set_param(this, param, value);
 }
 
 int Part::update_actives(uint16 *active) {
-	return _drv->part_update_active(this, active);
+	int i, j;
+	uint16 *act, mask, bits;
+	int count = 0;
+
+	bits = 1 << _chan;
+	act = _actives;
+
+	for (i = 8; i; i--) {
+		mask = *act++;
+		if (mask) {
+			for (j = 16; j; j--, mask >>= 1, active++) {
+				if (mask & 1 && !(*active & bits)) {
+					*active |= bits;
+					count++;
+				}
+			}
+		} else {
+			active += 16;
+		}
+	}
+	return count;
 }
 
 void Part::set_program(byte program) {
@@ -3281,7 +3330,7 @@
 		_program = program;
 		_bank = 0;
 		_instrument.program (_program, _player->_mt32emulate);
-		changed(IMuseDriver::pcProgram);
+		if (clearToTransmit()) _instrument.send (_mc);
 	}
 }
 
@@ -3289,7 +3338,7 @@
 	_bank = (byte)(b >> 8);
 	_program = (byte)b;
 	_instrument.program (_program, _player->_mt32emulate);
-	changed(IMuseDriver::pcProgram);
+	if (clearToTransmit()) _instrument.send (_mc);
 }
 
 ////////////////////////////////////////
@@ -3367,32 +3416,8 @@
 			if ((hipart->_mc = _md->allocateChannel()) == NULL)
 				return;
 		}
-		hipart->changed(pcAll);
-	}
-}
-
-int IMuseDriver::part_update_active(Part *part, uint16 *active) {
-	int i, j;
-	uint16 *act, mask, bits;
-	int count = 0;
-
-	bits = 1 << part->_chan;
-	act = part->_actives;
-
-	for (i = 8; i; i--) {
-		mask = *act++;
-		if (mask) {
-			for (j = 16; j; j--, mask >>= 1, active++) {
-				if (mask & 1 && !(*active & bits)) {
-					*active |= bits;
-					count++;
-				}
-			}
-		} else {
-			active += 16;
-		}
+		hipart->sendAll();
 	}
-	return count;
 }
 
 void IMuseDriver::set_instrument(uint slot, byte *data) {
@@ -3406,62 +3431,8 @@
 	if (slot >= 32)
 		return;
 	_glob_instr [slot].copy_to (&part->_instrument);
-	part->changed (pcProgram);
-}
-
-void IMuseDriver::part_changed(Part *part, uint16 what) {
-	MidiChannel *mc;
-
-	// Mark for re-schedule if program changed when in pre-state
-	if (what & pcProgram && !part->_mc && part->_on && !part->_percussion)
-		update_pris();
-
-	if (!(mc = part->_mc))
-		return;
-
-	if (part->_player == NULL) {	// No player, so dump phantom channel
-		part->_mc->release();
-		part->_mc = NULL;
-		memset(part->_actives, 0, sizeof(part->_actives));
-		return;
-	}
-
-	if (what & pcPitchBendFactor)
-		mc->pitchBendFactor (part->_pitchbend_factor);
-
-	if (what & pcMod)
-		mc->pitchBend (clamp(part->_pitchbend +
-		               (part->_detune_eff * 64 / 12) +
-		               (part->_transpose_eff * 8192 / 12), -8192, 8191));
-
-	if (what & pcVolume)
-		mc->volume (part->_vol_eff);
-
-	if (what & pcPedal)
-		mc->sustain (part->_pedal);
-
-	if (what & pcModwheel)
-		mc->modulationWheel (part->_modwheel);
-
-	if (what & pcPan)
-		mc->panPosition (part->_pan_eff + 0x40);
-
-	if (what & pcEffectLevel)
-		mc->effectLevel (part->_effect_level);
-
-	if (what & pcProgram && part->_instrument.isValid()) {
-		part->_instrument.send (mc);
-		part->_unassigned_instrument = false;
-//		part->_instrument.copy_to (&_midi_instrument_last [part->_chan]);
-	}
-
-	if (what & pcChorus)
-		mc->chorusLevel (part->_effect_level);
-
-	if (what & pcPriority)
-		mc->priority (part->_pri_eff);
+	if (part->clearToTransmit()) part->_instrument.send (part->_mc);
 }
-
 
 void IMuseDriver::part_off(Part *part) {
 	MidiChannel *mc = part->_mc;





More information about the Scummvm-git-logs mailing list