[Scummvm-git-logs] scummvm master -> 682d2dbb6c998c03719ee4615bc9bddd577277b8

ysj1173886760 42030331+ysj1173886760 at users.noreply.github.com
Mon Jul 19 10:27:13 UTC 2021


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

Summary:
01ce9792f8 DIRECTOR: implement sub-looping sounds for snd resources
682d2dbb6c DIRECTOR: modify the interface and amend the implementation of sound decoder.


Commit: 01ce9792f83cf9a8b6ca9d8bd00e589637a8ef1d
    https://github.com/scummvm/scummvm/commit/01ce9792f83cf9a8b6ca9d8bd00e589637a8ef1d
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-19T18:26:25+08:00

Commit Message:
DIRECTOR: implement sub-looping sounds for snd resources

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


diff --git a/engines/director/sound.cpp b/engines/director/sound.cpp
index e33ffe04eb..6a1eb2db67 100644
--- a/engines/director/sound.cpp
+++ b/engines/director/sound.cpp
@@ -74,7 +74,7 @@ void DirectorSound::playFile(Common::String filename, uint8 soundChannel) {
 		return;
 
 	AudioFileDecoder af(filename);
-	Audio::RewindableAudioStream *sound = af.getAudioStream(DisposeAfterUse::YES);
+	Audio::AudioStream *sound = af.getAudioStream(DisposeAfterUse::YES);
 
 	cancelFade(soundChannel);
 	_mixer->playStream(Audio::Mixer::kSFXSoundType, &_channels[soundChannel - 1].handle, sound, -1, getChannelVolume(soundChannel));
@@ -398,7 +398,7 @@ uint8 DirectorSound::getSoundLevel(uint8 soundChannel) {
 }
 
 Audio::AudioStream *AudioDecoder::getLoopingAudioStream() {
-	Audio::RewindableAudioStream *target = getAudioStream(DisposeAfterUse::YES);
+	Audio::RewindableAudioStream *target = dynamic_cast<Audio::RewindableAudioStream *> (getAudioStream(DisposeAfterUse::YES));
 	if (!target)
 		return nullptr;
 	return new Audio::LoopingAudioStream(target, 0);
@@ -411,6 +411,7 @@ SNDDecoder::SNDDecoder()
 	_size = 0;
 	_rate = 0;
 	_flags = 0;
+	_loopStart = _loopEnd = 0;
 }
 
 SNDDecoder::~SNDDecoder() {
@@ -491,8 +492,8 @@ bool SNDDecoder::processBufferCommand(Common::SeekableReadStreamEndian &stream)
 	uint32 param = stream.readUint32();
 	_rate = stream.readUint16();
 	/*uint16 rateExt =*/stream.readUint16();
-	/*uint32 loopStart =*/stream.readUint32();
-	/*uint32 loopEnd =*/stream.readUint32();
+	_loopStart = stream.readUint32();
+	_loopEnd = stream.readUint32();
 	byte encoding = stream.readByte();
 	byte baseFrequency = stream.readByte();
 	if (baseFrequency != 0x3c) {
@@ -544,12 +545,15 @@ bool SNDDecoder::processBufferCommand(Common::SeekableReadStreamEndian &stream)
 	return true;
 }
 
-Audio::RewindableAudioStream *SNDDecoder::getAudioStream(DisposeAfterUse::Flag disposeAfterUse) {
+Audio::AudioStream *SNDDecoder::getAudioStream(DisposeAfterUse::Flag disposeAfterUse) {
 	if (!_data)
 		return nullptr;
 	byte *buffer = (byte *)malloc(_size);
 	memcpy(buffer, _data, _size);
-	return Audio::makeRawStream(buffer, _size, _rate, _flags, disposeAfterUse);
+	if (_loopEnd == _loopStart)
+		return Audio::makeRawStream(buffer, _size, _rate, _flags, disposeAfterUse);
+	else
+		return new Audio::SubLoopingAudioStream(Audio::makeRawStream(buffer, _size, _rate, _flags, DisposeAfterUse::YES), 0, Audio::Timestamp(0, _loopStart, _rate), Audio::Timestamp(0, _loopEnd, _rate));
 }
 
 AudioFileDecoder::AudioFileDecoder(Common::String &path)
@@ -557,7 +561,7 @@ AudioFileDecoder::AudioFileDecoder(Common::String &path)
 	_path = path;
 }
 
-Audio::RewindableAudioStream *AudioFileDecoder::getAudioStream(DisposeAfterUse::Flag disposeAfterUse) {
+Audio::AudioStream *AudioFileDecoder::getAudioStream(DisposeAfterUse::Flag disposeAfterUse) {
 	if (_path.empty())
 		return nullptr;
 
diff --git a/engines/director/sound.h b/engines/director/sound.h
index 46592a6986..1ae16bb9d8 100644
--- a/engines/director/sound.h
+++ b/engines/director/sound.h
@@ -114,7 +114,7 @@ public:
 	AudioDecoder() {};
 	virtual ~AudioDecoder() {};
 public:
-	virtual Audio::RewindableAudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) { return nullptr; }
+	virtual Audio::AudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) { return nullptr; }
 	virtual Audio::AudioStream *getLoopingAudioStream();
 };
 
@@ -127,7 +127,7 @@ public:
 	void loadExternalSoundStream(Common::SeekableReadStreamEndian &stream);
 	bool processCommands(Common::SeekableReadStreamEndian &stream);
 	bool processBufferCommand(Common::SeekableReadStreamEndian &stream);
-	Audio::RewindableAudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
+	Audio::AudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
 
 private:
 	byte *_data;
@@ -135,6 +135,8 @@ private:
 	uint32 _size;
 	uint16 _rate;
 	byte _flags;
+	uint32 _loopStart;
+	uint32 _loopEnd;
 };
 
 class AudioFileDecoder : public AudioDecoder {
@@ -144,7 +146,7 @@ public:
 
 	void setPath(Common::String &path);
 
-	Audio::RewindableAudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
+	Audio::AudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
 
 private:
 	Common::String _path;


Commit: 682d2dbb6c998c03719ee4615bc9bddd577277b8
    https://github.com/scummvm/scummvm/commit/682d2dbb6c998c03719ee4615bc9bddd577277b8
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-07-19T18:26:25+08:00

Commit Message:
DIRECTOR: modify the interface and amend the implementation of sound decoder.

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


diff --git a/engines/director/sound.cpp b/engines/director/sound.cpp
index 6a1eb2db67..0e605584d4 100644
--- a/engines/director/sound.cpp
+++ b/engines/director/sound.cpp
@@ -119,11 +119,10 @@ void DirectorSound::playCastMember(CastMemberID memberID, uint8 soundChannel, bo
 					warning("DirectorSound::playCastMember: no audio data attached to %s", memberID.asString().c_str());
 					return;
 				}
+
 				Audio::AudioStream *as;
-				if (looping)
-					as = ad->getLoopingAudioStream();
-				else
-					as = ad->getAudioStream();
+				as = ad->getAudioStream(looping);
+
 				if (!as) {
 					warning("DirectorSound::playCastMember: audio data failed to load from cast");
 					return;
@@ -336,12 +335,13 @@ void DirectorSound::playFPlaySound() {
 		delete sndData;
 
 		Audio::AudioStream *as;
+		bool looping = false;
+
 		if (!_fplayQueue.empty() && _fplayQueue.front().equalsIgnoreCase("continuous")) {
 			_fplayQueue.pop();
-			as = ad->getLoopingAudioStream();
-		} else {
-			as = ad->getAudioStream();
+			looping = true;
 		}
+		as = ad->getAudioStream(looping);
 
 		if (!as) {
 			warning("DirectorSound:playFPlaySound: failed to get audio stream");
@@ -397,13 +397,6 @@ uint8 DirectorSound::getSoundLevel(uint8 soundChannel) {
 	return _channels[soundChannel - 1].volume / 32;
 }
 
-Audio::AudioStream *AudioDecoder::getLoopingAudioStream() {
-	Audio::RewindableAudioStream *target = dynamic_cast<Audio::RewindableAudioStream *> (getAudioStream(DisposeAfterUse::YES));
-	if (!target)
-		return nullptr;
-	return new Audio::LoopingAudioStream(target, 0);
-}
-
 SNDDecoder::SNDDecoder()
 		: AudioDecoder() {
 	_data = nullptr;
@@ -545,15 +538,21 @@ bool SNDDecoder::processBufferCommand(Common::SeekableReadStreamEndian &stream)
 	return true;
 }
 
-Audio::AudioStream *SNDDecoder::getAudioStream(DisposeAfterUse::Flag disposeAfterUse) {
+Audio::AudioStream *SNDDecoder::getAudioStream(bool looping, DisposeAfterUse::Flag disposeAfterUse) {
 	if (!_data)
 		return nullptr;
 	byte *buffer = (byte *)malloc(_size);
 	memcpy(buffer, _data, _size);
-	if (_loopEnd == _loopStart)
-		return Audio::makeRawStream(buffer, _size, _rate, _flags, disposeAfterUse);
-	else
-		return new Audio::SubLoopingAudioStream(Audio::makeRawStream(buffer, _size, _rate, _flags, DisposeAfterUse::YES), 0, Audio::Timestamp(0, _loopStart, _rate), Audio::Timestamp(0, _loopEnd, _rate));
+
+	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;
+	}
 }
 
 AudioFileDecoder::AudioFileDecoder(Common::String &path)
@@ -561,7 +560,7 @@ AudioFileDecoder::AudioFileDecoder(Common::String &path)
 	_path = path;
 }
 
-Audio::AudioStream *AudioFileDecoder::getAudioStream(DisposeAfterUse::Flag disposeAfterUse) {
+Audio::AudioStream *AudioFileDecoder::getAudioStream(bool looping, DisposeAfterUse::Flag disposeAfterUse) {
 	if (_path.empty())
 		return nullptr;
 
@@ -574,16 +573,25 @@ Audio::AudioStream *AudioFileDecoder::getAudioStream(DisposeAfterUse::Flag dispo
 	file->readUint32BE();
 	uint32 magic2 = file->readUint32BE();
 	file->seek(0);
+
+	Audio::RewindableAudioStream *stream = nullptr;
 	if (magic1 == MKTAG('R', 'I', 'F', 'F') &&
 		magic2 == MKTAG('W', 'A', 'V', 'E')) {
-		return Audio::makeWAVStream(file, disposeAfterUse);
+		stream = Audio::makeWAVStream(file, disposeAfterUse);
 	} else if (magic1 == MKTAG('F', 'O', 'R', 'M') &&
 				magic2 == MKTAG('A', 'I', 'F', 'F')) {
-		return Audio::makeAIFFStream(file, disposeAfterUse);
+		stream = Audio::makeAIFFStream(file, disposeAfterUse);
 	} else {
 		warning("Unknown file type for %s", _path.c_str());
 	}
 
+	if (stream) {
+		if (looping)
+			return new Audio::LoopingAudioStream(stream, 0);
+		else
+			return stream;
+	}
+
 	return nullptr;
 }
 
diff --git a/engines/director/sound.h b/engines/director/sound.h
index 1ae16bb9d8..2027de8ac5 100644
--- a/engines/director/sound.h
+++ b/engines/director/sound.h
@@ -114,8 +114,7 @@ public:
 	AudioDecoder() {};
 	virtual ~AudioDecoder() {};
 public:
-	virtual Audio::AudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) { return nullptr; }
-	virtual Audio::AudioStream *getLoopingAudioStream();
+	virtual Audio::AudioStream *getAudioStream(bool looping = false, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) { return nullptr; }
 };
 
 class SNDDecoder : public AudioDecoder {
@@ -127,7 +126,7 @@ public:
 	void loadExternalSoundStream(Common::SeekableReadStreamEndian &stream);
 	bool processCommands(Common::SeekableReadStreamEndian &stream);
 	bool processBufferCommand(Common::SeekableReadStreamEndian &stream);
-	Audio::AudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
+	Audio::AudioStream *getAudioStream(bool looping = false, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) override;
 
 private:
 	byte *_data;
@@ -146,7 +145,7 @@ public:
 
 	void setPath(Common::String &path);
 
-	Audio::AudioStream *getAudioStream(DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
+	Audio::AudioStream *getAudioStream(bool looping = false, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) override;
 
 private:
 	Common::String _path;




More information about the Scummvm-git-logs mailing list