diff options
author | Filippos Karapetis | 2010-08-19 13:52:21 +0000 |
---|---|---|
committer | Filippos Karapetis | 2010-08-19 13:52:21 +0000 |
commit | 37d2f102061cbafdde3060bbe1d7165817ffb676 (patch) | |
tree | a63d0ecd5898891a9f81a90455d1bb3ce9ab6c34 | |
parent | 26dc4c24256472898f4388de73699a5f54f4a2cf (diff) | |
download | scummvm-rg350-37d2f102061cbafdde3060bbe1d7165817ffb676.tar.gz scummvm-rg350-37d2f102061cbafdde3060bbe1d7165817ffb676.tar.bz2 scummvm-rg350-37d2f102061cbafdde3060bbe1d7165817ffb676.zip |
SCI: Added checking for the existence of a GM track, to determine if device ID 7 or 12 should be used. Fixes the GM music in the demo of QFG3, which is using an in-between version of SCI1 and SCI1.1
svn-id: r52211
-rw-r--r-- | engines/sci/resource.h | 1 | ||||
-rw-r--r-- | engines/sci/resource_audio.cpp | 29 | ||||
-rw-r--r-- | engines/sci/sound/drivers/midi.cpp | 16 |
3 files changed, 41 insertions, 5 deletions
diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 48210b835f..62968a231e 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -315,6 +315,7 @@ public: void setAudioLanguage(int language); int getAudioLanguage() const; + bool isGMTrackIncluded(); bool isVGA() const { return (_viewType == kViewVga) || (_viewType == kViewVga11); } bool isAmiga32color() const { return _viewType == kViewAmiga; } bool isSci11Mac() const { return _volVersion == kResVersionSci11Mac; } diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index a25505fe47..5457c1eb38 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -519,6 +519,35 @@ int ResourceManager::getAudioLanguage() const { return (_audioMapSCI1 ? _audioMapSCI1->_volumeNumber : 0); } +bool ResourceManager::isGMTrackIncluded() { + // This check only makes sense for SCI1 and newer games + if (getSciVersion() < SCI_VERSION_1_EARLY) + return false; + + // SCI2 and newer games always have GM tracks + if (getSciVersion() >= SCI_VERSION_2) + return true; + + // For the leftover games, we can safely use SCI_VERSION_1_EARLY for the soundVersion + const SciVersion soundVersion = SCI_VERSION_1_EARLY; + + // Read song 1 and check if it has a GM track + bool result = false; + SoundResource *song1 = new SoundResource(1, this, soundVersion); + if (!song1) { + warning("ResourceManager::isGMTrackIncluded: track 1 not found"); + return false; + } + + SoundResource::Track *gmTrack = song1->getTrackByType(0x07); + if (gmTrack) + result = true; + + delete song1; + + return result; +} + SoundResource::SoundResource(uint32 resourceNr, ResourceManager *resMan, SciVersion soundVersion) : _resMan(resMan), _soundVersion(soundVersion) { Resource *resource = _resMan->findResource(ResourceId(kResourceTypeSound, resourceNr), true); int trackNr, channelNr; diff --git a/engines/sci/sound/drivers/midi.cpp b/engines/sci/sound/drivers/midi.cpp index 3a7a129b5b..8acd35374a 100644 --- a/engines/sci/sound/drivers/midi.cpp +++ b/engines/sci/sound/drivers/midi.cpp @@ -97,7 +97,7 @@ private: }; bool _isMt32; - bool _isOldPatchFormat; + bool _useMT32Track; bool _hasReverb; bool _playSwitch; int _masterVolume; @@ -119,7 +119,7 @@ private: byte _sysExBuf[kMaxSysExSize]; }; -MidiPlayer_Midi::MidiPlayer_Midi(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _isMt32(false), _hasReverb(false), _isOldPatchFormat(true) { +MidiPlayer_Midi::MidiPlayer_Midi(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _isMt32(false), _hasReverb(false), _useMT32Track(true) { MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI); _driver = createMidi(dev); @@ -820,9 +820,15 @@ int MidiPlayer_Midi::open(ResourceManager *resMan) { // Detect the format of patch 1, so that we know what play mask to use res = resMan->findResource(ResourceId(kResourceTypePatch, 1), 0); if (!res) - _isOldPatchFormat = false; + _useMT32Track = false; else - _isOldPatchFormat = !isMt32GmPatch(res->data, res->size); + _useMT32Track = !isMt32GmPatch(res->data, res->size); + + // Check if the songs themselves have a GM track + if (!_useMT32Track) { + if (!resMan->isGMTrackIncluded()) + _useMT32Track = true; + } } else { // No GM patch found, map instruments using MT-32 patch @@ -897,7 +903,7 @@ byte MidiPlayer_Midi::getPlayId() { if (_isMt32) return 0x0c; else - return _isOldPatchFormat ? 0x0c : 0x07; + return _useMT32Track ? 0x0c : 0x07; } } |