[Scummvm-cvs-logs] CVS: scummvm/queen music.cpp,1.9,1.10 music.h,1.6,1.7 musicdata.cpp,1.3,1.4 sound.cpp,1.31,1.32 sound.h,1.14,1.15

Joost Peters joostp at sc8-pr-cvs1.sourceforge.net
Thu Jan 22 15:13:02 CET 2004


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

Modified Files:
	music.cpp music.h musicdata.cpp sound.cpp sound.h 
Log Message:
- Some refactoring/clean-up.
- Handle special music types (> 1000)
- Implemented random looping (untested)


Index: music.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/music.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- music.cpp	20 Jan 2004 12:44:00 -0000	1.9
+++ music.cpp	22 Jan 2004 23:09:38 -0000	1.10
@@ -23,12 +23,13 @@
 #include "queen/music.h"
 #include "queen/queen.h"
 #include "queen/resource.h"
+#include "queen/sound.h"
 
 #include "sound/midiparser.h"
 
 namespace Queen {
 
-	MusicPlayer::MusicPlayer(MidiDriver *driver, byte *data, uint32 size) : _driver(driver), _isPlaying(false), _looping(false), _volume(255), _queuePos(0), _musicData(data), _musicDataSize(size) {
+	MusicPlayer::MusicPlayer(MidiDriver *driver, byte *data, uint32 size) : _driver(driver), _isPlaying(false), _looping(false), _randomLoop(false), _volume(255), _queuePos(0), _musicData(data), _musicDataSize(size) {
 		memset(_channel, 0, sizeof(_channel));
 		queueClear();
 		_lastSong = 0;
@@ -55,7 +56,12 @@
 		
 		if (!emptySlots)
 			return false;
-			
+		
+		// Work around bug in Roland music, note that these numbers are 'one-off'
+		// from the original code
+		if (/*isRoland && */ songNum == 88 || songNum == 89)
+			songNum = 62;
+
 		_songQueue[MUSIC_QUEUE_SIZE - emptySlots] = songNum;
 		return true;
 	}
@@ -63,6 +69,7 @@
 	void MusicPlayer::queueClear() {
 		_lastSong = _songQueue[0];
 		_queuePos = 0;
+		_looping = _randomLoop = false;
 		memset(_songQueue, 0, sizeof(_songQueue));
 	}
 	
@@ -126,6 +133,47 @@
 			music->_parser->onTimer();
 	}
 	
+	void MusicPlayer::queueTuneList(int16 tuneList) {
+		queueClear();
+		
+		//Jungle is the only part of the game that uses multiple tunelists.
+		//For the sake of code simplification we just hardcode the extended list ourselves
+		if ((tuneList + 1) == 3) {
+			_randomLoop = true;
+			int i = 0;
+			while(Sound::_jungleList[i])
+				queueSong(Sound::_jungleList[i++] - 1);
+			return;
+		}
+		
+		switch (Sound::_tune[tuneList].mode) {
+			//Random loop
+			case  0:
+				_randomLoop = true;
+				setLoop(false);
+				break;
+			//Sequential loop
+			case  1:
+				if (_songQueue[1])
+					setLoop(false);
+				else
+					setLoop(true);
+				break;
+			//Play once
+			case  2:
+			default:
+				setLoop(false);
+				break;
+	}
+		
+		int i = 0;
+		while(Sound::_tune[tuneList].tuneNum[i])
+			queueSong(Sound::_tune[tuneList].tuneNum[i++] - 1);
+			
+		if (_randomLoop)
+			_queuePos = randomQueuePos();
+	}
+	
 	void MusicPlayer::playMusic() {
 		if (!_queuePos && !_songQueue[_queuePos]) {
 			debug(5, "MusicPlayer::playMusic - Music queue is empty!");
@@ -135,11 +183,18 @@
 		uint16 songNum = _songQueue[_queuePos];
 
 		//Special type
-		//2000: (songNum + 1) - repeat music from previous queue
-		if (songNum == 1999) {
-			songNum = _lastSong;
-			queueClear();
-			queueSong(songNum);
+		// > 1000 && < 2000 -> queue different tunelist
+		// 2000 -> repeat music from previous queue
+		if (songNum > 999) {
+			if ((songNum + 1) == 2000) {
+				songNum = _lastSong;
+				queueClear();
+				queueSong(songNum);
+			} else {
+				queueTuneList(songNum - 1000);
+				_queuePos = _randomLoop ? randomQueuePos() : 0;
+				songNum = _songQueue[_queuePos];
+			}
 		}
 		
 		_parser->loadMusic(_musicData + songOffset(songNum), songLength(songNum));
@@ -150,10 +205,23 @@
 	}
 	
 	void MusicPlayer::queueUpdatePos() {
-		if (_queuePos < (MUSIC_QUEUE_SIZE - 1) && _songQueue[_queuePos + 1])
-			_queuePos++;
-		else
-			_queuePos = 0;
+		if (_randomLoop)
+			_queuePos = randomQueuePos();
+		else {
+			if (_queuePos < (MUSIC_QUEUE_SIZE - 1) && _songQueue[_queuePos + 1])
+				_queuePos++;
+			else
+				_queuePos = 0;
+		}
+	}
+	
+	uint8 MusicPlayer::randomQueuePos() {
+		int queueSize = 0;
+		for (int i = 0; i < MUSIC_QUEUE_SIZE; i++)
+			if (_songQueue[i])
+				queueSize++;
+				
+		return (uint8) _rnd.getRandomNumber(queueSize) & 0xFF;
 	}
 	
 	void MusicPlayer::stopMusic() {
@@ -189,24 +257,11 @@
 		delete _player;
 		delete[] _musicData;	
 	}
-
-	bool Music::queueSong(uint16 songNum) {
-		// Work around bug in Roland music, note that these numbers are 'one-off'
-		// from the original code
-		if (/*isRoland && */ songNum == 88 || songNum == 89)
-			songNum = 62;
-			
-		return _player->queueSong(songNum);
-	}
 	
 	void Music::playSong(uint16 songNum) {
 		_player->queueClear();
 		_player->queueSong(songNum);
 		_player->playMusic();				
 	}
-
-	void Music::stopSong() {
-		return _player->stopMusic();
-	}
 	
 } // End of namespace Queen

Index: music.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/music.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- music.h	19 Jan 2004 23:54:50 -0000	1.6
+++ music.h	22 Jan 2004 23:09:43 -0000	1.7
@@ -39,6 +39,7 @@
 	void playMusic();
 	void stopMusic();
 	void setLoop(bool loop)		{ _looping = loop; }
+	void queueTuneList(int16 tuneList);
 	bool queueSong(uint16 songNum);
 	void queueClear();
 	
@@ -59,10 +60,11 @@
 protected:
 
 	enum {
-		MUSIC_QUEUE_SIZE	=	8
+		MUSIC_QUEUE_SIZE	=	14
 	};
 
 	void queueUpdatePos();
+	uint8 randomQueuePos();
 	static void onTimer(void *data);
 	uint32 songOffset(uint16 songNum);
 	uint32 songLength(uint16 songNum);
@@ -71,9 +73,12 @@
 	MidiParser *_parser;
 	MidiChannel *_channel[16];
 	byte _channelVolume[16];
-		
+	
+	Common::RandomSource _rnd;
+				
 	bool _isPlaying;
 	bool _looping;
+	bool _randomLoop;
 	byte _volume;
 	uint8 _queuePos;
 	int16 _lastSong;	//first song from previous queue
@@ -89,11 +94,9 @@
 	Music(MidiDriver *_driver, QueenEngine *vm);
 	~Music();
 	void playSong(uint16 songNum);
-	void queueClear()		{ return _player->queueClear(); }
-	bool queueSong(uint16 songNum);	
-	void playMusic()		{ return _player->playMusic(); }
-	void stopSong();
-	void loop(bool val)		{ return _player->setLoop(val); }
+	void queueTuneList(int16 tuneList)	{ return _player->queueTuneList(tuneList); }
+	void playMusic()					{ return _player->playMusic(); }
+	void stopSong()						{ return _player->stopMusic(); }
 	
 protected:
 	byte *_musicData;

Index: musicdata.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/musicdata.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- musicdata.cpp	6 Jan 2004 12:45:29 -0000	1.3
+++ musicdata.cpp	22 Jan 2004 23:09:46 -0000	1.4
@@ -1701,4 +1701,6 @@
 	"1034ssss"
 };
 
+const int16 Sound::_jungleList[] = { 15, 16, 17, 18, 7, 8, 9, 10, 11, 12, 13, 14, 0 };
+
 } // End of namespace Queen

