[Scummvm-cvs-logs] CVS: scummvm/scumm intern.h,2.529.2.7,2.529.2.8 resource_v7he.cpp,1.46.2.3,1.46.2.4 script_v100he.cpp,2.173.2.4,2.173.2.5 script_v7he.cpp,2.166.2.5,2.166.2.6 script_v80he.cpp,2.125.2.2,2.125.2.3 script_v90he.cpp,2.281.2.4,2.281.2.5 scumm.cpp,1.603.2.31,1.603.2.32 scumm.h,1.647.2.11,1.647.2.12 sound.cpp,1.479.2.7,1.479.2.8 sound.h,1.92.2.2,1.92.2.3 sound_he.cpp,2.10.2.2,2.10.2.3 vars.cpp,1.150.2.6,1.150.2.7

kirben kirben at users.sourceforge.net
Mon Jan 16 01:55:04 CET 2006


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17006/scumm

Modified Files:
      Tag: branch-0-8-0
	intern.h resource_v7he.cpp script_v100he.cpp script_v7he.cpp 
	script_v80he.cpp script_v90he.cpp scumm.cpp scumm.h sound.cpp 
	sound.h sound_he.cpp vars.cpp 
Log Message:

Backport changes for sound system in HE games.



Index: intern.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/intern.h,v
retrieving revision 2.529.2.7
retrieving revision 2.529.2.8
diff -u -d -r2.529.2.7 -r2.529.2.8
--- intern.h	15 Jan 2006 09:56:24 -0000	2.529.2.7
+++ intern.h	16 Jan 2006 09:54:07 -0000	2.529.2.8
@@ -1075,7 +1075,7 @@
 
 	const OpcodeEntryV80he *_opcodesV80he;
 
-	int32 _heSBNGId;
+	int32 _heSndResId, _curSndId, _sndPtrOffs, _sndTmrOffs;
 
 public:
 	ScummEngine_v80he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16], int substResFileNameIndex);
@@ -1091,11 +1091,13 @@
 
 	virtual void clearDrawQueues();
 
+	void createSound(int snd1id, int snd2id);
+
 	void drawLine(int x1, int y1, int x, int unk1, int unk2, int type, int id);
 	void drawPixel(int x, int y, int flags);
 
 	/* HE version 80 script opcodes */
-	void o80_loadSBNG();
+	void o80_createSound();
 	void o80_getFileSize();
 	void o80_stringToInt();
 	void o80_getSoundVar();
@@ -1288,7 +1290,7 @@
 	void o100_resourceRoutines();
 	void o100_wizImageOps();
 	void o100_jumpToScript();
-	void o100_loadSBNG();
+	void o100_createSound();
 	void o100_dim2dim2Array();
 	void o100_paletteOps();
 	void o100_jumpToScriptUnk();

Index: resource_v7he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/resource_v7he.cpp,v
retrieving revision 1.46.2.3
retrieving revision 1.46.2.4
diff -u -d -r1.46.2.3 -r1.46.2.4
--- resource_v7he.cpp	29 Oct 2005 01:15:06 -0000	1.46.2.3
+++ resource_v7he.cpp	16 Jan 2006 09:54:07 -0000	1.46.2.4
@@ -1803,4 +1803,120 @@
 	return size;
 }
 
