diff options
author | lukaslw | 2014-07-26 20:49:42 +0200 |
---|---|---|
committer | lukaslw | 2014-07-26 20:58:35 +0200 |
commit | c1456d273469d3eb876ae5b3d4fd602bf2c488ba (patch) | |
tree | 926639f67e8edb690135f0a5129a12b06a654195 | |
parent | c224455e1bd2573e7399206020c057645a9d80bc (diff) | |
download | scummvm-rg350-c1456d273469d3eb876ae5b3d4fd602bf2c488ba.tar.gz scummvm-rg350-c1456d273469d3eb876ae5b3d4fd602bf2c488ba.tar.bz2 scummvm-rg350-c1456d273469d3eb876ae5b3d4fd602bf2c488ba.zip |
PRINCE: MIDI music - update. loadMusic(), stopMusic(), O_SETMUSIC, O_STOPMUSIC
-rw-r--r-- | engines/prince/prince.cpp | 27 | ||||
-rw-r--r-- | engines/prince/prince.h | 4 | ||||
-rw-r--r-- | engines/prince/script.cpp | 4 | ||||
-rw-r--r-- | engines/prince/sound.cpp | 4 |
4 files changed, 32 insertions, 7 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 62df0c7cb0..e3b274d674 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -93,7 +93,7 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc) _traceLineLen(0), _rembBitmapTemp(nullptr), _rembBitmap(nullptr), _rembMask(0), _rembX(0), _rembY(0), _checkBitmapTemp(nullptr), _checkBitmap(nullptr), _checkMask(0), _checkX(0), _checkY(0), _traceLineFirstPointFlag(false), _tracePointFirstPointFlag(false), _coordsBuf2(nullptr), _coords2(nullptr), _coordsBuf3(nullptr), _coords3(nullptr), - _shanLen1(0), _directionTable(nullptr) { + _shanLen1(0), _directionTable(nullptr), _currentMidi(0) { // Debug/console setup DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel"); @@ -405,8 +405,7 @@ bool PrinceEngine::loadLocation(uint16 locationNr) { SearchMan.add(locationNrStr, locationArchive); - const char *musName = MusicPlayer::_musTable[MusicPlayer::_musRoomTable[locationNr]]; - _midiPlayer->loadMidi(musName); + loadMusic(_locationNr); // load location background, replace old one Resource::loadResource(_roomBmp, "room", true); @@ -573,6 +572,28 @@ void PrinceEngine::makeInvCursor(int itemNr) { } } +bool PrinceEngine::loadMusic(int musNumber) { + uint8 midiNumber = MusicPlayer::_musRoomTable[musNumber]; + if (midiNumber) { + if (midiNumber != 100) { + if (_currentMidi != midiNumber) { + _currentMidi = midiNumber; + const char *musName = MusicPlayer::_musTable[_currentMidi]; + _midiPlayer->loadMidi(musName); + } + } + } else { + stopMusic(); + } + return true; +} + +void PrinceEngine::stopMusic() { + if (_midiPlayer->isPlaying()) { + _midiPlayer->stop(); + } +} + bool PrinceEngine::playNextFrame() { if (!_flicPlayer.isVideoLoaded()) return false; diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 3fd03c66d4..ebc42c28fd 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -273,6 +273,9 @@ public: bool loadShadow(byte *shadowBitmap, uint32 dataSize, const char *resourceName1, const char *resourceName2); bool loadMobPriority(const char *resourceName); + bool loadMusic(int musNumber); + void stopMusic(); + void playSample(uint16 sampleId, uint16 loopType); void stopSample(uint16 sampleId); void stopAllSamples(); @@ -305,6 +308,7 @@ public: Script *_script; InterpreterFlags *_flags; Interpreter *_interpreter; + uint8 _currentMidi; static const int kMaxNormAnims = 64; static const int kMaxBackAnims = 64; diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index fbd1b649ae..7344bc361e 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -692,14 +692,14 @@ void Interpreter::O_FREEALLSAMPLES() { error("O_FREEALLSAMPLES"); } -// TODO void Interpreter::O_SETMUSIC() { uint16 musicId = readScript<uint16>(); + _vm->loadMusic(musicId); debugInterpreter("O_SETMUSIC musicId %d", musicId); } -// TODO void Interpreter::O_STOPMUSIC() { + _vm->stopMusic(); debugInterpreter("O_STOPMUSIC"); } diff --git a/engines/prince/sound.cpp b/engines/prince/sound.cpp index 9a0a33b25c..3509bbc291 100644 --- a/engines/prince/sound.cpp +++ b/engines/prince/sound.cpp @@ -155,8 +155,8 @@ void MusicPlayer::killMidi() { _data = NULL; } -void MusicPlayer::loadMidi(const char * name) { - Common::SeekableReadStream * stream = SearchMan.createReadStreamForMember(name); +void MusicPlayer::loadMidi(const char *name) { + Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(name); if (!stream) { debug("Can't load midi stream %s", name); return; |