Ticket #8564: pool-of-sorrow.diff

File pool-of-sorrow.diff, 3.6 KB (added by eriktorbjorn, 17 years ago)

Patch against current SVN

  • engines/kyra/sound_adlib.cpp

     
    7373        bool endOfData() const { return false; }
    7474        int getRate() const { return _mixer->getOutputRate(); }
    7575
     76        void setSyncJumpMask(uint16 mask) { _syncJumpMask = mask; }
     77
    7678private:
    7779        struct OpcodeEntry {
    7880                typedef int (AdlibDriver::*DriverOpcode)(va_list &list);
     
    127129        // unk41 - Sound-effect. Used for primaryEffect2()
    128130
    129131        struct Channel {
     132                bool lock;      // New to ScummVM
    130133                uint8 opExtraLevel2;
    131134                uint8 *dataptr;
    132135                uint8 duration;
     
    361364        uint8 _soundIdTable[0x10];
    362365        Channel _channels[10];
    363366
     367        bool _channelLock[10];
     368
    364369        uint8 _vibratoAndAMDepthBits;
    365370        uint8 _rhythmSectionBits;
    366371
     
    378383        static const uint8 _unkTable2_3[];
    379384        static const uint8 _unkTables[][32];
    380385
     386        uint16 _syncJumpMask;
     387
    381388        Common::Mutex _mutex;
    382389        Audio::Mixer *_mixer;
    383390
     
    421428        _samplesPerCallbackRemainder = getRate() % CALLBACKS_PER_SECOND;
    422429        _samplesTillCallback = 0;
    423430        _samplesTillCallbackRemainder = 0;
     431
     432        _syncJumpMask = 0;
    424433}
    425434
    426435AdlibDriver::~AdlibDriver() {
     
    628637                        unkOutput2(chan);
    629638                }
    630639
     640                // What we have set up now is, probably, the controlling
     641                // channel for the sound. It is assumed that this program will
     642                // set up all the other channels it needs, clearing their locks
     643                // along the way.
     644
    631645                ++_lastProcessed;
    632646                _lastProcessed &= 0x0F;
    633647        }
     
    670684void AdlibDriver::executePrograms() {
    671685        // Each channel runs its own program. There are ten channels: One for
    672686        // each Adlib channel (0-8), plus one "control channel" (9) which is
    673         // the one that tells the other channels what to do. 
     687        // the one that tells the other channels what to do.
    674688
     689        // This is where we ensure that channels that are made to jump "in
     690        // sync" do so.
     691
     692        if (_syncJumpMask) {
     693                bool forceUnlock = true;
     694
     695                for (_curChannel = 9; _curChannel >= 0; --_curChannel) {
     696                        if ((_syncJumpMask & (1 << _curChannel)) == 0)
     697                                continue;
     698
     699                        if (_channels[_curChannel].dataptr && !_channels[_curChannel].lock) {
     700                                forceUnlock = false;
     701                        }
     702                }
     703
     704                if (forceUnlock) {
     705                        for (_curChannel = 9; _curChannel >= 0; --_curChannel)
     706                                if (_syncJumpMask & (1 << _curChannel))
     707                                        _channels[_curChannel].lock = false;
     708                }
     709        }
     710
    675711        for (_curChannel = 9; _curChannel >= 0; --_curChannel) {
    676712                int result = 1;
    677713
    678714                if (!_channels[_curChannel].dataptr) {
    679715                        continue;
    680716                }
     717
     718                if (_channels[_curChannel].lock && (_syncJumpMask & (1 << _curChannel))) {
     719                        continue;
     720                }
    681721       
    682722                Channel &channel = _channels[_curChannel];
    683723                _curRegOffset = _regOffset[_curChannel];
     
    784824        channel.primaryEffect = 0;
    785825        channel.secondaryEffect = 0;
    786826        channel.spacing1 = 1;
     827        channel.lock = false;
    787828}
    788829
    789830void AdlibDriver::noteOff(Channel &channel) {
     
    12461287        --dataptr;
    12471288        int16 add = READ_LE_UINT16(dataptr); dataptr += 2;
    12481289        dataptr += add;
     1290        if (_syncJumpMask & (1 << (&channel - _channels)))
     1291                channel.lock = true;
    12491292        return 0;
    12501293}
    12511294
     
    21952238}
    21962239
    21972240void SoundAdlibPC::playTrack(uint8 track) {
    2198         if (_musicEnabled)
     2241        if (_musicEnabled) {
     2242                // WORKAROUND: There is a bug in the Kyra 1 "Pool of Sorrow"
     2243                // music which causes the channels to get progressively out of
     2244                // sync for each loop. To avoid that, we declare that all four
     2245                // of the song channels have to jump "in sync".
     2246
     2247                if (track == 4 && _soundFileLoaded == "KYRA1B")
     2248                        _driver->setSyncJumpMask(0x000F);
     2249                else
     2250                        _driver->setSyncJumpMask(0);
    21992251                play(track);
     2252        }
    22002253}
    22012254
    22022255void SoundAdlibPC::haltTrack() {