diff options
-rw-r--r-- | video/coktel_decoder.cpp | 41 | ||||
-rw-r--r-- | video/coktel_decoder.h | 2 |
2 files changed, 30 insertions, 13 deletions
diff --git a/video/coktel_decoder.cpp b/video/coktel_decoder.cpp index 26b12220f2..fd9c2be8ed 100644 --- a/video/coktel_decoder.cpp +++ b/video/coktel_decoder.cpp @@ -220,6 +220,14 @@ void CoktelDecoder::disableSound() { _audioStream = 0; } +void CoktelDecoder::finishSound() { + if (!_audioStream) + return; + + _audioStream->finish(); + _soundStage = kSoundFinished; +} + void CoktelDecoder::colorModeChanged() { } @@ -1531,9 +1539,10 @@ VMDDecoder::VMDDecoder(Audio::Mixer *mixer, Audio::Mixer::SoundType soundType) : _stream(0), _version(0), _flags(0), _frameInfoOffset(0), _partsPerFrame(0), _frames(0), _soundFlags(0), _soundFreq(0), _soundSliceSize(0), _soundSlicesCount(0), _soundBytesPerSample(0), _soundStereo(0), _soundHeaderSize(0), _soundDataSize(0), - _audioFormat(kAudioFormat8bitRaw), _hasVideo(false), _videoCodec(0), - _blitMode(0), _bytesPerPixel(0), _firstFramePos(0), _videoBufferSize(0), - _externalCodec(false), _codec(0), _subtitle(-1), _isPaletted(true) { + _soundLastFilledFrame(0), _audioFormat(kAudioFormat8bitRaw), + _hasVideo(false), _videoCodec(0), _blitMode(0), _bytesPerPixel(0), + _firstFramePos(0), _videoBufferSize(0), _externalCodec(false), _codec(0), + _subtitle(-1), _isPaletted(true) { _videoBuffer [0] = 0; _videoBuffer [1] = 0; @@ -1896,6 +1905,7 @@ bool VMDDecoder::readFrameTable(int &numFiles) { _frames[i].offset = _stream->readUint32LE(); } + _soundLastFilledFrame = 0; for (uint16 i = 0; i < _frameCount; i++) { bool separator = false; @@ -1910,6 +1920,9 @@ bool VMDDecoder::readFrameTable(int &numFiles) { _frames[i].parts[j].flags = _stream->readByte(); _stream->skip(9); // Unknown + if (_frames[i].parts[j].flags != 3) + _soundLastFilledFrame = i; + } else if (_frames[i].parts[j].type == kPartTypeVideo) { _frames[i].parts[j].left = _stream->readUint16LE(); @@ -2006,15 +2019,16 @@ void VMDDecoder::close() { _partsPerFrame = 0; _frames = 0; - _soundFlags = 0; - _soundFreq = 0; - _soundSliceSize = 0; - _soundSlicesCount = 0; - _soundBytesPerSample = 0; - _soundStereo = 0; - _soundHeaderSize = 0; - _soundDataSize = 0; - _audioFormat = kAudioFormat8bitRaw; + _soundFlags = 0; + _soundFreq = 0; + _soundSliceSize = 0; + _soundSlicesCount = 0; + _soundBytesPerSample = 0; + _soundStereo = 0; + _soundHeaderSize = 0; + _soundDataSize = 0; + _soundLastFilledFrame = 0; + _audioFormat = kAudioFormat8bitRaw; _hasVideo = false; _videoCodec = 0; @@ -2101,7 +2115,8 @@ void VMDDecoder::processFrame() { // Empty sound slice if (_soundEnabled) { - emptySoundSlice(_soundDataSize * _soundBytesPerSample); + if ((uint32)_curFrame < _soundLastFilledFrame) + emptySoundSlice(_soundDataSize * _soundBytesPerSample); if (_soundStage == kSoundLoaded) startSound = true; diff --git a/video/coktel_decoder.h b/video/coktel_decoder.h index 0cbd00ea8c..6ef72eb513 100644 --- a/video/coktel_decoder.h +++ b/video/coktel_decoder.h @@ -105,6 +105,7 @@ public: void enableSound(); void disableSound(); + void finishSound(); virtual void colorModeChanged(); @@ -453,6 +454,7 @@ private: byte _soundStereo; // (0: mono, 1: old-style stereo, 2: new-style stereo) uint32 _soundHeaderSize; uint32 _soundDataSize; + uint32 _soundLastFilledFrame; AudioFormat _audioFormat; // Video properties |