Ticket #1399: sword-animation.diff

File sword-animation.diff, 8.0 KB (added by eriktorbjorn, 21 years ago)

Patch against a January 22 CVS snapshot

  • scummvm/sword1/animation.cpp

    diff -ur --exclude=CVS ScummVM/scummvm/sword1/animation.cpp ScummVM+hack/scummvm/sword1/animation.cpp
    old new  
    125125
    126126        info = mpeg2_info(decoder);
    127127        framenum = 0;
    128         ticks = _sys->get_msecs();
    129128
    130         /* Play audio - TODO: Sync with video?*/
     129        // Play audio
    131130
    132131#ifdef USE_VORBIS
    133132        // Another TODO: There is no reason that this only allows OGG, and not
     
    139138                bgSoundStream = makeVorbisStream(sndfile, sndfile->size());
    140139                _snd->playInputStream(&bgSound, bgSoundStream, false, 255, 0, -1);
    141140        }
    142 
    143141#endif
    144142
     143        startTime = _sys->get_msecs();
     144
    145145        return true;
    146146#else /* USE_MPEG2 */
    147147        return false;
     
    298298                case STATE_SLICE:
    299299                case STATE_END:
    300300                        if (info->display_fbuf) {
    301                                 /* simple audio video sync code:
    302                                  * we calculate the actual frame by taking the delivered audio samples
    303                                  * we add 2 frames as the number of samples delivered is higher than the
    304                                  * number actually played due to buffering
    305                                  *
    306                                  * we then try to stay inside +- 1 frame of this calculated frame number by
    307                                  * dropping frames if we run behind and delaying if we are too fast
    308                                  */
    309 
    310 #ifdef BACKEND_8BIT
    311                                 if (checkPaletteSwitch() || (bgSoundStream == NULL) ||
    312                                     (bgSoundStream->getSamplesPlayed()*12/bgSoundStream->getRate()) < (framenum+3)){
    313                                         _scr->plotYUV(lut, sequence_i->width, sequence_i->height, info->display_fbuf->buf);
    314 
    315                                         if (bgSoundStream) {
    316                                                 while ((bgSoundStream->getSamplesPlayed()*12/bgSoundStream->getRate()) < framenum+1)
    317                                                         _sys->delay_msecs(10);
    318                                         } else {
    319                                                 ticks += 83;
    320                                                 while (_sys->get_msecs() < ticks)
    321                                                         _sys->delay_msecs(10);
    322                                         }
     301                                // Audio/video sync is extremely simple. We
     302                                // just keep track of how long it's been since
     303                                // the audio track was started to calculate an
     304                                // approximate frame number. We try not to lag
     305                                // more than one frame behind this.
     306                                //
     307                                // We do it this way since there is no way of
     308                                // asking the mixer how many samples have
     309                                // actually been played.
     310
     311                                // FIXME: We shouldn't use delay_msecs() here.
     312                                // We should use something like the delay()
     313                                // function in SwordEngine, so that events are
     314                                // handled properly. For now, at least call the
     315                                // backend's event handler so that redraw
     316                                // events are processed.
    323317
     318                                OSystem::Event event;
    324319
     320#ifdef BACKEND_8BIT
    325321
     322                                if (checkPaletteSwitch() || _sys->get_msecs() < startTime + (1000 * (framenum + 1)) / 12) {
     323                                        _scr->plotYUV(lut, sequence_i->width, sequence_i->height, info->display_fbuf->buf);
     324                                        if (startTime + (1000 * framenum) / 12 > _sys->get_msecs())
     325                                                _sys->delay_msecs(startTime + (1000 * framenum) / 12 - _sys->get_msecs());
     326                                        _sys->poll_event(&event);
    326327                                } else
    327328                                        warning("dropped frame %i", framenum);
    328329
     
    330331
    331332#else
    332333
    333                                 if ((bgSoundStream == NULL) || (bgSoundStream->getSamplesPlayed()*12/bgSoundStream->getRate()) < (framenum+3)){
     334                                if (_sys->get_msecs() < startTime + (1000 * (framenum + 1)) / 12) {
    334335                                        plotYUV(lookup2, sequence_i->width, sequence_i->height, info->display_fbuf->buf);
    335 
    336                                         if (bgSoundStream) {
    337                                                 while ((bgSoundStream->getSamplesPlayed()*12/bgSoundStream->getRate()) < framenum+1)
    338                                                         _sys->delay_msecs(10);
    339                                         } else {
    340                                                 ticks += 83;
    341                                                 while (_sys->get_msecs() < ticks)
    342                                                         _sys->delay_msecs(10);
    343                                         }
    344 
     336                                        if (startTime + (1000 * framenum) / 12 > _sys->get_msecs())
     337                                                _sys->delay_msecs(startTime + (1000 * framenum) / 12 - _sys->get_msecs());
     338                                        _sys->poll_event(&event);
    345339                                } else
    346340                                        warning("dropped frame %i", framenum);
    347341
     
    349343
    350344                                framenum++;
    351345                                return true;
    352 
    353346                        }
    354347                        break;
    355348
  • scummvm/sword1/animation.h

    diff -ur --exclude=CVS ScummVM/scummvm/sword1/animation.h ScummVM+hack/scummvm/sword1/animation.h
    old new  
    7676        SoundMixer *_snd;
    7777        OSystem *_sys;
    7878
    79         int framenum;
    80         uint32 ticks;
     79        uint framenum;
     80        uint32 startTime;
    8181
    8282#ifdef USE_MPEG2
    8383        mpeg2dec_t *decoder;
     
    107107
    108108        struct {
    109109                int cnt;
    110                 int end;
     110                uint end;
    111111                byte pal[4 * 256];
    112112        } palettes[50];
    113113#else
  • scummvm/sword2/driver/animation.cpp

    diff -ur --exclude=CVS ScummVM/scummvm/sword2/driver/animation.cpp ScummVM+hack/scummvm/sword2/driver/animation.cpp
    old new  
    128128
    129129        info = mpeg2_info(decoder);
    130130        framenum = 0;
    131         ticks = _vm->_system->get_msecs();
    132131
    133132        // Play audio
    134133
     
    140139        if (sndfile->open(tempFile)) {
    141140                bgSoundStream = makeVorbisStream(sndfile, sndfile->size());
    142141                _vm->_mixer->playInputStream(&bgSound, bgSoundStream, false, 255, 0, -1);
     142               
    143143        }
    144 
    145144#endif
    146145
     146        startTime = _vm->_system->get_msecs();
     147
    147148        return true;
    148149#else /* USE_MPEG2 */
    149150        return false;
     
    337338                case STATE_SLICE:
    338339                case STATE_END:
    339340                        if (info->display_fbuf) {
    340                                 /* simple audio video sync code:
    341                                  * we calculate the actual frame by taking the delivered audio samples
    342                                  * we add 2 frames as the number of samples delivered is higher than the
    343                                  * number actually played due to buffering
    344                                  *
    345                                  * we then try to stay inside +- 1 frame of this calculated frame number by
    346                                  * dropping frames if we run behind and delaying if we are too fast
    347                                  */
     341                                // Audio/video sync is extremely simple. We
     342                                // just keep track of how long it's been since
     343                                // the audio track was started to calculate an
     344                                // approximate frame number. We try not to lag
     345                                // more than one frame behind this.
     346                                //
     347                                // We do it this way since there is no way of
     348                                // asking the mixer how many samples have
     349                                // actually been played.
    348350
    349351#ifdef BACKEND_8BIT
    350                                 if (checkPaletteSwitch() || (bgSoundStream == NULL) ||
    351                                         (bgSoundStream->getSamplesPlayed() * 12 / bgSoundStream->getRate()) < (framenum + 3)){
    352352
     353                                if (checkPaletteSwitch() || _vm->_system->get_msecs() < startTime + (1000 * (framenum + 1)) / 12) {
    353354                                        _vm->_graphics->plotYUV(lut, sequence_i->width, sequence_i->height, info->display_fbuf->buf);
    354 
    355                                         if (bgSoundStream) {
    356                                                 while ((bgSoundStream->getSamplesPlayed() * 12 / bgSoundStream->getRate()) < framenum + 1)
    357                                                         _vm->_system->delay_msecs(10);
    358                                         } else {
    359                                                 ticks += 83;
    360                                                 _vm->sleepUntil(ticks);
    361                                         }
    362 
     355                                        _vm->sleepUntil(startTime + (1000 * framenum) / 12);
    363356                                        _vm->_graphics->setNeedFullRedraw();
    364 
    365357                                } else
    366358                                        warning("dropped frame %i", framenum);
    367359
     
    369361
    370362#else
    371363
    372                                 if ((bgSoundStream == NULL) ||
    373                                         (bgSoundStream->getSamplesPlayed() * 12 / bgSoundStream->getRate()) < (framenum+3)){
    374 
     364                                if (_vm->_system->get_msecs() < startTime + (1000 * (framenum + 1)) / 12) {
    375365                                        plotYUV(lookup2, sequence_i->width, sequence_i->height, info->display_fbuf->buf);
    376 
    377                                         if (bgSoundStream) {
    378                                                 while ((bgSoundStream->getSamplesPlayed() * 12 / bgSoundStream->getRate()) < framenum + 1)
    379                                                         _vm->_system->delay_msecs(10);
    380                                         } else {
    381                                                 ticks += 83;
    382                                                 _vm->sleepUntil(ticks);
    383                                         }
    384 
     366                                        _vm->sleepUntil(startTime + (1000 * framenum) / 12);
    385367                                } else
    386368                                        warning("dropped frame %i", framenum);
    387369
     
    389371
    390372                                framenum++;
    391373                                return true;
    392 
    393374                        }
    394375                        break;
    395376
  • scummvm/sword2/driver/animation.h

    diff -ur --exclude=CVS ScummVM/scummvm/sword2/driver/animation.h ScummVM+hack/scummvm/sword2/driver/animation.h
    old new  
    6969private:
    7070        Sword2Engine *_vm;
    7171
    72         int framenum;
    73         int ticks;
     72        uint framenum;
     73        uint32 startTime;
    7474
    7575#ifdef USE_MPEG2
    7676        mpeg2dec_t *decoder;
     
    100100
    101101        struct {
    102102                int cnt;
    103                 int end;
     103                uint end;
    104104                byte pal[4 * 256];
    105105        } palettes[50];
    106106#else