[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