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

athrxx at users.sourceforge.net athrxx at users.sourceforge.net
Mon Jun 30 23:55:08 CEST 2008


Revision: 32854
          http://scummvm.svn.sourceforge.net/scummvm/?rev=32854&view=rev
Author:   athrxx
Date:     2008-06-30 14:55:08 -0700 (Mon, 30 Jun 2008)

Log Message:
-----------
- this fixes Hof PC98 music initialization
- music sounds exactly like FM-Towns for now

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

Modified: scummvm/trunk/engines/kyra/kyra_hof.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_hof.cpp	2008-06-30 19:10:32 UTC (rev 32853)
+++ scummvm/trunk/engines/kyra/kyra_hof.cpp	2008-06-30 21:55:08 UTC (rev 32854)
@@ -1564,7 +1564,7 @@
 	int16 vocIndex = (int16)READ_LE_UINT16(&_ingameSoundIndex[track * 2]);
 	if (vocIndex != -1)
 		_sound->voicePlay(_ingameSoundList[vocIndex], true);
-	else if (_flags.platform == Common::kPlatformPC)
+	else if (_flags.platform != Common::kPlatformFMTowns)
 		// TODO ?? Maybe there is a way to let users select whether they want
 		// voc, midi or adl sfx (even though it makes no sense to choose anything but voc).
 		KyraEngine_v1::snd_playSoundEffect(track);

Modified: scummvm/trunk/engines/kyra/sound_towns.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sound_towns.cpp	2008-06-30 19:10:32 UTC (rev 32853)
+++ scummvm/trunk/engines/kyra/sound_towns.cpp	2008-06-30 21:55:08 UTC (rev 32854)
@@ -1348,7 +1348,7 @@
 		CHS_EOT				=	0x80
 	} ChannelState;
 
-	void loadData(uint8 *data);
+	virtual void loadData(uint8 *data);
 	virtual void processEvents();
 	virtual void processFrequency();
 	bool processControlEvent(uint8 cmd);
@@ -1404,7 +1404,6 @@
 	uint8 _keyOffTime;
 	bool _protect;
 	uint8 *_dataPtr;
-	uint8 _unk15, _unk16;
 	uint8 _ptchWhlInitDelayLo;
 	uint8 _ptchWhlInitDelayHi;
 	int16 _ptchWhlModInitVal;
@@ -1413,9 +1412,11 @@
 	int16 _ptchWhlModCurVal;
 	uint8 _ptchWhlDurLeft;
 	uint16 frequency;
-	uint8 _unk28, _unk29;
 	uint8 _regOffset;
 	uint8 _flags;
+	uint8 _ssg1;
+	uint8 _ssg2;
+
 	const uint8 _chanNum;
 	const uint8 _keyNum;
 	const uint8 _part;
@@ -1439,8 +1440,13 @@
 
 	void keyOn();
 	void keyOff();
+	void loadData(uint8 *data);
+
+private:
+	void opn_SSG_UNK(uint8 a);
 };
 
+
 class TownsPC98_OpnDriver : public Audio::AudioStream {
 friend class TownsPC98_OpnChannel;
 friend class TownsPC98_OpnChannelSSG;
@@ -1514,7 +1520,8 @@
 	uint8 _looping;
 	uint32 _tickCounter;
 
-	bool __updateEnvelopes;
+	bool _updateEnvelopes;
+	int _ssgFlag;
 
 	int32 _samplesTillCallback;
 	int32 _samplesTillCallbackRemainder;
@@ -1536,8 +1543,8 @@
 	uint8 key, uint8 prt, uint8 id) : _drv(driver), _regOffset(regOffs), _flags(flgs), _chanNum(num), _keyNum(key),
 	_part(prt), _idFlag(id) {
 
-	_ticksLeft = _algorithm = _instrID = _totalLevel = _frqBlockMSB = _keyOffTime = _unk15 = _unk16 = 0;
-	_ptchWhlInitDelayLo = _ptchWhlInitDelayHi = _ptchWhlDuration = _ptchWhlCurDelay = _ptchWhlDurLeft = _unk28 = _unk29 = 0;
+	_ticksLeft = _algorithm = _instrID = _totalLevel = _frqBlockMSB = _keyOffTime = _ssg1 = _ssg2 = 0;
+	_ptchWhlInitDelayLo = _ptchWhlInitDelayHi = _ptchWhlDuration = _ptchWhlCurDelay = _ptchWhlDurLeft = 0;
 	_frqLSB = 0;
 	_protect = _updateEnvelopes = false;
 	_enableLeft = _enableRight = true;
@@ -1602,7 +1609,6 @@
 	writeReg(regAdress, value);
 }
 
-
 void TownsPC98_OpnChannel::loadData(uint8 *data) {
 	_flags = (_flags & ~CHS_EOT) | CHS_ALL_BUT_EOT;
 	_ticksLeft = 1;
@@ -2242,7 +2248,7 @@
 	if (_flags & CHS_EOT)
 		return;
 
-	//int _ssgUnk = (_flags & CHS_SSG) ? -1 : 0;
+	_drv->_ssgFlag = (_flags & CHS_SSG) ? -1 : 0;
 
 	if (_protect == false && _ticksLeft == _keyOffTime)
 		keyOff();
@@ -2336,6 +2342,22 @@
 	writeReg(regAdress, value);
 }
 
+void TownsPC98_OpnChannelSSG::loadData(uint8 *data) {
+	_drv->_ssgFlag = (_flags & CHS_SSG) ? -1 : 0;
+	opn_SSG_UNK(0);
+	TownsPC98_OpnChannel::loadData(data);
+	_algorithm = 0x80;
+}
+
+void TownsPC98_OpnChannelSSG::opn_SSG_UNK(uint8 a) {
+	_ssg1 = a;
+	uint16 h = (_totalLevel + 1) * a;
+	if ((h >> 8) == _ssg2)
+		return;
+	_ssg2 = (h >> 8);
+	writeReg(8 + _regOffset, _ssg2);
+}
+
 TownsPC98_OpnDriver::TownsPC98_OpnDriver(Audio::Mixer *mixer, OpnType type) :
 	_mixer(mixer), _trackData(0), _playing(false), _fading(false), _channels(0), _ssgChannels(0),
 	_looping(0), _opnCarrier(_drvTables + 76), _opnFreqTable(_drvTables + 84),
@@ -2469,7 +2491,7 @@
 	
 	uint8 *src_a = data;
 
-	for (uint8 i = 0; i < _numChan; i++) {
+	for (uint8 i = 0; i < 3; i++) {
 		_channels[i]->loadData(data + READ_LE_UINT16(src_a));
 		src_a += 2;
 	}
@@ -2479,11 +2501,18 @@
 		src_a += 2;
 	}
 
+	for (uint8 i = 3; i < _numChan; i++) {
+		_channels[i]->loadData(data + READ_LE_UINT16(src_a));
+		src_a += 2;
+	}
+
 	if (_hasADPCM) {
-		// TODO
+		//_adpcmChannel->loadData(data + READ_LE_UINT16(src_a));
 		src_a += 2;
 	}
 
+	_ssgFlag = 0;
+
 	_patches = src_a + 4;
 	_cbCounter = 4;
 	_finishedChannelsFlag = 0;
@@ -2555,6 +2584,8 @@
 			_ssgChannels[i]->processFrequency();
 		}
 	}
+	
+	_ssgFlag = 0;
 
 	unlock();
 


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