+void ScummEngine_v80he::createSound(int snd1id, int snd2id) {
+	debug(0, "createSound: snd1id %d snd2id %d", snd1id, snd2id);
+
+	byte *snd1Ptr, *snd2Ptr;
+	byte *sbng1Ptr, *sbng2Ptr;
+	byte *sdat1Ptr, *sdat2Ptr;
+	byte *src, *dst, *tmp;
+	int len, offs, size;
+	int sdat1size, sdat2size;
+
+	if (snd2id == -1) {
+		_sndPtrOffs = 0;
+		_sndTmrOffs = 0;
+		return;
+	}
+
+	if (snd1id != _curSndId) {
+		_curSndId = snd1id;
+		_sndPtrOffs = 0;
+		_sndTmrOffs = 0;
+	}
+
+	snd1Ptr = getResourceAddress(rtSound, snd1id);
+	assert(snd1Ptr);
+	snd2Ptr = getResourceAddress(rtSound, snd2id);
+	assert(snd2Ptr);
+
+	int i;
+	int chan = -1;
+	for (i = 0; i < ARRAYSIZE(_sound->_heChannel); i++) {
+		if (_sound->_heChannel[i].sound == snd1id)
+			chan =  i;
+	}
+
+	sbng1Ptr = heFindResource(MKID('SBNG'), snd1Ptr);
+	sbng2Ptr = heFindResource(MKID('SBNG'), snd2Ptr);
+
+	if (sbng1Ptr != NULL && sbng2Ptr != NULL) {
+		if (chan != -1 && _sound->_heChannel[chan].codeOffs > 0) {
+			int curOffs = _sound->_heChannel[chan].codeOffs;
+
+			src = snd1Ptr + curOffs;
+			dst = sbng1Ptr + 8;
+			size = READ_BE_UINT32(sbng1Ptr + 4);
+			len = sbng1Ptr - snd1Ptr + size - curOffs;
+
+			byte *data = (byte *)malloc(len);
+			memcpy(data, src, len);
+			memcpy(dst, data, len);
+			free(data);
+
+			dst = sbng1Ptr + 8;
+			while ((size = READ_LE_UINT16(dst)) != 0)
+				dst += size;
+		} else {
+			dst = sbng1Ptr + 8;
+		}
+
+		_sound->_heChannel[chan].codeOffs = sbng1Ptr - snd1Ptr + 8;
+
+		tmp = sbng2Ptr + 8;
+		while ((offs = READ_LE_UINT16(tmp)) != 0) {
+			tmp += offs;
+		}
+
+		src = sbng2Ptr + 8;
+		len = tmp - sbng2Ptr - 6;
+		memcpy(dst, src, len);
+
+		int32 time;
+		while ((size = READ_LE_UINT16(dst)) != 0) {
+			time = READ_LE_UINT32(dst + 2);
+			time += _sndTmrOffs;
+			WRITE_LE_UINT32(dst + 2, time);
+			dst += size;
+		}
+	}
+
+	sdat1Ptr = heFindResource(MKID('SDAT'), snd1Ptr);
+	assert(sdat1Ptr);
+	sdat2Ptr = heFindResource(MKID('SDAT'), snd2Ptr);
+	assert(sdat2Ptr);
+
+	sdat1size = READ_BE_UINT32(sdat1Ptr + 4) - 8 - _sndPtrOffs;
+	sdat2size = READ_BE_UINT32(sdat2Ptr + 4) - 8;
+
+	debug(0, "SDAT size1 %d size2 %d", sdat1size, sdat2size);
+	if (sdat2size < sdat1size) {
+		src = sdat2Ptr + 8;
+		dst = sdat1Ptr + 8 + _sndPtrOffs;
+		len = sdat2size;
+		
+		memcpy(dst, src, len);
+
+		_sndPtrOffs += sdat2size;
+		_sndTmrOffs += sdat2size;
+	} else {
+		src = sdat2Ptr + 8;
+		dst = sdat1Ptr + 8 + _sndPtrOffs;
+		len = sdat1size;
+		
+		memcpy(dst, src, len);
+
+		if (sdat2size != sdat1size) {
+			src = sdat2Ptr + 8 + sdat1size;
+			dst = sdat1Ptr + 8;
+			len = sdat2size - sdat1size;
+		
+			memcpy(dst, src, len);
+		}
+
+		_sndPtrOffs = sdat2size - sdat1size;
+		_sndTmrOffs += sdat2size;
+	}
+}
+
 } // End of namespace Scumm

Index: script_v100he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v100he.cpp,v
retrieving revision 2.173.2.4
retrieving revision 2.173.2.5
diff -u -d -r2.173.2.4 -r2.173.2.5
--- script_v100he.cpp	15 Jan 2006 06:45:15 -0000	2.173.2.4
+++ script_v100he.cpp	16 Jan 2006 09:54:07 -0000	2.173.2.5
@@ -67,7 +67,7 @@
 		OPCODE(o6_loadRoomWithEgo),
 		OPCODE(o6_invalid),
 		OPCODE(o72_setFilePath),
-		OPCODE(o100_loadSBNG),
+		OPCODE(o100_createSound),
 		/* 18 */
 		OPCODE(o6_cutscene),
 		OPCODE(o6_pop),
