aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorlukaslw2014-07-26 20:49:42 +0200
committerlukaslw2014-07-26 20:58:35 +0200
commitc1456d273469d3eb876ae5b3d4fd602bf2c488ba (patch)
tree926639f67e8edb690135f0a5129a12b06a654195 /engines
parentc224455e1bd2573e7399206020c057645a9d80bc (diff)
downloadscummvm-rg350-c1456d273469d3eb876ae5b3d4fd602bf2c488ba.tar.gz
scummvm-rg350-c1456d273469d3eb876ae5b3d4fd602bf2c488ba.tar.bz2
scummvm-rg350-c1456d273469d3eb876ae5b3d4fd602bf2c488ba.zip
PRINCE: MIDI music - update. loadMusic(), stopMusic(), O_SETMUSIC, O_STOPMUSIC
Diffstat (limited to 'engines')
-rw-r--r--engines/prince/prince.cpp27
-rw-r--r--engines/prince/prince.h4
-rw-r--r--engines/prince/script.cpp4
-rw-r--r--engines/prince/sound.cpp4
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;