aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/tony/sound.cpp21
-rw-r--r--engines/tony/sound.h1
2 files changed, 14 insertions, 8 deletions
diff --git a/engines/tony/sound.cpp b/engines/tony/sound.cpp
index e63245586d..1fb4bbee1f 100644
--- a/engines/tony/sound.cpp
+++ b/engines/tony/sound.cpp
@@ -199,6 +199,7 @@ FPSFX::FPSFX(bool bSoundOn) {
hEndOfBuffer = CORO_INVALID_PID_VALUE;
bIsVoice = false;
_stream = 0;
+ _rewindableStream = 0;
bPaused = false;
}
@@ -220,6 +221,7 @@ FPSFX::~FPSFX() {
g_system->getMixer()->stopHandle(_handle);
delete _stream;
+ // _rewindableStream is deleted by deleting _stream
// FIXME
//if (hEndOfBuffer != CORO_INVALID_PID_VALUE)
@@ -264,11 +266,12 @@ bool FPSFX::loadWave(Common::SeekableReadStream *stream) {
if (!stream)
return false;
- _stream = Audio::makeWAVStream(stream, DisposeAfterUse::YES);
+ _rewindableStream = Audio::makeWAVStream(stream, DisposeAfterUse::YES);
- if (!_stream)
+ if (!_rewindableStream)
return false;
+ _stream = _rewindableStream;
bFileLoaded = true;
SetVolume(lastVolume);
return true;
@@ -297,7 +300,8 @@ bool FPSFX::LoadVoiceFromVDB(Common::File &vdbFP) {
uint32 rate = vdbFP.readUint32LE();
bIsVoice = true;
- _stream = Audio::makeADPCMStream(vdbFP.readStream(size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, 1);
+ _rewindableStream = Audio::makeADPCMStream(vdbFP.readStream(size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, 1);
+ _stream = _rewindableStream;
bFileLoaded = true;
SetVolume(62);
@@ -324,23 +328,22 @@ bool FPSFX::LoadFile(const char *lpszFileName, uint32 dwCodec) {
uint32 channels = file.readUint32LE();
Common::SeekableReadStream *buffer = file.readStream(file.size() - file.pos());
- Audio::RewindableAudioStream *stream;
if (dwCodec == FPCODEC_ADPCM) {
- stream = Audio::makeADPCMStream(buffer, DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, channels);
+ _rewindableStream = Audio::makeADPCMStream(buffer, DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, channels);
} else {
byte flags = Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN;
if (channels == 2)
flags |= Audio::FLAG_STEREO;
- stream = Audio::makeRawStream(buffer, rate, flags, DisposeAfterUse::YES);
+ _rewindableStream = Audio::makeRawStream(buffer, rate, flags, DisposeAfterUse::YES);
}
if (bLoop)
- _stream = Audio::makeLoopingAudioStream(stream, 0);
+ _stream = Audio::makeLoopingAudioStream(_rewindableStream, 0);
else
- _stream = stream;
+ _stream = _rewindableStream;
bFileLoaded = true;
return true;
@@ -365,6 +368,8 @@ bool FPSFX::Play() {
//if (hEndOfBuffer != CORO_INVALID_PID_VALUE)
// ResetEvent(hEndOfBuffer);
+ _rewindableStream->rewind();
+
g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_handle, _stream, -1,
Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
diff --git a/engines/tony/sound.h b/engines/tony/sound.h
index 6ebf30f22b..c64680a9cf 100644
--- a/engines/tony/sound.h
+++ b/engines/tony/sound.h
@@ -195,6 +195,7 @@ private:
bool bPaused;
Audio::AudioStream *_stream;
+ Audio::RewindableAudioStream *_rewindableStream;
Audio::SoundHandle _handle;
public: