[Scummvm-git-logs] scummvm master -> 38ca2062b8039e2ff78ac93d91380b64e4029de5

djsrv dservilla at gmail.com
Mon Jul 19 17:40:45 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
38ca2062b8 DIRECTOR: Handle D4 differences in sound looping behavior


Commit: 38ca2062b8039e2ff78ac93d91380b64e4029de5
    https://github.com/scummvm/scummvm/commit/38ca2062b8039e2ff78ac93d91380b64e4029de5
Author: djsrv (dservilla at gmail.com)
Date: 2021-07-19T13:38:55-04:00

Commit Message:
DIRECTOR: Handle D4 differences in sound looping behavior

Changed paths:
    engines/director/cast.cpp
    engines/director/sound.cpp
    engines/director/sound.h


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 0e1b4fc167..c7d68f56d5 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -634,6 +634,11 @@ void Cast::loadSoundCasts() {
 				audio->loadStream(*sndData);
 				soundCast->_audio = audio;
 				soundCast->_size = sndData->size();
+				if (g_director->getVersion() < 400) {
+					// The looping flag wasn't added to sound cast members until D4.
+					// In older versions, always loop sounds that contain a loop start and end.
+					soundCast->_looping = audio->hasLoopBounds();
+				}
 			}
 			delete sndData;
 		}
diff --git a/engines/director/sound.cpp b/engines/director/sound.cpp
index 0e605584d4..99e5a0fbea 100644
--- a/engines/director/sound.cpp
+++ b/engines/director/sound.cpp
@@ -547,12 +547,21 @@ Audio::AudioStream *SNDDecoder::getAudioStream(bool looping, DisposeAfterUse::Fl
 	Audio::SeekableAudioStream *stream = Audio::makeRawStream(buffer, _size, _rate, _flags, disposeAfterUse);
 
 	if (looping) {
-		return new Audio::LoopingAudioStream(stream, 0);
-	} else if (_loopEnd != _loopStart) {
-		return new Audio::SubLoopingAudioStream(stream, 0, Audio::Timestamp(0, _loopStart, _rate), Audio::Timestamp(0, _loopEnd, _rate));
-	} else {
-		return stream;
+		if (hasLoopBounds()) {
+			return new Audio::SubLoopingAudioStream(stream, 0, Audio::Timestamp(0, _loopStart, _rate), Audio::Timestamp(0, _loopEnd, _rate));
+		} else {
+			// Not sure if looping sounds can appear without loop bounds.
+			// Let's just log a warning and loop the entire sound...
+			warning("SNDDecoder::getAudioStream: Looping sound has no loop bounds");
+			return new Audio::LoopingAudioStream(stream, 0);
+		}
 	}
+
+	return stream;
+}
+
+bool SNDDecoder::hasLoopBounds() {
+	return _loopStart != 0 || _loopEnd != 0;
 }
 
 AudioFileDecoder::AudioFileDecoder(Common::String &path)
diff --git a/engines/director/sound.h b/engines/director/sound.h
index 2027de8ac5..201f321a6d 100644
--- a/engines/director/sound.h
+++ b/engines/director/sound.h
@@ -127,6 +127,7 @@ public:
 	bool processCommands(Common::SeekableReadStreamEndian &stream);
 	bool processBufferCommand(Common::SeekableReadStreamEndian &stream);
 	Audio::AudioStream *getAudioStream(bool looping = false, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) override;
+	bool hasLoopBounds();
 
 private:
 	byte *_data;




More information about the Scummvm-git-logs mailing list