[Scummvm-cvs-logs] CVS: scummvm/scumm/smush channel.h,1.6,1.7 imuse_channel.cpp,1.9,1.10 player.cpp,1.14,1.15

Pawe? Ko?odziejski aquadran at users.sourceforge.net
Sat Sep 21 02:22:02 CEST 2002


Update of /cvsroot/scummvm/scummvm/scumm/smush
In directory usw-pr-cvs1:/tmp/cvs-serv26312

Modified Files:
	channel.h imuse_channel.cpp player.cpp 
Log Message:
added support for sound volume for smush samples(IACT) in the dig (propably bad)

Index: channel.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/smush/channel.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- channel.h	18 Sep 2002 08:06:14 -0000	1.6
+++ channel.h	21 Sep 2002 09:21:50 -0000	1.7
@@ -122,6 +122,7 @@
 	int32 _frequency;			//!< the target frequency of the ::mixer
 	int32 _dataSize;			//!< remaining size of sound data in the iMUS buffer
 	bool _inData;
+	int32 _volume;
 
 	int32 _bitsize;			//!< the bitsize of the original data
 	int32 _rate;				//!< the sampling rate of the original data
@@ -142,13 +143,13 @@
 	ImuseChannel(int32 track, int32 freq);
 	virtual ~ImuseChannel();
 	bool isTerminated() const;
-	bool setParameters(int32 nbframes, int32 size, int32 unk1, int32 unk2);
-	bool checkParameters(int32 index, int32 nbframes, int32 size, int32 unk1, int32 unk2);
+	bool setParameters(int32 nbframes, int32 size, int32 track_flags, int32 unk1);
+	bool checkParameters(int32 index, int32 nbframes, int32 size, int32 track_flags, int32 unk1);
 	bool appendData(Chunk & b, int32 size);
 	int32 availableSoundData() const;
 	void getSoundData(int16 * sound_buffer, int32 size);
 	void getSoundData(int8 * sound_buffer, int32 size);
-	int32 getRate() { return _rate; }
+	int32 getRate() { return _rate; }
 	bool getParameters(int32 &rate, bool &stereo, bool &is_16bit) {
 		rate = _frequency;
 		stereo = (_channels == 2);

Index: imuse_channel.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/smush/imuse_channel.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- imuse_channel.cpp	18 Sep 2002 08:38:29 -0000	1.9
+++ imuse_channel.cpp	21 Sep 2002 09:21:50 -0000	1.10
@@ -52,11 +52,23 @@
 	return (_dataSize <= 0 && _sbuffer == 0);
 }
 
