[Scummvm-cvs-logs] SF.net SVN: scummvm: [26300] scummvm/trunk/engines/kyra/sound_towns.cpp

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Sun Mar 25 17:54:16 CEST 2007


Revision: 26300
          http://scummvm.svn.sourceforge.net/scummvm/?rev=26300&view=rev
Author:   lordhoto
Date:     2007-03-25 08:54:15 -0700 (Sun, 25 Mar 2007)

Log Message:
-----------
Some tempo fixes from Florian.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/sound_towns.cpp

Modified: scummvm/trunk/engines/kyra/sound_towns.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sound_towns.cpp	2007-03-24 23:57:29 UTC (rev 26299)
+++ scummvm/trunk/engines/kyra/sound_towns.cpp	2007-03-25 15:54:15 UTC (rev 26300)
@@ -144,7 +144,7 @@
 	MidiParser_EuD();
 
 	bool loadMusic (byte *data, uint32 unused = 0);
-	void setTempo(uint32 tempo);
+	void setTempo(int32 tempo);
 protected:
 	void parseNextEvent (EventInfo &info);
 	void resetTracking();
@@ -188,6 +188,8 @@
 	bool isStereo() const { return true; }
 	int getRate() const { return _mixer->getOutputRate(); }
 
+	void fading(bool status = true);
+
 protected:
 	void nextTick(int16 *buf1, int buflen);
 	int volume(int val = -1) { if (val >= 0) _volume = val; return _volume; }
@@ -200,6 +202,8 @@
 	MidiChannel_EuD * _channel[16];
 
 	int _volume;
+	bool _fading;
+	int16 _fadestate;
 
 	uint8 *_fmInstruments;
 	uint8 *_waveInstruments;
@@ -523,11 +527,13 @@
 }
 
 FMT_EuphonyDriver::FMT_EuphonyDriver(Audio::Mixer *mixer)
-	: MidiDriver_Emulated(mixer) {
+: MidiDriver_Emulated(mixer) {
 
+	_volume = 255;
+	_fadestate = 300;
+
 	MidiDriver_YM2612::createLookupTables();
 
-	_volume = 255;
 	for (uint8 i = 0; i < 6; i++)
 		_channel[i] = _fChannel[i] = new MidiChannel_EuD_FM;
 	for (uint8 i = 0; i < 8; i++)
@@ -538,6 +544,7 @@
 	memset(_waveSounds, 0, sizeof(uint8*) * 10);
 
 	rate(getRate());
+	fading(0);
 }
 
 FMT_EuphonyDriver::~FMT_EuphonyDriver() {
@@ -610,6 +617,7 @@
 		break; // Not supported.
 	case 0xB0: // Control Change
 		if (param1 == 0x79) {
+			fading(0);
 			for (int i = 0; i < 15; i++) {
 				if (_channel[i]) {
 					_channel[i]->controlChange(param1, param2);
@@ -710,21 +718,35 @@
 	}
 
 	for (int i = 0; i < buflen; ++i) {
-		buf1[i*2] = buf1[i*2+1] =((buf0[i] * volume()) >> 9) & 0xffff;
+		int s = int( float(buf0[i] * volume()) * float((float)_fadestate / 300) );
+		buf1[i*2] = buf1[i*2+1] = (s >> 9) & 0xffff;
 	}
+
+	if (_fading) {
+		if (_fadestate)
+			_fadestate--;
+		else
+			_fading = false;
+	}
 }
 
-void FMT_EuphonyDriver::rate(uint16 r)
-{
+void FMT_EuphonyDriver::rate(uint16 r) {
 	for (uint8 i = 0; i < 16; i++) {
 		if (_channel[i])
 			_channel[i]->rate(r);
 	}
 }
 
-MidiParser_EuD::MidiParser_EuD() : MidiParser() {
+void FMT_EuphonyDriver::fading(bool status) {
+	_fading = status;
+	if (!_fading)
+		_fadestate = 300;
 }
 
+MidiParser_EuD::MidiParser_EuD() : MidiParser(),
+	_firstBaseTickStep(0x33), _nextBaseTickStep(0x33), _initialTempo(0x5a) {
+}
+
 void MidiParser_EuD::parseNextEvent(EventInfo &info) {
 	byte *pos = _position._play_pos;
 
@@ -789,7 +811,7 @@
 			_nextBaseTickStep = pos[1];
 			pos += 6;
 		} else if (cmd == 0xF8) {
-			uint16 tempo = pos[4] | (pos[5] << 7);
+			int16 tempo = pos[4] | (pos[5] << 7);
 			setTempo(tempo);
 			pos += 6;
 		} else if (cmd == 0xFD || cmd == 0xFE) {
@@ -807,7 +829,7 @@
 			info.ext.data = pos;
 			break;
 		} else {
-			error("Unknown Euphony music event 0x%02X", (int) cmd);
+			error("Unknown Euphony music event 0x%02X", (int)cmd);
 			memset(&info, 0, sizeof(info));
 			pos = 0;
 			break;
@@ -838,14 +860,27 @@
 	return true;
 }
 
-void MidiParser_EuD::setTempo(uint32 tempo) {
-	if (tempo)
-		MidiParser::setTempo(60000000 / tempo);
+void MidiParser_EuD::setTempo(int32 tempo) {
+	if (!tempo) {
+		MidiParser::setTempo(0);
+		return;
+	}
+
+	if (tempo < 0)
+		tempo = 0;
+	if (tempo > 0x1F4)
+		tempo = 0x1F4;
+
+	tempo = 0x4C4B4 / (tempo + 0x1E);
+	while (tempo < 0x451)
+		tempo <<= 1;
+	tempo <<= 8;
+
+	MidiParser::setTempo(tempo);
 }
 
 void MidiParser_EuD::resetTracking() {
 	MidiParser::resetTracking();
-
 	_nextBaseTickStep = _firstBaseTickStep;
 	_baseTick = 0;
 	setTempo(_initialTempo);
@@ -1101,8 +1136,12 @@
 }
 
 void SoundTowns::beginFadeOut() {
-	//int vol = 255;
-	haltTrack();
+	_lastTrack = -1;
+	_driver->fading();
+
+	// TODO: this should fade out too
+	AudioCD.stop();
+	AudioCD.updateCD();
 }
 
 int SoundTowns::open() {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list