aboutsummaryrefslogtreecommitdiff
path: root/engines/sherlock/music.cpp
diff options
context:
space:
mode:
authorFilippos Karapetis2015-06-15 03:15:08 +0300
committerFilippos Karapetis2015-06-15 03:15:08 +0300
commitdd992772be489b69803c8d00fd66347fe16ad804 (patch)
tree5f925f94a9fe0d0603f3b567353e17a62c70c446 /engines/sherlock/music.cpp
parentfc8177cdd3fd2470fe353b83daed6dd033e7b159 (diff)
downloadscummvm-rg350-dd992772be489b69803c8d00fd66347fe16ad804.tar.gz
scummvm-rg350-dd992772be489b69803c8d00fd66347fe16ad804.tar.bz2
scummvm-rg350-dd992772be489b69803c8d00fd66347fe16ad804.zip
SHERLOCK: RT: Initial implementation of XMI music support for RT
Diffstat (limited to 'engines/sherlock/music.cpp')
-rw-r--r--engines/sherlock/music.cpp41
1 files changed, 27 insertions, 14 deletions
diff --git a/engines/sherlock/music.cpp b/engines/sherlock/music.cpp
index 470c6fafb3..29e122f09c 100644
--- a/engines/sherlock/music.cpp
+++ b/engines/sherlock/music.cpp
@@ -218,7 +218,7 @@ Music::Music(SherlockEngine *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer) {
if (_vm->_interactiveFl)
_vm->_res->addToCache("MUSIC.LIB");
- _midiParser = new MidiParser_SH();
+ _midiParser = (IS_SERRATED_SCALPEL) ? new MidiParser_SH() : MidiParser::createParser_XMIDI();
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MT32);
_musicType = MidiDriver::getMusicType(dev);
@@ -320,8 +320,14 @@ bool Music::loadSong(int songNumber) {
}
bool Music::loadSong(const Common::String &songName) {
- warning("TODO: Music::loadSong");
- return false;
+ freeSong(); // free any song that is currently loaded
+
+ if (!playMusic(songName))
+ return false;
+
+ stopMusic();
+ startSong();
+ return true;
}
void Music::syncMusicSettings() {
@@ -339,7 +345,7 @@ bool Music::playMusic(const Common::String &name) {
if (!_midiDriver)
return false;
- Common::String midiMusicName = name + ".MUS";
+ Common::String midiMusicName = (IS_SERRATED_SCALPEL) ? name + ".MUS" : name + ".XMI";
Common::SeekableReadStream *stream = _vm->_res->load(midiMusicName, "MUSIC.LIB");
_midiMusicData = new byte[stream->size()];
@@ -365,17 +371,24 @@ bool Music::playMusic(const Common::String &name) {
byte *dataPos = _midiMusicData;
int32 dataSize = _midiMusicDataSize;
- if (memcmp(" ", dataPos, 12)) {
- warning("Music: expected header not found in music file");
- return false;
- }
- dataPos += 12;
- dataSize -= 12;
+ if (IS_SERRATED_SCALPEL) {
+ if (memcmp(" ", dataPos, 12)) {
+ warning("Music: expected header not found in music file");
+ return false;
+ }
+ dataPos += 12;
+ dataSize -= 12;
- uint16 headerSize = READ_LE_UINT16(dataPos);
- if (headerSize != 0x7F) {
- warning("Music: header is not as expected");
- return false;
+ uint16 headerSize = READ_LE_UINT16(dataPos);
+ if (headerSize != 0x7F) {
+ warning("Music: header is not as expected");
+ return false;
+ }
+ } else {
+ if (memcmp("FORM", dataPos, 4)) {
+ warning("Music: expected header not found in music file");
+ return false;
+ }
}
switch (_musicType) {