aboutsummaryrefslogtreecommitdiff
path: root/queen
diff options
context:
space:
mode:
authorJoost Peters2004-01-22 23:10:05 +0000
committerJoost Peters2004-01-22 23:10:05 +0000
commit0bece175e485b4456cb966052662b38fe2147647 (patch)
tree8a089201660d90c4ab63b07c5a526f5eb11098a6 /queen
parent99e3175d548d5dce704aaedab9ed291a4b365dae (diff)
downloadscummvm-rg350-0bece175e485b4456cb966052662b38fe2147647.tar.gz
scummvm-rg350-0bece175e485b4456cb966052662b38fe2147647.tar.bz2
scummvm-rg350-0bece175e485b4456cb966052662b38fe2147647.zip
- Some refactoring/clean-up.
- Handle special music types (> 1000) - Implemented random looping (untested) svn-id: r12577
Diffstat (limited to 'queen')
-rw-r--r--queen/music.cpp103
-rw-r--r--queen/music.h17
-rw-r--r--queen/musicdata.cpp2
-rw-r--r--queen/sound.cpp22
-rw-r--r--queen/sound.h9
5 files changed, 98 insertions, 55 deletions
diff --git a/queen/music.cpp b/queen/music.cpp
index 2561b58c18..2aab07eb73 100644
--- a/queen/music.cpp
+++ b/queen/music.cpp
@@ -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 @@ namespace Queen {
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 @@ namespace Queen {
void MusicPlayer::queueClear() {
_lastSong = _songQueue[0];
_queuePos = 0;
+ _looping = _randomLoop = false;
memset(_songQueue, 0, sizeof(_songQueue));
}
@@ -126,6 +133,47 @@ namespace Queen {
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 @@ namespace Queen {
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 @@ namespace Queen {
}
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 @@ namespace Queen {
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
diff --git a/queen/music.h b/queen/music.h
index 9c94c2941c..005f37248c 100644
--- a/queen/music.h
+++ b/queen/music.h
@@ -39,6 +39,7 @@ public:
void playMusic();
void stopMusic();
void setLoop(bool loop) { _looping = loop; }
+ void queueTuneList(int16 tuneList);
bool queueSong(uint16 songNum);
void queueClear();
@@ -59,10 +60,11 @@ public:
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 @@ protected:
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 @@ public:
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;
diff --git a/queen/musicdata.cpp b/queen/musicdata.cpp
index 36a459d195..280484b907 100644
--- a/queen/musicdata.cpp
+++ b/queen/musicdata.cpp
@@ -1701,4 +1701,6 @@ const char *Sound::_sfxName[] = {
"1034ssss"
};
+const int16 Sound::_jungleList[] = { 15, 16, 17, 18, 7, 8, 9, 10, 11, 12, 13, 14, 0 };
+
} // End of namespace Queen
diff --git a/queen/sound.cpp b/queen/sound.cpp
index d9b3f92bdd..fa5c702e1f 100644
--- a/queen/sound.cpp
+++ b/queen/sound.cpp
@@ -123,26 +123,8 @@ void Sound::playSong(int16 songNum) {
_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) {
diff --git a/queen/sound.h b/queen/sound.h
index 2184b5670f..6c657ffadc 100644
--- a/queen/sound.h
+++ b/queen/sound.h
@@ -78,13 +78,14 @@ public:
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;