@@ -707,28 +707,25 @@
 	runScript(script, (flags == 128 || flags == 129), (flags == 130 || flags == 129), args);
 }
 
-void ScummEngine_v100he::o100_loadSBNG() {
-	// Loads SBNG sound resource
+void ScummEngine_v100he::o100_createSound() {
 	byte subOp = fetchScriptByte();
 
 	switch (subOp) {
 	case 0:
-		_heSBNGId = pop();
+		_heSndResId = pop();
 		break;
 	case 53:
-		//loadSBNG(_heSBNGId, -1);
+		createSound(_heSndResId, -1);
 		break;
 	case 92:
 		// dummy case
 		break;
 	case 128:
-		//loadSBNG(_heSBNGId, pop();
-		pop();
+		createSound(_heSndResId, pop());
 		break;
 	default:
-		error("o100_loadSBNG: default case %d", subOp);
+		error("o100_createSound: default case %d", subOp);
 	}
-	debug(1,"o100_loadSBNG stub (%d)",subOp);
 }
 
 void ScummEngine_v100he::o100_dim2dimArray() {
@@ -1669,7 +1666,7 @@
 		_heSndSoundId = pop();
 		_heSndOffset = 0;
 		_heSndSoundFreq = 11025;
-		_heSndChannel = VAR(VAR_MUSIC_CHANNEL);
+		_heSndChannel = VAR(VAR_SOUND_CHANNEL);
 		_heSndFlags = 0;
 		break;
 	case 133:

Index: script_v7he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v7he.cpp,v
retrieving revision 2.166.2.5
retrieving revision 2.166.2.6
diff -u -d -r2.166.2.5 -r2.166.2.6
--- script_v7he.cpp	15 Jan 2006 06:45:15 -0000	2.166.2.5
+++ script_v7he.cpp	16 Jan 2006 09:54:07 -0000	2.166.2.6
@@ -463,7 +463,7 @@
 		_heSndSoundId = pop();
 		_heSndOffset = 0;
 		_heSndSoundFreq = 11025;
-		_heSndChannel = VAR(VAR_MUSIC_CHANNEL);
+		_heSndChannel = VAR(VAR_SOUND_CHANNEL);
 		break;
 	case 245:
 		_heSndFlags |= 1;

Index: script_v80he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v80he.cpp,v
retrieving revision 2.125.2.2
retrieving revision 2.125.2.3
diff -u -d -r2.125.2.2 -r2.125.2.3
--- script_v80he.cpp	15 Jan 2006 06:45:15 -0000	2.125.2.2
+++ script_v80he.cpp	16 Jan 2006 09:54:07 -0000	2.125.2.3
@@ -129,7 +129,7 @@
 		OPCODE(o6_writeWordVar),
 		/* 44 */
 		OPCODE(o6_invalid),
-		OPCODE(o80_loadSBNG),
+		OPCODE(o80_createSound),
 		OPCODE(o80_getFileSize),
 		OPCODE(o6_wordArrayWrite),
 		/* 48 */
@@ -376,28 +376,25 @@
 	return _opcodesV80he[i].desc;
 }
 
-void ScummEngine_v80he::o80_loadSBNG() {
-	// Loads SBNG sound resource
+void ScummEngine_v80he::o80_createSound() {
 	byte subOp = fetchScriptByte();
 
 	switch (subOp) {
 	case 27:
-		//loadSBNG(_heSBNGId, pop();
-		pop();
+		createSound(_heSndResId, pop());
 		break;
 	case 217:
-		//loadSBNG(_heSBNGId, -1);
+		createSound(_heSndResId, -1);
 		break;
 	case 232:
-		_heSBNGId = pop();
+		_heSndResId = pop();
 		break;
 	case 255:
 		// dummy case
 		break;
 	default:
-		error("o80_loadSBNG: default case %d", subOp);
+		error("o80_createSound: default case %d", subOp);
 	}
-	debug(1,"o80_loadSBNG stub (%d)",subOp);
 }
 
 void ScummEngine_v80he::o80_getFileSize() {

Index: script_v90he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/script_v90he.cpp,v
retrieving revision 2.281.2.4
retrieving revision 2.281.2.5
diff -u -d -r2.281.2.4 -r2.281.2.5
--- script_v90he.cpp	15 Jan 2006 06:45:15 -0000	2.281.2.4
+++ script_v90he.cpp	16 Jan 2006 09:54:07 -0000	2.281.2.5
@@ -126,7 +126,7 @@
 		OPCODE(o6_writeWordVar),
 		/* 44 */
 		OPCODE(o90_getObjectData),
-		OPCODE(o80_loadSBNG),
+		OPCODE(o80_createSound),
 		OPCODE(o80_getFileSize),
 		OPCODE(o6_wordArrayWrite),
 		/* 48 */

Index: scumm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.cpp,v
retrieving revision 1.603.2.31
retrieving revision 1.603.2.32
diff -u -d -r1.603.2.31 -r1.603.2.32
--- scumm.cpp	15 Jan 2006 09:56:25 -0000	1.603.2.31
+++ scumm.cpp	16 Jan 2006 09:54:07 -0000	1.603.2.32
@@ -1346,10 +1346,10 @@
 	VAR_REDRAW_ALL_ACTORS = 0xFF;
 	VAR_SKIP_RESET_TALK_ACTOR = 0xFF;
 
-	VAR_MUSIC_CHANNEL = 0xFF;
 	VAR_SOUND_CHANNEL = 0xFF;
+	VAR_TALK_CHANNEL = 0xFF;
 	VAR_SOUNDCODE_TMR = 0xFF;
-	VAR_DEFAULT_SOUND_CHANNEL = 0xFF;
+	VAR_RESERVED_SOUND_CHANNELS = 0xFF;
 
 	VAR_MAIN_SCRIPT = 0xFF;
 
@@ -1619,7 +1619,10 @@
 
 ScummEngine_v80he::ScummEngine_v80he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16], int substResFileNameIndex)
 	: ScummEngine_v72he(detector, syst, gs, md5sum, substResFileNameIndex) {
-	_heSBNGId = 0;
+	_heSndResId = 0;
+	_curSndId = 0;
+	_sndPtrOffs = 0;
+	_sndTmrOffs = 0;
 }
 
 ScummEngine_v90he::ScummEngine_v90he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16], int substResFileNameIndex)

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.647.2.11
retrieving revision 1.647.2.12
diff -u -d -r1.647.2.11 -r1.647.2.12
--- scumm.h	15 Jan 2006 06:45:15 -0000	1.647.2.11
+++ scumm.h	16 Jan 2006 09:54:07 -0000	1.647.2.12
@@ -1329,10 +1329,10 @@
 	byte VAR_REDRAW_ALL_ACTORS;
 	byte VAR_SKIP_RESET_TALK_ACTOR;
 
