Ticket #8112: patch

File patch, 8.2 KB (added by SF/olki, 18 years ago)
  • simon/intern.h

    diff -urN scummvm/simon/intern.h scummvm.dev/simon/intern.h
    old new  
    131131        uint SOUND_INDEX_BASE;
    132132        const char *gme_filename;
    133133        const char *wav_filename;
    134         const char *wav_filename2;
    135         const char *effects_filename;
     134        const char *voc_filename;
     135        const char *mp3_filename;
     136        const char *voc_effects_filename;
     137        const char *mp3_effects_filename;
    136138        const char *gamepc_filename;
    137139};
    138140
  • simon/simon.cpp

    diff -urN scummvm/simon/simon.cpp scummvm.dev/simon/simon.cpp
    old new  
    4949        0,                                                                                                              /* SOUND_INDEX_BASE */
    5050        "SIMON.GME",                                                                    /* gme_filename */
    5151        "SIMON.WAV",                                                                    /* wav_filename */
    52         "SIMON.VOC",                                                                    /* wav_filename2 */
    53         "EFFECTS.VOC",                                                                  /* effects_filename */
     52        "SIMON.VOC",                                                                    /* voc_filename */
     53        "SIMON.MP3",                                                                    /* mp3_filename */
     54        "EFFECTS.VOC",                                                                  /* voc_effects_filename */
     55        "EFFECTS.MP3",                                                                  /* mp3_effects_filename */
    5456        "GAMEPC",                                                                                       /* gamepc_filename */
    5557};
    5658
     
    6870        0,                                                                                                              /* SOUND_INDEX_BASE */
    6971        "",                                                                     /* gme_filename */
    7072        "",                                                                     /* wav_filename */
    71         "",                                                                     /* wav_filename2 */
    72         "",                                                                     /* effects_filename */
     73        "",                                                                     /* voc_filename */
     74        "",                                                                     /* mp3_filename */
     75        "",                                                                     /* voc_effects_filename */
     76        "",                                                                     /* mp3_effects_filename */
    7377        "GDEMO",                                                                                        /* gamepc_filename */
    7478};
    7579
     
    8791        1660 / 4,                                                                                       /* SOUND_INDEX_BASE */
    8892        "SIMON2.GME",                                                                   /* gme_filename */
    8993        "SIMON2.WAV",                                                                   /* wav_filename */
    90         "SIMON2.VOC",                                                                   /* wav_filename2 */
    91         "",
     94        "SIMON2.VOC",                                                                   /* voc_filename */
     95        ""      ,                                                                       /* mp3_filename */
     96        "",                                                                             /* voc_effects_filename */
     97        "",                                                                             /* mp3_effects_filename */
    9298        "GSPTR30",                                                                              /* gamepc_filename */
    9399};
    94100
     
    106112        1660 / 4,                                                                                       /* SOUND_INDEX_BASE */
    107113        "SIMON2.GME",                                                                   /* gme_filename */
    108114        "",                                                                             /* wav_filename */
    109         "",
    110         "",
     115        "",                                                                             /* voc_filename */
     116        "",                                                                             /* mp3_filename */
     117        "",                                                                             /* voc_effects_filename */
     118        "",                                                                             /* mp3_effects_filename */
    111119        "GAME32",                                                                                       /* gamepc_filename */
    112120};
    113121
     
    46494657{
    46504658        /* only read voice file in windows game */
    46514659        if (_game & GAME_WIN) {
     4660                const char *m = gss->mp3_filename;
    46524661                const char *s = gss->wav_filename;
    4653                 const char *s2 = gss->wav_filename2;
    4654                 const char *e = gss->effects_filename;
     4662                const char *s2 = gss->voc_filename;
     4663                const char *e = gss->voc_effects_filename;
     4664                const char *me = gss->mp3_effects_filename;
    46554665
    46564666                _voice_offsets = NULL;
    46574667
    46584668                _voice_file = new File();
    4659                 _voice_file->open(s, _gameDataPath);
     4669#ifdef USE_MAD
     4670                _voice_file->open(m, _gameDataPath);
    46604671                if (_voice_file->isOpen() == false) {
    4661                         warning("Cannot open voice file %s, trying %s", s, s2);
    4662                         if (s2) {
    4663                                 _voice_file->open(s2, _gameDataPath);
    4664                                 if (_voice_file->isOpen() == false) {
    4665                                         warning("Cannot open voice file %s", s2);
     4672#endif
     4673                        _voice_file->open(s, _gameDataPath);
     4674                        if (_voice_file->isOpen() == false) {
     4675                                warning("Cannot open voice file %s, trying %s", s, s2);
     4676                                if (s2) {
     4677                                        _voice_file->open(s2, _gameDataPath);
     4678                                        if (_voice_file->isOpen() == false) {
     4679                                                warning("Cannot open voice file %s", s2);
     4680                                                return;
     4681                                        }
     4682                                } else
    46664683                                        return;
    4667                                 }
    4668                         } else
     4684                        }
     4685#ifdef USE_MAD
     4686                        else
    46694687                                return;
    46704688                }
     4689#endif
    46714690
    46724691                _voice_offsets = (uint32 *)malloc(gss->NUM_VOICE_RESOURCES * sizeof(uint32));
    46734692                if (_voice_offsets == NULL)
     
    46784697
    46794698                _effects_offsets = NULL;
    46804699                _effects_file = new File();
    4681                 _effects_file->open(e, _gameDataPath);
     4700
     4701#ifdef USE_MAD
     4702                _effects_file->open(me, _gameDataPath);
     4703                if (_effects_file->isOpen() == false ) {
     4704#endif
     4705                        _effects_file->open(e, _gameDataPath);
     4706#ifdef USE_MAD
     4707                }
     4708#endif
    46824709                if (_effects_file->isOpen() == true)
    46834710                {
    46844711                        _effects_offsets = (uint32 *)malloc(gss->NUM_EFFECTS_RESOURCES * sizeof(uint32));
     
    47274754        uint16 datablock_offset;
    47284755        uint16 version;
    47294756        uint16 id;
    4730         uint8 blocktype;
    47314757} GCC_PACK;
    47324758
    47334759struct VocBlockHeader {
    4734         uint8 tc;
     4760        uint8 blocktype;
     4761        uint8 size[3];
     4762        uint8 sr;
    47354763        uint8 pack;
    47364764} GCC_PACK;
    47374765
     
    47404768#pragma END_PACK_STRUCTS
    47414769#endif
    47424770
    4743 
    47444771void SimonState::playVoice(uint voice)
    47454772{
    47464773        if (_voice_offsets == NULL)
     
    47494776        _mixer->stop(_voice_sound);
    47504777        _voice_file->seek(_voice_offsets[voice], SEEK_SET);
    47514778
    4752         const char *s2 = gss->wav_filename2;
     4779#ifdef USE_MAD
     4780        const char *m = gss->mp3_filename;
     4781        File music_file;
     4782        music_file.open(m, _gameDataPath);
     4783        if (music_file.isOpen() == true) {
     4784
     4785                uint32 size = _voice_offsets[voice+1] - _voice_offsets[voice];
     4786
     4787                byte *sound = (byte *)malloc(size);
     4788                _voice_file->read(sound, size);
     4789
     4790                _mixer->playMP3(&_voice_sound, sound, size, SoundMixer::FLAG_AUTOFREE);
     4791        } else {
     4792#endif 
     4793        const char *s2 = gss->voc_filename;
    47534794        File music_file;
    47544795        music_file.open(s2, _gameDataPath);
     4796
    47554797        if (music_file.isOpen() == false) {                     /* WAVE audio */
    47564798                WaveHeader wave_hdr;
    47574799                uint32 data[2];
     
    47914833                        return;
    47924834                }
    47934835
    4794                 _voice_file->read(&size, 4);
    4795                 size = size & 0xffffff;
    4796                 _voice_file->seek(-1, SEEK_CUR);
    47974836                _voice_file->read(&voc_block_hdr, sizeof(voc_block_hdr));
    47984837
    4799                 uint32 samples_per_sec = 1000000L / (256L - (long)voc_block_hdr.tc);
     4838                size = voc_block_hdr.size[0] + (voc_block_hdr.size[1] << 8) + (voc_block_hdr.size[2] << 16) - 2;
     4839                uint32 samples_per_sec = 1000000L / (256L - (long)voc_block_hdr.sr);
    48004840
    48014841                byte *buffer = (byte *)malloc(size);
    48024842                _voice_file->read(buffer, size);
    48034843
    48044844                _mixer->playRaw(&_voice_sound, buffer, size, samples_per_sec, SoundMixer::FLAG_UNSIGNED);
    48054845        }
     4846#ifdef USE_MAD
     4847        }
     4848#endif
    48064849}
    48074850
    48084851
     
    48104853{
    48114854        if (_game & GAME_WIN) {
    48124855                if (_effects_offsets) {                 /* VOC sound file */
     4856#ifdef USE_MAD
     4857                        const char *m = gss->mp3_filename;
     4858                        File music_file;
     4859                        music_file.open(m, _gameDataPath);
     4860                        if (music_file.isOpen() == true) {
     4861                                _effects_file->seek(_effects_offsets[sound], SEEK_SET);
     4862                                uint32 size = _effects_offsets[sound+1] - _effects_offsets[sound];
     4863
     4864                                byte *buffer = (byte *)malloc(size);
     4865                                _effects_file->read(buffer, size);
     4866
     4867                                _mixer->playMP3(&_effects_sound, buffer, size, SoundMixer::FLAG_AUTOFREE);
     4868                        } else {
     4869#endif
    48134870                        VocHeader voc_hdr;
    48144871                        VocBlockHeader voc_block_hdr;
    48154872                        uint32 size;
     
    48244881                                return;
    48254882                        }
    48264883
    4827                         _effects_file->read(&size, 4);
    4828                         // FIXME - do we really want to read a block of 4 bytes, ignoring endian issues?
    4829                         printf("FOO %08x / %d (please report this to Fingolfin)\n", size, size & 0xffffff);
    4830                         size = size & 0xffffff;
    4831                         _effects_file->seek(-1, SEEK_CUR);
    48324884                        _effects_file->read(&voc_block_hdr, sizeof(voc_block_hdr));
    48334885
    4834                         uint32 samples_per_sec = 1000000L / (256L - (long)voc_block_hdr.tc);
     4886                        size = voc_block_hdr.size[0] + (voc_block_hdr.size[1] << 8) + (voc_block_hdr.size[2] << 16) - 2;
     4887                        uint32 samples_per_sec = 1000000L / (256L - (long)voc_block_hdr.sr);
    48354888
    48364889                        byte *buffer = (byte *)malloc(size);
    48374890                        _effects_file->read(buffer, size);
    48384891
    48394892                        _mixer->playRaw(&_effects_sound, buffer, size, samples_per_sec, SoundMixer::FLAG_UNSIGNED);
     4893#ifdef USE_MAD
     4894                        }
     4895#endif
    48404896                } else {
    48414897                /* FIXME: not properly implemented */
    48424898                /* Simon 2 dos talkie sfx aren't supported */
    48434899                /* Simon 2 dos sfx isn't supported */
    4844                 const char *s2 = gss->wav_filename2;
     4900                const char *s2 = gss->voc_filename;
    48454901                File music_file;
    48464902                music_file.open(s2, _gameDataPath);
    48474903                if (music_file.isOpen() == false) {
     
    48844940        /* FIXME: not properly implemented */
    48854941        /* Simon 2 dos talkie music isn't supported */
    48864942        /* Simon 2 dos music isn't supported */
    4887         const char *s2 = gss->wav_filename2;
     4943        const char *s = gss->wav_filename;
    48884944        File music_file;
    4889         music_file.open(s2, _gameDataPath);
    4890         if (music_file.isOpen() == false) {
     4945        music_file.open(s, _gameDataPath);
     4946        if (music_file.isOpen() == true) {
    48914947       
    48924948                midi.shutdown();
    48934949