aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2010-03-22 15:54:56 +0000
committerJohannes Schickel2010-03-22 15:54:56 +0000
commit86653687d7369a46ac25ef4a3cd513b401807c67 (patch)
tree72b8042a9325fbf89e0271d37e484d86d5973c9f
parenta725b490e8a190e276fc689d4a147b7c49e98d7c (diff)
downloadscummvm-rg350-86653687d7369a46ac25ef4a3cd513b401807c67.tar.gz
scummvm-rg350-86653687d7369a46ac25ef4a3cd513b401807c67.tar.bz2
scummvm-rg350-86653687d7369a46ac25ef4a3cd513b401807c67.zip
Fix for bug #2969211 "NIPPON: Crash in Intro".
It is not a good idea to supply an SubLoopingAudioStream with the start and end time to be exactly the same time. Clarify that in the SubLoopingAudioStream documentation, add an assert in the SubLoopingAudioStream constructor for that case and also prevent make8SVXStream from doing so. svn-id: r48356
-rw-r--r--sound/audiostream.cpp2
-rw-r--r--sound/audiostream.h10
-rw-r--r--sound/decoders/iff_sound.cpp4
3 files changed, 15 insertions, 1 deletions
diff --git a/sound/audiostream.cpp b/sound/audiostream.cpp
index 1d81eba608..ce2c521e5e 100644
--- a/sound/audiostream.cpp
+++ b/sound/audiostream.cpp
@@ -169,6 +169,8 @@ SubLoopingAudioStream::SubLoopingAudioStream(SeekableAudioStream *stream,
_loopStart(convertTimeToStreamPos(loopStart, getRate(), isStereo())),
_loopEnd(convertTimeToStreamPos(loopEnd, getRate(), isStereo())),
_done(false) {
+ assert(loopStart < loopEnd);
+
if (!_parent->rewind())
_done = true;
}
diff --git a/sound/audiostream.h b/sound/audiostream.h
index 1cb6a422c2..37a1953bb9 100644
--- a/sound/audiostream.h
+++ b/sound/audiostream.h
@@ -229,6 +229,16 @@ AudioStream *makeLoopingAudioStream(SeekableAudioStream *stream, Timestamp start
*/
class SubLoopingAudioStream : public AudioStream {
public:
+ /**
+ * Constructor for a SubLoopingAudioStream.
+ *
+ * @param stream Stream to loop
+ * @param loops How often the stream should be looped (0 means infinite)
+ * @param loopStart Start of the loop (this must be smaller than loopEnd)
+ * @param loopEnd End of the loop (thus must be greater than loopStart)
+ * @param disposeAfterUse Whether the stream should be disposed, when the
+ * SubLoopingAudioStream is destroyed.
+ */
SubLoopingAudioStream(SeekableAudioStream *stream, uint loops,
const Timestamp loopStart,
const Timestamp loopEnd,
diff --git a/sound/decoders/iff_sound.cpp b/sound/decoders/iff_sound.cpp
index b365015a2b..92054901e4 100644
--- a/sound/decoders/iff_sound.cpp
+++ b/sound/decoders/iff_sound.cpp
@@ -117,9 +117,11 @@ AudioStream *make8SVXStream(Common::ReadStream &input, bool loop) {
loopStart = loader._header.oneShotHiSamples;
loopEnd = loader._header.oneShotHiSamples + loader._header.repeatHiSamples;
- return new SubLoopingAudioStream(stream, 0,
+ if (loopStart != loopEnd) {
+ return new SubLoopingAudioStream(stream, 0,
Timestamp(0, loopStart, loader._header.samplesPerSec),
Timestamp(0, loopEnd, loader._header.samplesPerSec));
+ }
}
return stream;