[Scummvm-cvs-logs] SF.net SVN: scummvm: [26367] scummvm/trunk/engines/scumm

kirben at users.sourceforge.net kirben at users.sourceforge.net
Mon Apr 2 03:45:29 CEST 2007


Revision: 26367
          http://scummvm.svn.sourceforge.net/scummvm/?rev=26367&view=rev
Author:   kirben
Date:     2007-04-01 18:45:28 -0700 (Sun, 01 Apr 2007)

Log Message:
-----------
Add patch #1692496 - Amiga indy3ega sound fixes.

Modified Paths:
--------------
    scummvm/trunk/engines/scumm/player_v3a.cpp
    scummvm/trunk/engines/scumm/player_v3a.h

Modified: scummvm/trunk/engines/scumm/player_v3a.cpp
===================================================================
--- scummvm/trunk/engines/scumm/player_v3a.cpp	2007-04-01 23:54:57 UTC (rev 26366)
+++ scummvm/trunk/engines/scumm/player_v3a.cpp	2007-04-02 01:45:28 UTC (rev 26367)
@@ -223,24 +223,27 @@
 		int rate = 3579545 / READ_BE_UINT16(data + 20);
 		char *sound = (char *)malloc(size);
 		int vol = (data[24] << 1) | (data[24] >> 5);	// if I boost this to 0-255, it gets too loud and starts to clip
-		memcpy(sound,data + READ_BE_UINT16(data + 8),size);
+		memcpy(sound, data + READ_BE_UINT16(data + 8), size);
 		int loopStart = 0, loopEnd = 0;
-		bool looped = false;
-		if ((READ_BE_UINT16(data + 16) || READ_BE_UINT16(data + 6))) {
+		int loopcount = data[27];
+		if (loopcount > 1) {
 			loopStart = READ_BE_UINT16(data + 10) - READ_BE_UINT16(data + 8);
 			loopEnd = READ_BE_UINT16(data + 14);
-			looped = true;
 		}
 		int i = getSfxChan();
-		if (i == -1)
-		{
+		if (i == -1) {
 			free(sound);
 			return;
 		}
 		_sfx[i].id = nr;
-		_sfx[i].dur = looped ? -1 : (1 + 60 * size / rate);
-		if ((_vm->_game.id == GID_INDY3) && (nr == 60))
-			_sfx[i].dur = 240;
+		_sfx[i].dur = 1 + loopcount * 60 * size / rate;
+		if (READ_BE_UINT16(data + 16)) {
+			_sfx[i].rate = READ_BE_UINT16(data + 20) << 16;
+			_sfx[i].delta = (int32)READ_BE_UINT32(data + 32);
+			_sfx[i].dur = READ_BE_UINT32(data + 40);
+		} else {
+			_sfx[i].delta = 0;
+		}
 		_mod->startChannel(nr | 0x100, sound, size, rate, vol, loopStart, loopEnd);
 	}
 }
@@ -262,6 +265,15 @@
 	}
 	for (i = 0; i < V3A_MAXSFX; i++) {
 		if (_sfx[i].id) {
+			if (_sfx[i].delta) {
+				uint16 oldrate = _sfx[i].rate >> 16;
+				_sfx[i].rate += _sfx[i].delta;
+				if (_sfx[i].rate < (55 << 16))
+					_sfx[i].rate = 55 << 16;	// at rates below 55, frequency
+				uint16 newrate = _sfx[i].rate >> 16;	// exceeds 65536, which is bad
+				if (oldrate != newrate)
+					_mod->setChannelFreq(_sfx[i].id | 0x100, 3579545 / newrate);
+			}
 			_sfx[i].dur--;
 			if (_sfx[i].dur)
 				continue;
@@ -320,8 +332,7 @@
 			memcpy(data + _wavetable[inst]->_ilen[oct], _wavetable[inst]->_ldat[oct], _wavetable[inst]->_llen[oct]);
 
 		i = getMusChan();
-		if (i == -1)
-		{
+		if (i == -1) {
 			free(data);
 			return;
 		}

Modified: scummvm/trunk/engines/scumm/player_v3a.h
===================================================================
--- scummvm/trunk/engines/scumm/player_v3a.h	2007-04-01 23:54:57 UTC (rev 26366)
+++ scummvm/trunk/engines/scumm/player_v3a.h	2007-04-02 01:45:28 UTC (rev 26367)
@@ -63,7 +63,8 @@
 	struct sfxChan {
 		int id;
 		int dur;
-		// SFX will eventually have pitch bends
+		uint32 rate;
+		int32 delta;
 	};
 
 	struct instData {


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