diff options
| author | Joost Peters | 2004-01-22 23:10:05 +0000 |
|---|---|---|
| committer | Joost Peters | 2004-01-22 23:10:05 +0000 |
| commit | 0bece175e485b4456cb966052662b38fe2147647 (patch) | |
| tree | 8a089201660d90c4ab63b07c5a526f5eb11098a6 /queen | |
| parent | 99e3175d548d5dce704aaedab9ed291a4b365dae (diff) | |
| download | scummvm-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.cpp | 103 | ||||
| -rw-r--r-- | queen/music.h | 17 | ||||
| -rw-r--r-- | queen/musicdata.cpp | 2 | ||||
| -rw-r--r-- | queen/sound.cpp | 22 | ||||
| -rw-r--r-- | queen/sound.h | 9 |
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; |