Index: sound.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/sound.cpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- sound.cpp	19 Jan 2004 23:54:50 -0000	1.31
+++ sound.cpp	22 Jan 2004 23:09:52 -0000	1.32
@@ -123,26 +123,8 @@
 	
 	_lastOverride = songNum;
 	
-	switch (_tune[newTune].mode) {
-		//Random loop
-		case  0:
-			warning("Music: Random loop not yet supported (doing sequential loop instead)");
-		//Sequential loop
-		case  1:
-			_vm->music()->loop(true);
-			break;
-		//Play once
-		case  2:
-		default:
-			_vm->music()->loop(false);
-			break;
-	}
-
-	_vm->music()->queueClear();
-	int i = 0;
-	while(_tune[newTune].tuneNum[i])
-		_vm->music()->queueSong(_tune[newTune].tuneNum[i++] - 1);
-	_vm->music()->playMusic();	
+	_vm->music()->queueTuneList(newTune);
+	_vm->music()->playMusic();
 }
 
 void Sound::saveState(byte *&ptr) {

Index: sound.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/queen/sound.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- sound.h	12 Jan 2004 13:40:02 -0000	1.14
+++ sound.h	22 Jan 2004 23:10:05 -0000	1.15
@@ -78,13 +78,14 @@
 	void saveState(byte *&ptr);
 	void loadState(uint32 ver, byte *&ptr);
 
-protected:
-	SoundMixer *_mixer;
-	QueenEngine *_vm;
-
 	static const songData _song[];
 	static const tuneData _tune[];
 	static const char *_sfxName[];
+	static const int16 _jungleList[];
+
+protected:
+	SoundMixer *_mixer;
+	QueenEngine *_vm;
 
 	bool _sfxToggle;
 	bool _speechToggle;





More information about the Scummvm-git-logs mailing list