Ticket #8904: bs2-archive-pre.patch

File bs2-archive-pre.patch, 7.4 KB (added by peres, 11 years ago)

Changes needed in BS2 before Archive and SearchSet can be used (this is already contained in bs2-archive.patch).

  • animation.cpp

     
    865865// Factory function for creating the appropriate cutscene player
    866866///////////////////////////////////////////////////////////////////////////////
    867867
    868 MoviePlayer *makeMoviePlayer(Sword2Engine *vm, const char *name) {
     868MoviePlayer *Sword2Engine::makeMoviePlayer(const char *name) {
    869869        static char filename[20];
    870870
    871871#ifdef USE_ZLIB
    872872        snprintf(filename, sizeof(filename), "%s.dxa", name);
    873873
    874874        if (Common::File::exists(filename)) {
    875                 return new MoviePlayerDXA(vm, name);
     875                return new MoviePlayerDXA(this, name);
    876876        }
    877877#endif
    878878
     
    880880        snprintf(filename, sizeof(filename), "%s.mp2", name);
    881881
    882882        if (Common::File::exists(filename)) {
    883                 return new MoviePlayerMPEG(vm, name);
     883                return new MoviePlayerMPEG(this, name);
    884884        }
    885885#endif
    886886
    887         return new MoviePlayerDummy(vm, name);
     887        return new MoviePlayerDummy(this, name);
    888888}
    889889
    890890} // End of namespace Sword2
  • function.cpp

     
    21392139        // pause sfx during sequence
    21402140        _vm->_sound->pauseFx();
    21412141
    2142         MoviePlayer *player = makeMoviePlayer(_vm, filename);
     2142        MoviePlayer *player = _vm->makeMoviePlayer(filename);
    21432143
    21442144        if (player->load()) {
    21452145                player->play(_sequenceTextList, _sequenceTextLines, _smackerLeadIn, _smackerLeadOut);
  • music.cpp

     
    5151
    5252static Audio::AudioStream *makeCLUStream(Common::File *fp, int size);
    5353
    54 static Audio::AudioStream *getAudioStream(SoundFileHandle *fh, const char *base, int cd, uint32 id, uint32 *numSamples) {
    55         bool alreadyOpen;
     54Audio::AudioStream *resetAudioStream(SoundFileHandle *fh, const char *base, uint32 id, uint32 *numSamples, bool alreadyOpen) {
    5655
    57         if (!fh->file.isOpen()) {
    58                 alreadyOpen = false;
    59 
    60                 struct {
    61                         const char *ext;
    62                         int mode;
    63                 } file_types[] = {
    64         #ifdef USE_FLAC
    65                         { "clf", kFlacMode },
    66         #endif
    67         #ifdef USE_VORBIS
    68                         { "clg", kVorbisMode },
    69         #endif
    70         #ifdef USE_MAD
    71                         { "cl3", kMP3Mode },
    72         #endif
    73                         { "clu", kCLUMode }
    74                 };
    75 
    76                 int soundMode = 0;
    77                 char filename[20];
    78 
    79                 for (int i = 0; i < ARRAYSIZE(file_types); i++) {
    80                         sprintf(filename, "%s%d.%s", base, cd, file_types[i].ext);
    81                         if (Common::File::exists(filename)) {
    82                                 soundMode = file_types[i].mode;
    83                                 break;
    84                         }
    85 
    86                         sprintf(filename, "%s.%s", base, file_types[i].ext);
    87                         if (Common::File::exists(filename)) {
    88                                 soundMode = file_types[i].mode;
    89                                 break;
    90                         }
    91                 }
    92 
    93                 if (soundMode == 0)
    94                         return NULL;
    95 
    96                 fh->file.open(filename);
    97                 fh->fileType = soundMode;
    98                 if (!fh->file.isOpen()) {
    99                         warning("BS2 getAudioStream: Failed opening file '%s'", filename);
    100                         return NULL;
    101                 }
    102                 if (fh->fileSize != fh->file.size()) {
    103                         if (fh->idxTab) {
    104                                 free(fh->idxTab);
    105                                 fh->idxTab = NULL;
    106                         }
    107                 }
    108         } else
    109                 alreadyOpen = true;
    110 
    11156        uint32 entrySize = (fh->fileType == kCLUMode) ? 2 : 3;
    11257
    11358        if (!fh->idxTab) {
     
    173118        default:
    174119                return NULL;
    175120        }
     121
    176122}
    177123
     124Audio::AudioStream *Sound::getAudioStream(SoundFileHandle *fh, const char *base, int cd, uint32 id, uint32 *numSamples) {
     125        bool alreadyOpen;
     126
     127        if (!fh->file.isOpen()) {
     128                alreadyOpen = false;
     129
     130                struct {
     131                        const char *ext;
     132                        int mode;
     133                } file_types[] = {
     134        #ifdef USE_FLAC
     135                        { "clf", kFlacMode },
     136        #endif
     137        #ifdef USE_VORBIS
     138                        { "clg", kVorbisMode },
     139        #endif
     140        #ifdef USE_MAD
     141                        { "cl3", kMP3Mode },
     142        #endif
     143                        { "clu", kCLUMode }
     144                };
     145
     146                int soundMode = 0;
     147                char filename[20];
     148
     149                for (int i = 0; i < ARRAYSIZE(file_types); i++) {
     150                        sprintf(filename, "%s%d.%s", base, cd, file_types[i].ext);
     151                        if (Common::File::exists(filename)) {
     152                                soundMode = file_types[i].mode;
     153                                break;
     154                        }
     155
     156                        sprintf(filename, "%s.%s", base, file_types[i].ext);
     157                        if (Common::File::exists(filename)) {
     158                                soundMode = file_types[i].mode;
     159                                break;
     160                        }
     161                }
     162
     163                if (soundMode == 0)
     164                        return NULL;
     165
     166                fh->file.open(filename);
     167                fh->fileType = soundMode;
     168                if (!fh->file.isOpen()) {
     169                        warning("BS2 getAudioStream: Failed opening file '%s'", filename);
     170                        return NULL;
     171                }
     172                if (fh->fileSize != fh->file.size()) {
     173                        if (fh->idxTab) {
     174                                free(fh->idxTab);
     175                                fh->idxTab = NULL;
     176                        }
     177                }
     178        } else
     179                alreadyOpen = true;
     180
     181        return resetAudioStream(fh, base, id, numSamples, alreadyOpen);
     182}
     183
     184
    178185// ----------------------------------------------------------------------------
    179186// Custom AudioStream class to handle Broken Sword 2's audio compression.
    180187// ----------------------------------------------------------------------------
     
    262269// The length of a fade-in/out, in milliseconds.
    263270#define FADE_LENGTH 3000
    264271
    265 MusicInputStream::MusicInputStream(int cd, SoundFileHandle *fh, uint32 musicId, bool looping) {
    266         _cd = cd;
     272MusicInputStream::MusicInputStream(Audio::AudioStream *decoder, SoundFileHandle *fh, uint32 musicId, uint32 numSamples, bool looping) {
    267273        _fh = fh;
    268274        _musicId = musicId;
     275        _numSamples = numSamples;
    269276        _looping = looping;
    270277
    271278        _bufferEnd = _buffer + BUFFER_SIZE;
    272279        _remove = false;
    273280        _fading = 0;
    274281
    275         _decoder = getAudioStream(_fh, "music", _cd, _musicId, &_numSamples);
     282        _decoder = decoder;
    276283        if (_decoder) {
    277284                _samplesLeft = _numSamples;
    278285                _fadeSamples = (getRate() * FADE_LENGTH) / 1000;
     
    283290        }
    284291}
    285292
     293
    286294MusicInputStream::~MusicInputStream() {
    287295        delete _decoder;
    288296        _decoder = NULL;
     
    390398        if (!_samplesLeft) {
    391399                if (_looping) {
    392400                        delete _decoder;
    393                         _decoder = getAudioStream(_fh, "music", _cd, _musicId, &_numSamples);
     401                        _decoder = resetAudioStream(_fh, "music", _musicId, &_numSamples, true);
    394402                        _samplesLeft = _numSamples;
    395403                } else
    396404                        _remove = true;
     
    617625        fh->inUse = true;
    618626        _mutex.unlock();
    619627
    620         MusicInputStream *tmp = new MusicInputStream(cd, fh, musicId, loop);
     628        uint32 numSamples;
     629        Audio::AudioStream *decoder = getAudioStream(fh, "music", cd, musicId, &numSamples);
     630        MusicInputStream *tmp = new MusicInputStream(decoder, fh, musicId, numSamples, loop);
    621631
    622632        if (tmp->isReady()) {
    623633                _mutex.lock();
  • sound.h

     
    155155        }
    156156
    157157public:
    158         MusicInputStream(int cd, SoundFileHandle *fh, uint32 musicId, bool looping);
     158        MusicInputStream(Audio::AudioStream *decoder, SoundFileHandle *fh, uint32 musicId, uint32 numSamples, bool looping);
    159159        ~MusicInputStream();
    160160
    161161        int readBuffer(int16 *buffer, const int numSamples);
     
    281281        int32 streamCompMusic(uint32 musicId, bool loop);
    282282        void stopMusic(bool immediately);
    283283        int32 musicTimeRemaining();
     284
     285        Audio::AudioStream *getAudioStream(SoundFileHandle *fh, const char *base, int cd, uint32 id, uint32 *numSamples);
    284286};
    285287
    286288} // End of namespace Sword2
  • sword2.h

     
    6262class FontRenderer;
    6363class Gui;
    6464class Debugger;
     65class MoviePlayer;
    6566
    6667enum {
    6768        RD_LEFTBUTTONDOWN               = 0x01,
     
    228229
    229230        void runStart(int start);
    230231
     232        MoviePlayer *makeMoviePlayer(const char *name);
     233
    231234        // Convenience alias for OSystem::getMillis().
    232235        // This is a bit hackish, of course :-).
    233236        uint32 getMillis();