diff options
Diffstat (limited to 'queen/music.cpp')
-rw-r--r-- | queen/music.cpp | 66 |
1 files changed, 33 insertions, 33 deletions
diff --git a/queen/music.cpp b/queen/music.cpp index 57d85f48e0..a9b0083169 100644 --- a/queen/music.cpp +++ b/queen/music.cpp @@ -36,7 +36,7 @@ MusicPlayer::MusicPlayer(MidiDriver *driver, byte *data, uint32 size) : _driver( _parser = MidiParser::createParser_SMF(); _parser->setMidiDriver(this); _parser->setTimerRate(_driver->getBaseTempo()); - + _numSongs = READ_LE_UINT16(_musicData); this->open(); } @@ -53,12 +53,12 @@ void MusicPlayer::setVolume(int volume) { volume = 0; else if (volume > 255) volume = 255; - + if (_masterVolume == volume) return; - + _masterVolume = volume; - + for (int i = 0; i < 16; ++i) { if (_channel[i]) _channel[i]->volume(_channelVolume[i] * _masterVolume / 255); @@ -76,10 +76,10 @@ bool MusicPlayer::queueSong(uint16 songNum) { for (int i = 0; i < MUSIC_QUEUE_SIZE; i++) if (!_songQueue[i]) emptySlots++; - + 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) @@ -100,27 +100,27 @@ int MusicPlayer::open() { // Don't ever call open without first setting the output driver! if (!_driver) return 255; - + int ret = _driver->open(); if (ret) return ret; _driver->setTimerCallback(this, &onTimer); return 0; } - + void MusicPlayer::close() { _driver->setTimerCallback(NULL, NULL); if (_driver) _driver->close(); _driver = 0; } - + void MusicPlayer::send(uint32 b) { if (_passThrough) { _driver->send(b); return; } - + byte channel = (byte)(b & 0x0F); if ((b & 0xFFF0) == 0x07B0) { // Adjust volume changes by master volume @@ -130,14 +130,14 @@ void MusicPlayer::send(uint32 b) { b = (b & 0xFF00FFFF) | (volume << 16); } else if ((b & 0xF0) == 0xC0 && !_nativeMT32) { b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8; - } + } else if ((b & 0xFFF0) == 0x007BB0) { //Only respond to All Notes Off if this channel //has currently been allocated if (_channel[b & 0x0F]) return; } - + //Work around annoying loud notes in certain Roland Floda tunes if (channel == 3 && _currentSong == 90) return; @@ -145,10 +145,10 @@ void MusicPlayer::send(uint32 b) { return; if (channel == 5 && _currentSong == 38) return; - + if (!_channel[channel]) _channel[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel(); - + if (_channel[channel]) _channel[channel]->send(b); } @@ -157,22 +157,22 @@ void MusicPlayer::metaEvent(byte type, byte *data, uint16 length) { //Only thing we care about is End of Track. if (type != 0x2F) return; - - if (_looping || _songQueue[1]) + + if (_looping || _songQueue[1]) playMusic(); else stopMusic(); } - + void MusicPlayer::onTimer(void *refCon) { MusicPlayer *music = (MusicPlayer *)refCon; if (music->_isPlaying) 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) { @@ -182,7 +182,7 @@ void MusicPlayer::queueTuneList(int16 tuneList) { queueSong(Sound::_jungleList[i++] - 1); return; } - + int mode = (_numSongs == 40) ? Sound::_tuneDemo[tuneList].mode : Sound::_tune[tuneList].mode; switch (mode) { case 0: // random loop @@ -191,13 +191,13 @@ void MusicPlayer::queueTuneList(int16 tuneList) { break; case 1: // sequential loop setLoop(_songQueue[1] == 0); - break; + break; case 2: // play once default: setLoop(false); break; } - + int i = 0; if (_numSongs == 40) { while (Sound::_tuneDemo[tuneList].tuneNum[i]) @@ -206,11 +206,11 @@ void MusicPlayer::queueTuneList(int16 tuneList) { while (Sound::_tune[tuneList].tuneNum[i]) queueSong(Sound::_tune[tuneList].tuneNum[i++] - 1); } - + if (_randomLoop) _queuePos = randomQueuePos(); } - + void MusicPlayer::playMusic() { if (!_songQueue[0]) { debug(5, "MusicPlayer::playMusic - Music queue is empty!"); @@ -241,7 +241,7 @@ void MusicPlayer::playMusic() { _buf = 0; } } - + _currentSong = songNum; if (!songNum) { stopMusic(); @@ -267,14 +267,14 @@ void MusicPlayer::playMusic() { musicPtr = ((byte *)_buf) + ((*musicPtr == 0x63) ? 1 : 0); size = packedSize * 2; } - + _parser->loadMusic(musicPtr, size); - _parser->setTrack(0); + _parser->setTrack(0); debug(8, "Playing song %d [queue position: %d]", songNum, _queuePos); _isPlaying = true; queueUpdatePos(); } - + void MusicPlayer::queueUpdatePos() { if (_randomLoop) { _queuePos = randomQueuePos(); @@ -285,16 +285,16 @@ void MusicPlayer::queueUpdatePos() { _queuePos = 0; } } - + uint8 MusicPlayer::randomQueuePos() { int queueSize = 0; for (int i = 0; i < MUSIC_QUEUE_SIZE; i++) if (_songQueue[i]) queueSize++; - + if (!queueSize) return 0; - + return (uint8) _rnd.getRandomNumber(queueSize - 1) & 0xFF; } @@ -326,13 +326,13 @@ Music::Music(MidiDriver *driver, QueenEngine *vm) : _vToggle(false) { Music::~Music() { delete _player; - delete[] _musicData; + delete[] _musicData; } void Music::playSong(uint16 songNum) { _player->queueClear(); _player->queueSong(songNum); - _player->playMusic(); + _player->playMusic(); } void Music::toggleVChange() { |