aboutsummaryrefslogtreecommitdiff
path: root/queen/music.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'queen/music.cpp')
-rw-r--r--queen/music.cpp66
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() {