[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
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/queen cutaway.cpp,1.118,1.119 graphics.cpp,1.88,1.89 graphics.h,1.64,1.65 logic.cpp,1.181,1.182 structs.h,1.34,1.35 talk.cpp,1.85,1.86
- Next message: [Scummvm-cvs-logs] CVS: scummvm/queen music.cpp,1.11,1.12 music.h,1.9,1.10
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
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;
- Previous message: [Scummvm-cvs-logs] CVS: scummvm/queen cutaway.cpp,1.118,1.119 graphics.cpp,1.88,1.89 graphics.h,1.64,1.65 logic.cpp,1.181,1.182 structs.h,1.34,1.35 talk.cpp,1.85,1.86
- Next message: [Scummvm-cvs-logs] CVS: scummvm/queen music.cpp,1.11,1.12 music.h,1.9,1.10
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Scummvm-git-logs
mailing list