[Scummvm-cvs-logs] CVS: scummvm/saga ihnm_introproc.cpp,1.19,1.20 sndres.cpp,1.26,1.27 sndres.h,1.13,1.14

Torbjörn Andersson eriktorbjorn at users.sourceforge.net
Thu Nov 18 09:36:00 CET 2004


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

Modified Files:
	ihnm_introproc.cpp sndres.cpp sndres.h 
Log Message:
Partial support for WAV sound playback, which apparently will be needed for
IHNM support. I used the partial IHNM intro as my test case, and it seems
to work that far at least.


Index: ihnm_introproc.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/ihnm_introproc.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- ihnm_introproc.cpp	27 Oct 2004 21:32:27 -0000	1.19
+++ ihnm_introproc.cpp	18 Nov 2004 17:34:51 -0000	1.20
@@ -276,6 +276,14 @@
 
 		q_event = _vm->_events->queue(&event);
 
+		event.type = ONESHOT_EVENT;
+		event.code = VOICE_EVENT;
+		event.op = EVENT_PLAY;
+		event.param = 0;
+		event.time = 0;
+
+		q_event = _vm->_events->queue(&event);
+
 		_vm->_anim->setFlag(0, ANIM_LOOP);
 		_vm->_anim->play(0, 0);
 		break;

Index: sndres.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sndres.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- sndres.cpp	15 Nov 2004 03:03:48 -0000	1.26
+++ sndres.cpp	18 Nov 2004 17:34:54 -0000	1.27
@@ -156,6 +156,13 @@
 			return FAILURE;
 		}
 		break;
+	case GAME_SOUND_WAV:
+		result = loadWavSound(snd_res, snd_res_len, snd_buf_i);
+		RSC_FreeResource(snd_res);
+		if (result != SUCCESS) {
+			return FAILURE;
+		}
+		break;
 	default:
 		/* Unknown sound type */
 		RSC_FreeResource(snd_res);
@@ -250,6 +257,64 @@
 	return SUCCESS;
 }
 
+int SndRes::loadWavSound(byte *snd_res, size_t snd_res_len, SOUNDBUFFER *snd_buf_i) {
+	// TODO: This function should, perhaps, be made more robust.
+
+	MemoryReadStream readS(snd_res, snd_res_len);
+
+	byte buf[4];
+
+	readS.read(buf, sizeof(buf));
+	if (memcmp(buf, "RIFF", sizeof(buf)) != 0) {
+		return FAILURE;
+	}
+
+	readS.readUint32LE();
+
+	readS.read(buf, sizeof(buf));
+	if (memcmp(buf, "WAVE", sizeof(buf)) != 0) {
+		return FAILURE;
+	}
+
+	readS.read(buf, sizeof(buf));
+	if (memcmp(buf, "fmt ", sizeof(buf)) != 0) {
+		return FAILURE;
+	}
+
+	uint32 len = readS.readUint32LE();
+	uint32 pos = readS.pos();
+
+	readS.readUint16LE();
+
+	snd_buf_i->s_stereo = (readS.readUint16LE() == 2) ? 1 : 0;
+	snd_buf_i->s_freq = readS.readUint16LE();
+	snd_buf_i->s_samplebits = 16;
+	snd_buf_i->s_signed = 1;
+
+	readS.seek(pos + len);
+
+	for (;;) {
+		readS.read(buf, sizeof(buf));
+		if (memcmp(buf, "data", sizeof(buf)) == 0) {
+			break;
+		}
+
+		len = readS.readUint32LE();
+		readS.seek(len, SEEK_CUR);
+	}
+
+	snd_buf_i->s_buf_len = readS.readUint32LE();
+
+	byte *data = (byte *)malloc(snd_buf_i->s_buf_len);
+	if (!data) {
+		return FAILURE;
+	}
+
+	readS.read(data, snd_buf_i->s_buf_len);
+	snd_buf_i->s_buf = data;
+	return SUCCESS;
+}
+
 int SndRes::getVoiceLength(uint32 voice_rn) {
 	int res_type = _snd_info.res_type;
 	uint32 length = 0;
@@ -303,6 +368,9 @@
 		// Rough hack, fix this to be accurate
 		ms_f = (double)length / 14705 * 1000.0;
 		ms_i = (int)ms_f;
+	} else if (res_type == GAME_SOUND_WAV) {
+		// TODO!
+		return -1;
 	} else {
 		return -1;
 	}

Index: sndres.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sndres.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- sndres.h	15 Nov 2004 03:03:48 -0000	1.13
+++ sndres.h	18 Nov 2004 17:34:54 -0000	1.14
@@ -74,6 +74,7 @@
  private:
 	int load(RSCFILE_CONTEXT *snd_ctxt, uint32 snd_rn, SOUNDBUFFER *snd_buf_i);
 	int loadVocSound(byte *snd_res, size_t snd_res_len, SOUNDBUFFER *snd_buf_i);
+	int loadWavSound(byte *snd_res, size_t snd_res_len, SOUNDBUFFER *snd_buf_i);
 
 	int _init;
 





More information about the Scummvm-git-logs mailing list