From ddf7449b00d15c5419c667f9df553053e8dc0cec Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 3 Jun 2010 22:00:50 +0000 Subject: Added code to get which channels are used by a sound. Also, fixed a crash when using Sierra's GM patches, a regression from commit #49391. svn-id: r49415 --- engines/sci/resource.h | 2 ++ engines/sci/resource_audio.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/engines/sci/resource.h b/engines/sci/resource.h index f722ca5768..6d9da3c200 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -512,6 +512,7 @@ public: Track *getDigitalTrack(); int getChannelFilterMask(int hardwareMask, bool wantsRhythm); byte getInitialVoiceCount(byte channel); + bool isChannelUsed(byte channel) { return _usedChannels[channel]; } private: SciVersion _soundVersion; @@ -519,6 +520,7 @@ private: Track *_tracks; Resource *_innerResource; ResourceManager *_resMan; + bool _usedChannels[16]; }; } // End of namespace Sci diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index b626a25989..6dfd190d97 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -151,6 +151,7 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) { if (!gmPatchFile.empty() && Common::File::exists(gmPatchFile)) { ResourceSource *psrcPatch = new ResourceSource; psrcPatch->source_type = kSourcePatch; + psrcPatch->resourceFile = 0; psrcPatch->location_name = gmPatchFile; processPatch(psrcPatch, kResourceTypePatch, 4); } @@ -467,6 +468,9 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi byte *dataEnd; Channel *channel, *sampleChannel; + for (int i = 0; i < 16; i++) + _usedChannels[i] = false; + switch (_soundVersion) { case SCI_VERSION_0_EARLY: case SCI_VERSION_0_LATE: @@ -556,6 +560,7 @@ SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan, SciVersi channel->data = resource->data + READ_LE_UINT16(data + 2) + 2; channel->size = READ_LE_UINT16(data + 4) - 2; // Not counting channel header channel->number = *(channel->data - 2); + _usedChannels[channel->number] = true; channel->poly = *(channel->data - 1); channel->time = channel->prev = 0; if (channel->number == 0xFE) { // Digital channel -- cgit v1.2.3