[Scummvm-cvs-logs] CVS: scummvm/saga music.cpp,1.7,1.8 music.h,1.2,1.3

Torbj?rn Andersson eriktorbjorn at users.sourceforge.net
Fri Apr 30 00:14:04 CEST 2004


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

Modified Files:
	music.cpp music.h 
Log Message:
Very experimental support for the separate MIDI files used by the Wyrmkeep
re-release of ITE.

Unfortunately I only know the mapping from resource number to file name for
the two tunes in the intro, and the second one causes ScummVM to crash so I
had to disable it.


Index: music.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/music.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- music.cpp	29 Apr 2004 13:45:10 -0000	1.7
+++ music.cpp	30 Apr 2004 07:13:26 -0000	1.8
@@ -31,6 +31,7 @@
 #include "sound/mididrv.h"                                                      
 #include "sound/midiparser.h"
 #include "common/config-manager.h"
+#include "common/file.h"
 
 namespace Saga {
 
@@ -105,7 +106,7 @@
 		_channelVolume[channel] = volume;
 		volume = volume * _masterVolume / 255;
 		b = (b & 0xFF00FFFF) | (volume << 16);
-	} else if ((b & 0xF0) == 0xC0 && !_nativeMT32) {
+	} else if ((b & 0xF0) == 0xC0 && !_isGM && !_nativeMT32) {
 		b = (b & 0xFFFF00FF) | mt32_to_gm[(b >> 8) & 0xFF] << 8;
 	} 
 	else if ((b & 0xFFF0) == 0x007BB0) {
@@ -159,30 +160,178 @@
 }
 
 int Music::play(ulong music_rn, uint flags) {
-    R_RSCFILE_CONTEXT *rsc_ctxt = NULL;
+	R_RSCFILE_CONTEXT *rsc_ctxt = NULL;
+	const char *midi_file = NULL;
 
-    uchar *resource_data;
-    size_t resource_size;
+	uchar *resource_data;
+	size_t resource_size;
 
 	if (!_musicInitialized) {
 		return R_FAILURE;
 	}
 
-    if (!_enabled) {
-        return R_SUCCESS;
-    }
+	if (!_enabled) {
+		return R_SUCCESS;
+	}
 
-    /* Load XMI resource data */
-    GAME_GetFileContext(&rsc_ctxt, R_GAME_RESOURCEFILE, 0);
+	// The Wyrmkeep release of Inherit The Earth uses external MIDI files
+
+	// FIXME: This mapping is incomplete
+
+	switch (music_rn) {
+#if 0
+	case XXX:
+		midi_file = "bcexpl";
+		break;
+	case XXX:
+		midi_file = "birdchrp";
+		break;
+	case XXX:
+		midi_file = "boargtnt";
+		break;
+	case XXX:
+		midi_file = "boarking";
+		break;
+	case XXX:
+		midi_file = "brutalmt";
+		break;
+	case XXX:
+		midi_file = "catfest";
+		break;
+#endif
+	case 9:
+		midi_file = "cave";
+		break;
+#if 0
+	case XXX:
+		midi_file = "damexplm";
+		break;
+	case XXX:
+		midi_file = "darkclaw";
+		break;
+	case XXX:
+		midi_file = "elkfanfare";
+		break;
+	case XXX:
+		midi_file = "elkhall";
+		break;
+	case XXX:
+		midi_file = "explorea";
+		break;
+	case XXX:
+		midi_file = "exploreb";
+		// Unfortunately, our MIDI parser won't handle the above file
+		midi_file = NULL;
+		break;
+	case XXX:
+		midi_file = "explorec";
+		// Unfortunately, our MIDI parser won't handle the above file
+		midi_file = NULL;
+		break;
+	case XXX:
+		midi_file = "fvillage";
+		break;
+	case XXX:
+		midi_file = "humruinm";
+		// Unfortunately, our MIDI parser won't handle the above file
+		midi_file = NULL;
+		break;
+#endif
+	case 10:
+		midi_file = "intro";
+		// Unfortunately, our MIDI parser won't handle the above file
+		midi_file = NULL;
+		break;
+#if 0
+	case XXX:
+		midi_file = "kitten";
+		break;
+	case XXX:
+		midi_file = "mouse";
+		break;
+	case XXX:
+		midi_file = "nitstrlm";
+		// Unfortunately, our MIDI parser won't handle the above file
+		midi_file = NULL;
+		break;
+	case XXX:
+		midi_file = "orbtempl";
+		// Unfortunately, our MIDI parser won't handle the above file
+		midi_file = NULL;
+		break;
+	case XXX:
+		midi_file = "reset";
+		// Unfortunately, our MIDI parser won't handle the above file,
+		// but I'm not sure we need it anyway
+		midi_file = NULL;
+		break;
+	case XXX:
+		midi_file = "shiala";
+		break;
+	case XXX:
+		midi_file = "spooky";
+		// Unfortunately, our MIDI parser won't handle the above file
+		midi_file = NULL;
+		break;
+	case XXX:
+		midi_file = "sunstatm";
+		// Unfortunately, our MIDI parser won't handle the above file
+		midi_file = NULL;
+		break;
+	case XXX:
+		midi_file = "sweet";
+		// Unfortunately, our MIDI parser won't handle the above file
+		midi_file = NULL;
+		break;
+	case XXX:
+		midi_file = "tychom";
+		// Unlike the other unhandled files, ScummVM won't crash on
+		// this one. But it won't play anything either.
+		midi_file = NULL;
+		break;
+#endif
+	default:
+		midi_file = NULL;
+		break;
+	}
+
+	File f_midi;
+	MidiParser *parser;
+
+	if (midi_file) {
+		char file_name[20];
+
+		sprintf(file_name, "music/%s.mid", midi_file);
+		if (!f_midi.open(file_name))
+			midi_file = NULL;
+	}
+
+	// FIXME: Is resource_data ever freed?
+
+	if (midi_file) {
+		debug(0, "Using external MIDI file: %s.mid", midi_file);
+		resource_size = f_midi.size();
+		resource_data = (uchar *) malloc(resource_size);
+		f_midi.read(resource_data, resource_size);
+		f_midi.close();
+
+		_player->setGM(true);
+		parser = MidiParser::createParser_SMF();
+	} else {
+		/* Load XMI resource data */
+		GAME_GetFileContext(&rsc_ctxt, R_GAME_RESOURCEFILE, 0);
         
-    if (RSC_LoadResource(rsc_ctxt, music_rn, &resource_data, 
-						 &resource_size) != R_SUCCESS ) {
-        R_printf(R_STDERR, "SYSMUSIC_Play(): Resource load failed: %ld",
-				 music_rn);
-        return R_FAILURE;
-    }
+		if (RSC_LoadResource(rsc_ctxt, music_rn, &resource_data, 
+				&resource_size) != R_SUCCESS ) {
+			R_printf(R_STDERR, "SYSMUSIC_Play(): Resource load failed: %ld",
+				music_rn);
+			return R_FAILURE;
+		}
+
+		_player->setGM(false);
+		parser = MidiParser::createParser_XMIDI();
+	}
 
-	MidiParser *parser = MidiParser::createParser_XMIDI();
 	if (!parser->loadMusic(resource_data, resource_size)) {
 		warning("Error reading track!");
 		delete parser;

Index: music.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/music.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- music.h	29 Apr 2004 05:13:18 -0000	1.2
+++ music.h	30 Apr 2004 07:13:26 -0000	1.3
@@ -54,6 +54,8 @@
 	void playMusic();
 	void stopMusic();
 	void setLoop(bool loop)		{ _looping = loop; }
+
+	void setGM(bool isGM)		{ _isGM = isGM; }
 	
 	//MidiDriver interface implementation
 	int open();
@@ -79,6 +81,7 @@
 	MidiDriver *_driver;
 	byte _channelVolume[16];
 	bool _nativeMT32;
+	bool _isGM;
 	
 	bool _isPlaying;
 	bool _looping;





More information about the Scummvm-git-logs mailing list