-	byte VAR_MUSIC_CHANNEL;
 	byte VAR_SOUND_CHANNEL;
+	byte VAR_TALK_CHANNEL;
 	byte VAR_SOUNDCODE_TMR;
-	byte VAR_DEFAULT_SOUND_CHANNEL;
+	byte VAR_RESERVED_SOUND_CHANNELS;
 
 	byte VAR_MAIN_SCRIPT;
 

Index: sound.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/sound.cpp,v
retrieving revision 1.479.2.7
retrieving revision 1.479.2.8
diff -u -d -r1.479.2.7 -r1.479.2.8
--- sound.cpp	15 Jan 2006 06:45:15 -0000	1.479.2.7
+++ sound.cpp	16 Jan 2006 09:54:07 -0000	1.479.2.8
@@ -111,7 +111,7 @@
 	if (_vm->_heversion >= 60 && _soundQue2Pos) {
 		int i = _soundQue2Pos;
 		while (i--) {
-			if (_soundQue2[i].sound == sound)
+			if (_soundQue2[i].sound == sound && !(heFlags & 2))
 				return;
 		}
 	}
@@ -697,7 +697,6 @@
 	return val;
 }
 
-
 int Sound::isSoundRunning(int sound) const {
 #ifndef DISABLE_SCUMM_7_8
 	if (_vm->_imuseDigital)

Index: sound.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/sound.h,v
retrieving revision 1.92.2.2
retrieving revision 1.92.2.3
diff -u -d -r1.92.2.2 -r1.92.2.3
--- sound.h	15 Jan 2006 06:45:15 -0000	1.92.2.2
+++ sound.h	16 Jan 2006 09:54:07 -0000	1.92.2.3
@@ -94,13 +94,14 @@
 	HEMusic *_heMusic;
 	int16 _heMusicTracks;
 
+public: // Used by createSound()
 	struct {
 		int sound;
 		int codeOffs;
 		int priority;
 		int sbngBlock;
 		int soundVars[27];
-	} _heChannel[9];
+	} _heChannel[8];
 
 public:
 	Audio::SoundHandle _talkChannelHandle;	// Handle of mixer channel actor is talking on
