Ticket #3590: 1876741.diff

File 1876741.diff, 2.9 KB (added by cyxx, 13 years ago)
  • queen/resource.cpp

     
    106106                        re = &_resourceTable[cur];
    107107                        break;
    108108                }
    109         } while (cur++ < _resourceEntries);
     109        } while (++cur < _resourceEntries);
    110110#endif
    111111        return re;
    112112}
  • queen/sound.cpp

     
    4040#include "sound/mp3.h"
    4141#include "sound/vorbis.h"
    4242
    43 #define SB_HEADER_SIZE_V104 110
    44 #define SB_HEADER_SIZE_V110 122
    45 
    4643namespace Queen {
    4744
    4845class SilentSound : public PCSound {
     
    254251        }
    255252}
    256253
     254int parseHeaderSB(Common::File *f, int soundIndex, uint32 &size) {
     255        static const int freqTable[] = {
     256                 3951,  4186,  4435,  4699,  4978,  5274,  5588,  5920,  6272,  6645,  7040,
     257                 7459,  7902,  8372,  8870,  9397,  9956, 10548, 11175, 11840, 12544, 13290,
     258                14080, 14917, 15804, 16744, 17740, 18795, 19912, 21096, 22351, 23680, 25088
     259        };
     260        const int fileBaseOffset = f->pos();
     261
     262        f->readUint16LE(); // number of sound indexes
     263        const int fileInfoOffset = f->readUint16LE();
     264        f->seek(soundIndex * 4, SEEK_CUR);
     265        const int soundSetupInfoOffset = f->readUint16LE();
     266
     267        f->seek(fileBaseOffset + soundSetupInfoOffset, SEEK_SET);
     268        int frequency = 11025; // default to 'sane' values
     269        int pcmDataOffsetIndex = 0;
     270        while (true) {
     271                uint8 opcode = f->readByte();
     272                if (opcode >= 32) {
     273                        frequency = freqTable[(opcode - 32) / 2];
     274                        break;
     275                }
     276                switch (opcode) {
     277                case 0:
     278                        f->readByte();
     279                        break;
     280                case 7:
     281                        pcmDataOffsetIndex = f->readByte();
     282                        break;
     283                default:
     284                        error("Invalid opcode %d in SB file header", opcode);
     285                        break;
     286                }
     287        }
     288
     289        f->seek(fileBaseOffset + fileInfoOffset + pcmDataOffsetIndex, SEEK_SET);
     290        int pcmDataOffset = f->readUint16LE();
     291        pcmDataOffset |= f->readUint16LE() << 4;
     292        size -= pcmDataOffset;
     293        f->seek(fileBaseOffset + pcmDataOffset, SEEK_SET);
     294        return frequency;
     295}
     296
    257297void SBSound::playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *soundHandle) {
    258         int headerSize;
    259         f->seek(2, SEEK_CUR);
    260         uint16 version = f->readUint16LE();
    261         switch (version) {
    262         case 104:
    263                 headerSize = SB_HEADER_SIZE_V104;
    264                 break;
    265         case 110:
    266                 headerSize = SB_HEADER_SIZE_V110;
    267                 break;
    268         default:
    269                 warning("Unhandled SB file version %d, defaulting to 104\n", version);
    270                 headerSize = SB_HEADER_SIZE_V104;
    271                 break;
    272         }
    273         f->seek(headerSize - 4, SEEK_CUR);
    274         size -= headerSize;
     298        const int frequency = parseHeaderSB(f, 18, size);
    275299        uint8 *sound = (uint8 *)malloc(size);
    276300        if (sound) {
    277301                f->read(sound, size);
    278302                byte flags = Audio::Mixer::FLAG_UNSIGNED | Audio::Mixer::FLAG_AUTOFREE;
    279                 _mixer->playRaw(Audio::Mixer::kSFXSoundType, soundHandle, sound, size, 11025, flags);
     303                _mixer->playRaw(Audio::Mixer::kSFXSoundType, soundHandle, sound, size, frequency, flags);
    280304        }
    281305}
    282306