-bool ImuseChannel::setParameters(int32 nbframes, int32 size, int32 unk1, int32 unk2) {
+bool ImuseChannel::setParameters(int32 nb, int32 size, int32 flags, int32 unk1) {
+	// flags: 0 - 8 bits
+	// values:
+	// 1 - Voice
+	// 2 - Background music
+	// 0, 3-511 - SFX and volume
+	// FIXME: this should be better
+	if ((flags != 1) && (flags != 2) && ((flags >> 2) != 0)) {
+		_volume = 300 - ((flags >> 3) << 2);
+	}
+	else {
+		_volume = 127;
+	}
 	return true;
 }
 
-bool ImuseChannel::checkParameters(int32 index, int32 nbframes, int32 size, int32 unk1, int32 unk2) {
+bool ImuseChannel::checkParameters(int32 index, int32 nbframes, int32 size, int32 track_flags, int32 unk1) {
 	return true;
 }
 
@@ -171,18 +183,21 @@
 	}
 	int loop_size = _sbufferSize / 3;
 	int new_size = loop_size * 2;
-	short * keep, * decoded;
-	keep = decoded = new int16[new_size];
+	byte * keep, * decoded;
+	uint32 value;
+	keep = decoded = new byte[new_size * 2];
 	assert(keep);
 	unsigned char * source = _sbuffer;
-	while(loop_size--) {
-		int v1 =  *source++;
-		int v2 =  *source++;
-		int v3 =  *source++;
-		int value = (((v2 & 0x0f) << 12) | (v1 << 4)) - 0x8000;
-		*decoded++ = (int16)value;
-		value = (((v2 & 0xf0) << 8) | (v3 << 4)) - 0x8000;		
-		*decoded++ = (int16)value;
+		while(loop_size--) {
+		byte v1 =  *source++;
+		byte v2 =  *source++;
+		byte v3 =  *source++;
+		value = ((((v2 & 0x0f) << 8) | v1) << 4) - 0x8000;
+		*decoded++ = (byte)((value >> 8) & 0xff);
+		*decoded++ = (byte)(value & 0xff);
+		value = ((((v2 & 0xf0) << 4) | v3) << 4) - 0x8000;
+		*decoded++ = (byte)((value >> 8) & 0xff);
+		*decoded++ = (byte)(value & 0xff);
 	}
 	delete []_sbuffer;
 	_sbuffer = (byte *)keep;
@@ -306,14 +321,25 @@
 void ImuseChannel::getSoundData(int16 * snd, int32 size) {
 	if(_dataSize <= 0 || _bitsize <= 8) error("invalid call to imuse_channel::read_sound_data()");
 	if(_channels == 2) size *= 2;
+	byte * buf = (byte*)snd;
 	if(_rate == 11025) {
 		for(int32 i = 0; i < size; i++) {
-			snd[i * 2] = READ_BE_UINT16(_sbuffer + 2 * i);
-			snd[i * 2 + 1] = snd[i * 2];
+			byte sample1 = *(_sbuffer + i * 2);
+			byte sample2 = *(_sbuffer + i * 2 + 1);
+			uint16 sample = (uint16)(((int16)((sample1 << 8) | sample2) * _volume) >> 8);
+			buf[i * 4 + 0] = (byte)(sample >> 8);
+			buf[i * 4 + 1] = (byte)(sample & 0xff);
+			buf[i * 4 + 2] = buf[i * 4 + 0];
+			buf[i * 4 + 3] = buf[i * 4 + 1];
 		}
 	} else {
-		for(int32 i = 0; i < size; i++)
-			snd[i] = READ_BE_UINT16(_sbuffer + 2 * i);
+		for(int32 i = 0; i < size; i++){
+			byte sample1 = *(_sbuffer + i * 2);
+			byte sample2 = *(_sbuffer + i * 2 + 1);
+			uint16 sample = (uint16)(((int16)((sample1 << 8) | sample2) * _volume) >> 8);
+			buf[i * 2 + 0] = (byte)(sample >> 8);
+			buf[i * 2 + 1] = (byte)(sample & 0xff);
+		}
 	}
 	delete []_sbuffer;
 	assert(_sbufferSize == 2 * size);
@@ -327,12 +353,13 @@
 	if(_channels == 2) size *= 2;
 	if(_rate == 11025) {
 		for(int32 i = 0; i < size; i++) {
-			snd[i * 2] = _sbuffer[i];
-			snd[i * 2 + 1] = _sbuffer[i];
+			snd[i * 2] = (int8)(((int8)(_sbuffer[i] ^ 0x80) * _volume) >> 8) ^ 0x80;
+			snd[i * 2 + 1] = snd[i * 2];
 		}
 	} else {
-		for(int32 i = 0; i < size; i++)
-			snd[i] = _sbuffer[i];
+		for(int32 i = 0; i < size; i++){
+			snd[i] = (int8)(((int8)(_sbuffer[i] ^ 0x80) * _volume) >> 8) ^ 0x80;
+		}
 	}
 	delete []_sbuffer;
 	_sbuffer = 0;

Index: player.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/smush/player.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- player.cpp	20 Sep 2002 05:46:03 -0000	1.14
+++ player.cpp	21 Sep 2002 09:21:50 -0000	1.15
@@ -291,28 +291,28 @@
 	debug(6, "SmushPlayer::handleFetch()");
 }
 
-void SmushPlayer::handleImuseBuffer(int32 track_id, int32 index, int32 nbframes, int32 size, int32 unk1, int32 unk2, Chunk & b, int32 bsize) {
-	_Channel * c = _mixer->findChannel(track_id);
+void SmushPlayer::handleImuseBuffer(int32 track_id, int32 index, int32 nbframes, int32 size, int32 unk1, int32 track_flags, Chunk & b, int32 bsize) {
+	int32 track = (track_flags << 16) | track_id;
+	_Channel * c = _mixer->findChannel(track);
 	if(c == 0) {
-		c = new ImuseChannel(track_id, _soundFrequency);
+		c = new ImuseChannel(track, _soundFrequency);
 		_mixer->addChannel(c);
 	}
 	if(index == 0)
-		c->setParameters(nbframes, size, unk1, unk2);
+		c->setParameters(nbframes, size, track_flags, unk1);
 	else
-		c->checkParameters(index, nbframes, size, unk1, unk2);
+		c->checkParameters(index, nbframes, size, track_flags, unk1);
 	c->appendData(b, bsize);
 }
 
-void SmushPlayer::handleImuseAction8(Chunk & b, int32 flags, int32 unknown, int32 track_id) {
+void SmushPlayer::handleImuseAction8(Chunk & b, int32 flags, int32 unknown, int32 track_flags) {
 	assert(flags == 46 && unknown == 0);
-	int32 unknown2 = b.getWord();
-	track_id |= unknown2 << 16;
+	int32 track_id = b.getWord();
 	int32 index = b.getWord();
 	int32 nbframes = b.getWord();
 	int32 size = b.getDword();
 	int32 bsize = b.getSize() - 18;
-	handleImuseBuffer(track_id, index, nbframes, size, unknown, unknown2, b, bsize);
+	handleImuseBuffer(track_id, index, nbframes, size, unknown, track_flags, b, bsize);
 }
 
 void SmushPlayer::handleImuseAction(Chunk & b) {
@@ -322,17 +322,17 @@
 	int32 code = b.getWord();
 	int32 flags = b.getWord();
 	int32 unknown = b.getShort();
-	int32 track_id = b.getWord();
+	int32 track_flags = b.getWord();
 #ifdef DEBUG
-	debug(5, "handleImuseAction(%d, %d, %d, %d)", code, flags, unknown, track_id);
+	debug(5, "handleImuseAction(%d, %d, %d, %d)", code, flags, unknown, track_flags);
 #endif
 	switch(code) {
 		case 8:
-			handleImuseAction8(b, flags, unknown, track_id);
+			handleImuseAction8(b, flags, unknown, track_flags);
 			break;
 #ifdef DEBUG
 		default: {
-				debug(9, "%5.5d %d %8.8d %4.4d", track_id, flags, unknown);
+				debug(9, "%5.5d %d %8.8d %4.4d", track_flags, flags, unknown);
 			}
 #endif
 	}





More information about the Scummvm-git-logs mailing list