@@ -141,6 +142,7 @@
 
 	// HE specific
 	bool getHEMusicDetails(int id, int &musicOffs, int &musicSize);
+	int findFreeSoundChannel();
 	int isSoundCodeUsed(int sound);
 	int getSoundPos(int sound);
 	int getSoundVar(int sound, int var);

Index: sound_he.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/sound_he.cpp,v
retrieving revision 2.10.2.2
retrieving revision 2.10.2.3
diff -u -d -r2.10.2.2 -r2.10.2.3
--- sound_he.cpp	15 Jan 2006 06:49:47 -0000	2.10.2.2
+++ sound_he.cpp	16 Jan 2006 09:54:07 -0000	2.10.2.3
@@ -43,6 +43,27 @@
 
 namespace Scumm {
 
+int Sound::findFreeSoundChannel() {
+	int chan, min;
+
+	min = _vm->VAR(_vm->VAR_RESERVED_SOUND_CHANNELS);
+	if (min == 0) {
+		_vm->VAR(_vm->VAR_RESERVED_SOUND_CHANNELS) = 8;
+		return 1;
+	}
+
+	if (min < 8) {
+		for (chan = min; min < ARRAYSIZE(_heChannel); chan++) {
+			if (_vm->_mixer->isSoundHandleActive(_heSoundChannels[chan]) == 0)
+				return chan;
+		}
+	} else {
+		return 1;
+	}
+
+	return min;
+}
+
 int Sound::isSoundCodeUsed(int sound) {
 	int chan = -1;
 	for (int i = 0; i < ARRAYSIZE(_heChannel); i ++) {
@@ -86,7 +107,7 @@
 	}
 
 	if (chan != -1) {
-		debug(0, "getSoundVar: sound %d var %d result %d", sound, var, _heChannel[chan].soundVars[var]);
+		debug(1, "getSoundVar: sound %d var %d result %d", sound, var, _heChannel[chan].soundVars[var]);
 		return _heChannel[chan].soundVars[var];
 	} else {
 		return 0;
@@ -103,7 +124,7 @@
 	}
 
 	if (chan != -1) {
-		debug(0, "setSoundVar: sound %d var %d val %d", sound, var, val);
+		debug(1, "setSoundVar: sound %d var %d val %d", sound, var, val);
 		_heChannel[chan].soundVars[var] = val;
 	}
 }
@@ -242,14 +263,18 @@
 		case 48: // Add
 			var = READ_LE_UINT16(codePtr); codePtr += 2;;
 			val = READ_LE_UINT16(codePtr); codePtr += 2;;
-
+			if (edi == 2) {
+				val = getSoundVar(sound, val);
+			}
 			val = getSoundVar(sound, var) + val;
 			setSoundVar(sound, var, val);
 			break;
 		case 56: // Subtract
 			var = READ_LE_UINT16(codePtr); codePtr += 2;;
 			val = READ_LE_UINT16(codePtr); codePtr += 2;;
-
+			if (edi == 2) {
+				val = getSoundVar(sound, val);
+			}
 			val = getSoundVar(sound, var) - val;
 			setSoundVar(sound, var, val);
 			break;
@@ -259,7 +284,6 @@
 			if (edi == 2) {
 				val = getSoundVar(sound, val);
 			}
-
 			val = getSoundVar(sound, var) * val;
 			setSoundVar(sound, var, val);
 			break;
@@ -269,7 +293,6 @@
 			if (edi == 2) {
 				val = getSoundVar(sound, val);
 			}
-
 			val = getSoundVar(sound, var) / val;
 			setSoundVar(sound, var, val);
 			break;
@@ -290,27 +313,23 @@
 }
 
 void Sound::playHESound(int soundID, int heOffset, int heChannel, int heFlags) {
-	debug(0,"playHESound: soundID %d heOffset %d heChannel %d heFlags %d", soundID, heOffset, heChannel, heFlags);
 	byte *ptr, *spoolPtr;
 	char *sound;
 	int size = -1;
-	int rate;
+	int priority, rate;
 	byte flags = Audio::Mixer::FLAG_UNSIGNED | Audio::Mixer::FLAG_AUTOFREE;
 
-	if (heChannel == -1) {
-		if (_vm->_heversion >= 95 && _vm->VAR(_vm->VAR_DEFAULT_SOUND_CHANNEL) != 0) {
-			heChannel = _vm->VAR(_vm->VAR_DEFAULT_SOUND_CHANNEL);
-		} else {
-			heChannel = 1;
-		}
+	if (heChannel == -1)
+		heChannel = (_vm->VAR_RESERVED_SOUND_CHANNELS != 0xFF) ? findFreeSoundChannel() : 1;
+
+	debug(0,"playHESound: soundID %d heOffset %d heChannel %d heFlags %d", soundID, heOffset, heChannel, heFlags);
+
+	if (soundID >= 10000) {
+		// Special codes, used in pjgames
+		return;
 	}
 
 	if (soundID > _vm->_numSounds) {
-		if (soundID >= 10000) {
-			// Special codes, used in pjgames
-			return;
-		}
-
 		int music_offs;
 		char buf[32], buf1[128];
 		Common::File musicFile;
@@ -342,9 +361,8 @@
 		}
 		musicFile.close();
 
-		_vm->_mixer->stopID(_currentMusic);
-		_currentMusic = soundID;
 		if (_vm->_heversion == 70) {
+			_vm->_mixer->stopHandle(_heSoundChannels[heChannel]);
 			_vm->_mixer->playRaw(&_heSoundChannels[heChannel], spoolPtr, size, 11025, flags, soundID);
 			return;
 		}
@@ -360,10 +378,19 @@
 		return;
 	}
 
+	// TODO: Extra sound flags
+	if (heFlags & 1) {
+		flags |= Audio::Mixer::FLAG_LOOP;
+	}
+
 	// Support for sound in later Backyard sports games
-	if (READ_UINT32(ptr) == MKID('RIFF')) {
+	if (READ_UINT32(ptr) == MKID('RIFF') || READ_UINT32(ptr) == MKID('WSOU')) {
 		uint16 type;
 		int blockAlign;
+
+		if (READ_UINT32(ptr) == MKID('WSOU'))
+			ptr += 8;
+
 		size = READ_LE_UINT32(ptr + 4);
 		Common::MemoryReadStream stream(ptr, size);
 
@@ -382,17 +409,25 @@
 			sound = (char *)malloc(size);
 			memcpy(sound, ptr + stream.pos(), size);
 		}
+		_vm->_mixer->stopHandle(_heSoundChannels[heChannel]);
 		_vm->_mixer->playRaw(&_heSoundChannels[heChannel], sound, size, rate, flags, soundID);
 	}
 	// Support for sound in Humongous Entertainment games
 	else if (READ_UINT32(ptr) == MKID('DIGI') || READ_UINT32(ptr) == MKID('TALK')) {
 		byte *sndPtr = ptr;
-		int priority;
 
 		priority = *(ptr + 18);
 		rate = READ_LE_UINT16(ptr + 22);
 		ptr += 8 + READ_BE_UINT32(ptr + 12);
 
+		if (_vm->_mixer->isSoundHandleActive(_heSoundChannels[heChannel])) {
+			int curSnd = _heChannel[heChannel].sound;
+			if (curSnd == 1 && soundID != 1)
+				return;
+			if (curSnd != 0 && curSnd != 1 && soundID != 1 && _heChannel[heChannel].priority > priority)
+				return;
+		}
+
 		int codeOffs = -1;
 		if (READ_UINT32(ptr) == MKID('SBNG')) {
 			codeOffs = ptr - sndPtr + 8;
@@ -414,14 +449,10 @@
 			_overrideFreq = 0;
 		}
 
-		// TODO
-		if (heFlags & 1) {
-			//flags |= Audio::Mixer::FLAG_LOOP;
-		}
-
 		// Allocate a sound buffer, copy the data into it, and play
 		sound = (char *)malloc(size);
 		memcpy(sound, ptr + heOffset + 8, size);
+		_vm->_mixer->stopHandle(_heSoundChannels[heChannel]);
 		_vm->_mixer->playRaw(&_heSoundChannels[heChannel], sound, size, rate, flags, soundID);
 
 		_vm->setHETimer(heChannel + 4);
@@ -433,12 +464,13 @@
 	}
 	// Support for PCM music in 3DO versions of Humongous Entertainment games
 	else if (READ_UINT32(ptr) == MKID('MRAW')) {
+		priority = *(ptr + 18);
+		rate = READ_LE_UINT16(ptr + 22);
 		ptr += 8 + READ_BE_UINT32(ptr+12);
-		if (READ_UINT32(ptr) != MKID('SDAT'))
-			return;
 
+		assert(READ_UINT32(ptr) == MKID('SDAT'));
 		size = READ_BE_UINT32(ptr+4) - 8;
-		rate = 22050;
+
 		flags = Audio::Mixer::FLAG_AUTOFREE;
 
 		// Allocate a sound buffer, copy the data into it, and play
@@ -478,7 +510,7 @@
 	ptr = _vm->getResourceAddress(rtSound, 1);
 	_sfxFile->read(ptr, size);
 
-	int channel = (_vm->VAR_SOUND_CHANNEL != 0xFF) ? _vm->VAR(_vm->VAR_SOUND_CHANNEL) : 0;
+	int channel = (_vm->VAR_TALK_CHANNEL != 0xFF) ? _vm->VAR(_vm->VAR_TALK_CHANNEL) : 0;
 	addSoundToQueue2(1, 0, channel, 0);
 }
 

Index: vars.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/vars.cpp,v
retrieving revision 1.150.2.6
retrieving revision 1.150.2.7
diff -u -d -r1.150.2.6 -r1.150.2.7
--- vars.cpp	15 Jan 2006 09:56:25 -0000	1.150.2.6
+++ vars.cpp	16 Jan 2006 09:54:08 -0000	1.150.2.7
@@ -215,8 +215,8 @@
 	VAR_MUSIC_TIMER = 0xFF;
 
 	VAR_NUM_SOUND_CHANNELS = 9;
-	VAR_SOUND_CHANNEL = 10;
-	VAR_MUSIC_CHANNEL = 14;
+	VAR_TALK_CHANNEL = 10;
+	VAR_SOUND_CHANNEL = 14;
 }
 
 void ScummEngine_v72he::setupScummVars() {
@@ -267,8 +267,8 @@
 	VAR_CHARINC = 48;
 	VAR_TALK_ACTOR = 49;
 	VAR_LAST_SOUND = 50;
-	VAR_SOUND_CHANNEL = 51;
-	VAR_MUSIC_CHANNEL = 52;
+	VAR_TALK_CHANNEL = 51;
+	VAR_SOUND_CHANNEL = 52;
 
 	VAR_MEMORY_PERFORMANCE = 57;
 	VAR_VIDEO_PERFORMANCE = 58;
@@ -313,7 +313,7 @@
 		VAR_U32_VERSION = 107;
 		VAR_U32_ARRAY_UNK = 116;
 		VAR_WIZ_TCOLOR = 117;
-		VAR_DEFAULT_SOUND_CHANNEL = 120;
+		VAR_RESERVED_SOUND_CHANNELS = 120;
 	}
 	if (_heversion >= 98) {
 		VAR_SKIP_RESET_TALK_ACTOR = 125;
@@ -580,8 +580,8 @@
 		VAR(VAR_MACHINE_SPEED) = 13;
 
 	VAR(VAR_NUM_SOUND_CHANNELS) = 8;
-	VAR(VAR_MUSIC_CHANNEL) = 1;
-	VAR(VAR_SOUND_CHANNEL) = 2;
+	VAR(VAR_SOUND_CHANNEL) = 1;
+	VAR(VAR_TALK_CHANNEL) = 2;
 }
 
 void ScummEngine_v72he::initScummVars() {





More information about the Scummvm-git-logs mailing list