aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Mallon2011-08-06 16:30:52 +0200
committerChristoph Mallon2011-08-07 15:19:08 +0200
commita5a8833c059f28c85e392a3cd22c361d38ef95ff (patch)
tree3b3b69326019444c2c375c66f39cb3013a003591
parent2f23ff72c1d804d9d0e3ac09c46f52fd6b23a68c (diff)
downloadscummvm-rg350-a5a8833c059f28c85e392a3cd22c361d38ef95ff.tar.gz
scummvm-rg350-a5a8833c059f28c85e392a3cd22c361d38ef95ff.tar.bz2
scummvm-rg350-a5a8833c059f28c85e392a3cd22c361d38ef95ff.zip
COMMON: Add DisposablePtr<T>, which replaces many repeated implementations of a dispose flag.
-rw-r--r--audio/audiostream.cpp21
-rw-r--r--audio/audiostream.h13
-rw-r--r--audio/decoders/adpcm.cpp8
-rw-r--r--audio/decoders/adpcm_intern.h5
-rw-r--r--audio/decoders/mp3.cpp10
-rw-r--r--audio/decoders/raw.cpp22
-rw-r--r--audio/decoders/vorbis.cpp9
-rw-r--r--audio/mixer.cpp9
-rw-r--r--backends/platform/psp/mp3.cpp6
-rw-r--r--backends/platform/psp/mp3.h4
-rw-r--r--common/ptr.h36
-rw-r--r--common/stream.cpp9
-rw-r--r--common/substream.h11
-rw-r--r--engines/agos/sound.cpp14
-rw-r--r--engines/drascula/drascula.h5
-rw-r--r--engines/drascula/resource.cpp8
16 files changed, 82 insertions, 108 deletions
diff --git a/audio/audiostream.cpp b/audio/audiostream.cpp
index 547aa77526..1c63ce97bf 100644
--- a/audio/audiostream.cpp
+++ b/audio/audiostream.cpp
@@ -93,7 +93,7 @@ SeekableAudioStream *SeekableAudioStream::openStreamFile(const Common::String &b
#pragma mark -
LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse)
- : _parent(stream), _disposeAfterUse(disposeAfterUse), _loops(loops), _completeIterations(0) {
+ : _parent(stream, disposeAfterUse), _loops(loops), _completeIterations(0) {
assert(stream);
if (!stream->rewind()) {
@@ -102,11 +102,6 @@ LoopingAudioStream::LoopingAudioStream(RewindableAudioStream *stream, uint loops
}
}
-LoopingAudioStream::~LoopingAudioStream() {
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _parent;
-}
-
int LoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) {
if ((_loops && _completeIterations == _loops) || !numSamples)
return 0;
@@ -169,7 +164,7 @@ SubLoopingAudioStream::SubLoopingAudioStream(SeekableAudioStream *stream,
const Timestamp loopStart,
const Timestamp loopEnd,
DisposeAfterUse::Flag disposeAfterUse)
- : _parent(stream), _disposeAfterUse(disposeAfterUse), _loops(loops),
+ : _parent(stream, disposeAfterUse), _loops(loops),
_pos(0, getRate() * (isStereo() ? 2 : 1)),
_loopStart(convertTimeToStreamPos(loopStart, getRate(), isStereo())),
_loopEnd(convertTimeToStreamPos(loopEnd, getRate(), isStereo())),
@@ -180,11 +175,6 @@ SubLoopingAudioStream::SubLoopingAudioStream(SeekableAudioStream *stream,
_done = true;
}
-SubLoopingAudioStream::~SubLoopingAudioStream() {
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _parent;
-}
-
int SubLoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) {
if (_done)
return 0;
@@ -225,7 +215,7 @@ int SubLoopingAudioStream::readBuffer(int16 *buffer, const int numSamples) {
#pragma mark -
SubSeekableAudioStream::SubSeekableAudioStream(SeekableAudioStream *parent, const Timestamp start, const Timestamp end, DisposeAfterUse::Flag disposeAfterUse)
- : _parent(parent), _disposeAfterUse(disposeAfterUse),
+ : _parent(parent, disposeAfterUse),
_start(convertTimeToStreamPos(start, getRate(), isStereo())),
_pos(0, getRate() * (isStereo() ? 2 : 1)),
_length(convertTimeToStreamPos(end, getRate(), isStereo()) - _start) {
@@ -234,11 +224,6 @@ SubSeekableAudioStream::SubSeekableAudioStream(SeekableAudioStream *parent, cons
_parent->seek(_start);
}
-SubSeekableAudioStream::~SubSeekableAudioStream() {
- if (_disposeAfterUse)
- delete _parent;
-}
-
int SubSeekableAudioStream::readBuffer(int16 *buffer, const int numSamples) {
int framesLeft = MIN(_length.frameDiff(_pos), numSamples);
int framesRead = _parent->readBuffer(buffer, framesLeft);
diff --git a/audio/audiostream.h b/audio/audiostream.h
index 0ffaa241ce..9c28e4d67f 100644
--- a/audio/audiostream.h
+++ b/audio/audiostream.h
@@ -23,6 +23,7 @@
#ifndef SOUND_AUDIOSTREAM_H
#define SOUND_AUDIOSTREAM_H
+#include "common/ptr.h"
#include "common/scummsys.h"
#include "common/str.h"
#include "common/types.h"
@@ -114,7 +115,6 @@ public:
* @param disposeAfterUse Destroy the stream after the LoopingAudioStream has finished playback.
*/
LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
- ~LoopingAudioStream();
int readBuffer(int16 *buffer, const int numSamples);
bool endOfData() const;
@@ -129,8 +129,7 @@ public:
*/
uint getCompleteIterations() const { return _completeIterations; }
private:
- RewindableAudioStream *_parent;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<RewindableAudioStream> _parent;
uint _loops;
uint _completeIterations;
@@ -246,7 +245,6 @@ public:
const Timestamp loopStart,
const Timestamp loopEnd,
DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
- ~SubLoopingAudioStream();
int readBuffer(int16 *buffer, const int numSamples);
bool endOfData() const { return _done; }
@@ -254,8 +252,7 @@ public:
bool isStereo() const { return _parent->isStereo(); }
int getRate() const { return _parent->getRate(); }
private:
- SeekableAudioStream *_parent;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<SeekableAudioStream> _parent;
uint _loops;
Timestamp _pos;
@@ -283,7 +280,6 @@ public:
* @param disposeAfterUse Whether the parent stream object should be destroyed on destruction of the SubSeekableAudioStream.
*/
SubSeekableAudioStream(SeekableAudioStream *parent, const Timestamp start, const Timestamp end, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
- ~SubSeekableAudioStream();
int readBuffer(int16 *buffer, const int numSamples);
@@ -297,8 +293,7 @@ public:
Timestamp getLength() const { return _length; }
private:
- SeekableAudioStream *_parent;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<SeekableAudioStream> _parent;
const Timestamp _start;
const Timestamp _length;
diff --git a/audio/decoders/adpcm.cpp b/audio/decoders/adpcm.cpp
index 116f2f776a..535652a0b3 100644
--- a/audio/decoders/adpcm.cpp
+++ b/audio/decoders/adpcm.cpp
@@ -41,8 +41,7 @@ namespace Audio {
// <http://wiki.multimedia.cx/index.php?title=Microsoft_IMA_ADPCM>.
ADPCMStream::ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign)
- : _stream(stream),
- _disposeAfterUse(disposeAfterUse),
+ : _stream(stream, disposeAfterUse),
_startpos(stream->pos()),
_endpos(_startpos + size),
_channels(channels),
@@ -52,11 +51,6 @@ ADPCMStream::ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Fl
reset();
}
-ADPCMStream::~ADPCMStream() {
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _stream;
-}
-
void ADPCMStream::reset() {
memset(&_status, 0, sizeof(_status));
_blockPos[0] = _blockPos[1] = _blockAlign; // To make sure first header is read
diff --git a/audio/decoders/adpcm_intern.h b/audio/decoders/adpcm_intern.h
index c9f894fb84..38514d7fca 100644
--- a/audio/decoders/adpcm_intern.h
+++ b/audio/decoders/adpcm_intern.h
@@ -33,6 +33,7 @@
#include "audio/audiostream.h"
#include "common/endian.h"
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/textconsole.h"
@@ -41,8 +42,7 @@ namespace Audio {
class ADPCMStream : public RewindableAudioStream {
protected:
- Common::SeekableReadStream *_stream;
- const DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<Common::SeekableReadStream> _stream;
const int32 _startpos;
const int32 _endpos;
const int _channels;
@@ -62,7 +62,6 @@ protected:
public:
ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, uint32 size, int rate, int channels, uint32 blockAlign);
- ~ADPCMStream();
virtual bool endOfData() const { return (_stream->eos() || _stream->pos() >= _endpos); }
virtual bool isStereo() const { return _channels == 2; }
diff --git a/audio/decoders/mp3.cpp b/audio/decoders/mp3.cpp
index 8d7f006ec7..00669945c2 100644
--- a/audio/decoders/mp3.cpp
+++ b/audio/decoders/mp3.cpp
@@ -25,6 +25,7 @@
#ifdef USE_MAD
#include "common/debug.h"
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/textconsole.h"
#include "common/util.h"
@@ -52,8 +53,7 @@ protected:
MP3_STATE_EOS // end of data reached (may need to loop)
};
- Common::SeekableReadStream *_inStream;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<Common::SeekableReadStream> _inStream;
uint _posInFrame;
State _state;
@@ -95,8 +95,7 @@ protected:
};
MP3Stream::MP3Stream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag dispose) :
- _inStream(inStream),
- _disposeAfterUse(dispose),
+ _inStream(inStream, dispose),
_posInFrame(0),
_state(MP3_STATE_INIT),
_length(0, 1000),
@@ -134,9 +133,6 @@ MP3Stream::MP3Stream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag
MP3Stream::~MP3Stream() {
deinitStream();
-
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _inStream;
}
void MP3Stream::decodeMP3Data() {
diff --git a/audio/decoders/raw.cpp b/audio/decoders/raw.cpp
index 4789fd0f36..881b8c1d6a 100644
--- a/audio/decoders/raw.cpp
+++ b/audio/decoders/raw.cpp
@@ -51,7 +51,7 @@ template<bool is16Bit, bool isUnsigned, bool isLE>
class RawStream : public SeekableAudioStream {
public:
RawStream(int rate, bool stereo, DisposeAfterUse::Flag disposeStream, Common::SeekableReadStream *stream, const RawStreamBlockList &blocks)
- : _rate(rate), _isStereo(stereo), _playtime(0, rate), _stream(stream), _disposeAfterUse(disposeStream), _blocks(blocks), _curBlock(_blocks.begin()), _blockLeft(0), _buffer(0) {
+ : _rate(rate), _isStereo(stereo), _playtime(0, rate), _stream(stream, disposeStream), _blocks(blocks), _curBlock(_blocks.begin()), _blockLeft(0), _buffer(0) {
assert(_blocks.size() > 0);
@@ -82,9 +82,6 @@ public:
}
~RawStream() {
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _stream;
-
delete[] _buffer;
}
@@ -98,15 +95,14 @@ public:
bool seek(const Timestamp &where);
private:
- const int _rate; ///< Sample rate of stream
- const bool _isStereo; ///< Whether this is an stereo stream
- Timestamp _playtime; ///< Calculated total play time
- Common::SeekableReadStream *_stream; ///< Stream to read data from
- const DisposeAfterUse::Flag _disposeAfterUse; ///< Indicates whether the stream object should be deleted when this RawStream is destructed
- const RawStreamBlockList _blocks; ///< Audio block list
-
- RawStreamBlockList::const_iterator _curBlock; ///< Current audio block number
- int32 _blockLeft; ///< How many bytes are still left in the current block
+ const int _rate; ///< Sample rate of stream
+ const bool _isStereo; ///< Whether this is an stereo stream
+ Timestamp _playtime; ///< Calculated total play time
+ Common::DisposablePtr<Common::SeekableReadStream> _stream; ///< Stream to read data from
+ const RawStreamBlockList _blocks; ///< Audio block list
+
+ RawStreamBlockList::const_iterator _curBlock; ///< Current audio block number
+ int32 _blockLeft; ///< How many bytes are still left in the current block
/**
* Advance one block in the stream in case
diff --git a/audio/decoders/vorbis.cpp b/audio/decoders/vorbis.cpp
index e10ec11a50..455803dc05 100644
--- a/audio/decoders/vorbis.cpp
+++ b/audio/decoders/vorbis.cpp
@@ -29,6 +29,7 @@
#ifdef USE_VORBIS
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/textconsole.h"
#include "common/util.h"
@@ -89,8 +90,7 @@ static ov_callbacks g_stream_wrap = {
class VorbisStream : public SeekableAudioStream {
protected:
- Common::SeekableReadStream *_inStream;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<Common::SeekableReadStream> _inStream;
bool _isStereo;
int _rate;
@@ -121,8 +121,7 @@ protected:
};
VorbisStream::VorbisStream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag dispose) :
- _inStream(inStream),
- _disposeAfterUse(dispose),
+ _inStream(inStream, dispose),
_length(0, 1000),
_bufferEnd(_buffer + ARRAYSIZE(_buffer)) {
@@ -150,8 +149,6 @@ VorbisStream::VorbisStream(Common::SeekableReadStream *inStream, DisposeAfterUse
VorbisStream::~VorbisStream() {
ov_clear(&_ovFile);
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _inStream;
}
int VorbisStream::readBuffer(int16 *buffer, const int numSamples) {
diff --git a/audio/mixer.cpp b/audio/mixer.cpp
index 128224ae85..965766170d 100644
--- a/audio/mixer.cpp
+++ b/audio/mixer.cpp
@@ -163,9 +163,8 @@ private:
uint32 _pauseStartTime;
uint32 _pauseTime;
- DisposeAfterUse::Flag _autofreeStream;
RateConverter *_converter;
- AudioStream *_stream;
+ Common::DisposablePtr<AudioStream> _stream;
};
#pragma mark -
@@ -492,8 +491,8 @@ Channel::Channel(Mixer *mixer, Mixer::SoundType type, AudioStream *stream,
DisposeAfterUse::Flag autofreeStream, bool reverseStereo, int id, bool permanent)
: _type(type), _mixer(mixer), _id(id), _permanent(permanent), _volume(Mixer::kMaxChannelVolume),
_balance(0), _pauseLevel(0), _samplesConsumed(0), _samplesDecoded(0), _mixerTimeStamp(0),
- _pauseStartTime(0), _pauseTime(0), _autofreeStream(autofreeStream), _converter(0),
- _stream(stream) {
+ _pauseStartTime(0), _pauseTime(0), _converter(0),
+ _stream(stream, autofreeStream) {
assert(mixer);
assert(stream);
@@ -503,8 +502,6 @@ Channel::Channel(Mixer *mixer, Mixer::SoundType type, AudioStream *stream,
Channel::~Channel() {
delete _converter;
- if (_autofreeStream == DisposeAfterUse::YES)
- delete _stream;
}
void Channel::setVolume(const byte volume) {
diff --git a/backends/platform/psp/mp3.cpp b/backends/platform/psp/mp3.cpp
index 266e31e445..3dbf31112a 100644
--- a/backends/platform/psp/mp3.cpp
+++ b/backends/platform/psp/mp3.cpp
@@ -179,8 +179,7 @@ bool Mp3PspStream::loadStartAudioModule(const char *modname, int partition){
// TODO: make parallel function for unloading the 1.50 modules
Mp3PspStream::Mp3PspStream(Common::SeekableReadStream *inStream, DisposeAfterUse::Flag dispose) :
- _inStream(inStream),
- _disposeAfterUse(dispose),
+ _inStream(inStream, dispose),
_pcmLength(0),
_posInFrame(0),
_state(MP3_STATE_INIT),
@@ -274,9 +273,6 @@ Mp3PspStream::~Mp3PspStream() {
deinitStream();
releaseStreamME(); // free the memory used for this stream
-
- if (_disposeAfterUse == DisposeAfterUse::YES)
- delete _inStream;
}
void Mp3PspStream::deinitStream() {
diff --git a/backends/platform/psp/mp3.h b/backends/platform/psp/mp3.h
index 8b01fe4872..f7bfdda254 100644
--- a/backends/platform/psp/mp3.h
+++ b/backends/platform/psp/mp3.h
@@ -23,6 +23,7 @@
#ifndef SOUND_MP3_PSP_H
#define SOUND_MP3_PSP_H
+#include "common/ptr.h"
#include "common/types.h"
#include "common/scummsys.h"
@@ -48,8 +49,7 @@ protected:
byte _codecInBuffer[3072] __attribute__((aligned(64))); // the codec always needs alignment
unsigned long _codecParams[65]__attribute__((aligned(64))); // TODO: change to struct
- Common::SeekableReadStream *_inStream;
- DisposeAfterUse::Flag _disposeAfterUse;
+ Common::DisposablePtr<Common::SeekableReadStream> _inStream;
uint32 _pcmLength; // how many pcm samples we have for this type of file (x2 this for stereo)
diff --git a/common/ptr.h b/common/ptr.h
index d06a25edb8..2b0670caae 100644
--- a/common/ptr.h
+++ b/common/ptr.h
@@ -24,6 +24,7 @@
#include "common/scummsys.h"
#include "common/noncopyable.h"
+#include "common/types.h"
namespace Common {
@@ -273,6 +274,41 @@ private:
PointerType _pointer;
};
+
+template<typename T>
+class DisposablePtr : NonCopyable {
+public:
+ typedef T ValueType;
+ typedef T *PointerType;
+ typedef T &ReferenceType;
+
+ explicit DisposablePtr(PointerType o, DisposeAfterUse::Flag dispose) : _pointer(o), _dispose(dispose) {}
+
+ ~DisposablePtr() {
+ if (_dispose) delete _pointer;
+ }
+
+ ReferenceType operator*() const { return *_pointer; }
+ PointerType operator->() const { return _pointer; }
+
+ /**
+ * Implicit conversion operator to bool for convenience, to make
+ * checks like "if (scopedPtr) ..." possible.
+ */
+ operator bool() const { return _pointer; }
+
+ /**
+ * Returns the plain pointer value.
+ *
+ * @return the pointer the DisposablePtr manages
+ */
+ PointerType get() const { return _pointer; }
+
+private:
+ PointerType _pointer;
+ DisposeAfterUse::Flag _dispose;
+};
+
} // End of namespace Common
#endif
diff --git a/common/stream.cpp b/common/stream.cpp
index 60b40d0df2..30b3bca497 100644
--- a/common/stream.cpp
+++ b/common/stream.cpp
@@ -20,6 +20,7 @@
*
*/
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/memstream.h"
#include "common/substream.h"
@@ -258,8 +259,7 @@ namespace {
*/
class BufferedReadStream : virtual public ReadStream {
protected:
- ReadStream *_parentStream;
- DisposeAfterUse::Flag _disposeParentStream;
+ DisposablePtr<ReadStream> _parentStream;
byte *_buf;
uint32 _pos;
bool _eos; // end of stream
@@ -278,8 +278,7 @@ public:
};
BufferedReadStream::BufferedReadStream(ReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream)
- : _parentStream(parentStream),
- _disposeParentStream(disposeParentStream),
+ : _parentStream(parentStream, disposeParentStream),
_pos(0),
_eos(false),
_bufSize(0),
@@ -291,8 +290,6 @@ BufferedReadStream::BufferedReadStream(ReadStream *parentStream, uint32 bufSize,
}
BufferedReadStream::~BufferedReadStream() {
- if (_disposeParentStream)
- delete _parentStream;
delete[] _buf;
}
diff --git a/common/substream.h b/common/substream.h
index f4f79ff02f..7e67389da1 100644
--- a/common/substream.h
+++ b/common/substream.h
@@ -23,6 +23,7 @@
#ifndef COMMON_SUBSTREAM_H
#define COMMON_SUBSTREAM_H
+#include "common/ptr.h"
#include "common/stream.h"
#include "common/types.h"
@@ -38,24 +39,18 @@ namespace Common {
*/
class SubReadStream : virtual public ReadStream {
protected:
- ReadStream *_parentStream;
- DisposeAfterUse::Flag _disposeParentStream;
+ DisposablePtr<ReadStream> _parentStream;
uint32 _pos;
uint32 _end;
bool _eos;
public:
SubReadStream(ReadStream *parentStream, uint32 end, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO)
- : _parentStream(parentStream),
- _disposeParentStream(disposeParentStream),
+ : _parentStream(parentStream, disposeParentStream),
_pos(0),
_end(end),
_eos(false) {
assert(parentStream);
}
- ~SubReadStream() {
- if (_disposeParentStream)
- delete _parentStream;
- }
virtual bool eos() const { return _eos | _parentStream->eos(); }
virtual bool err() const { return _parentStream->err(); }
diff --git a/engines/agos/sound.cpp b/engines/agos/sound.cpp
index 03932aa4de..11a1cd792e 100644
--- a/engines/agos/sound.cpp
+++ b/engines/agos/sound.cpp
@@ -22,6 +22,7 @@
#include "common/file.h"
#include "common/memstream.h"
+#include "common/ptr.h"
#include "common/textconsole.h"
#include "common/util.h"
@@ -43,11 +44,10 @@ namespace AGOS {
class BaseSound : Common::NonCopyable {
protected:
- Common::File *_file;
+ Common::DisposablePtr<Common::File> _file;
uint32 *_offsets;
Audio::Mixer *_mixer;
bool _freeOffsets;
- DisposeAfterUse::Flag _disposeFile;
public:
BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 base, bool bigEndian, DisposeAfterUse::Flag disposeFileAfterUse = DisposeAfterUse::YES);
@@ -62,7 +62,7 @@ public:
};
BaseSound::BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 base, bool bigEndian, DisposeAfterUse::Flag disposeFileAfterUse)
- : _mixer(mixer), _file(file), _disposeFile(disposeFileAfterUse) {
+ : _mixer(mixer), _file(file, disposeFileAfterUse) {
uint res = 0;
uint32 size;
@@ -96,7 +96,7 @@ BaseSound::BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 base, bool
}
BaseSound::BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 *offsets, DisposeAfterUse::Flag disposeFileAfterUse)
- : _mixer(mixer), _file(file), _disposeFile(disposeFileAfterUse) {
+ : _mixer(mixer), _file(file, disposeFileAfterUse) {
_offsets = offsets;
_freeOffsets = false;
@@ -105,8 +105,6 @@ BaseSound::BaseSound(Audio::Mixer *mixer, Common::File *file, uint32 *offsets, D
BaseSound::~BaseSound() {
if (_freeOffsets)
free(_offsets);
- if (_disposeFile == DisposeAfterUse::YES)
- delete _file;
}
///////////////////////////////////////////////////////////////////////////////
@@ -234,7 +232,7 @@ Audio::AudioStream *WavSound::makeAudioStream(uint sound) {
return NULL;
_file->seek(_offsets[sound], SEEK_SET);
- return Audio::makeWAVStream(_file, DisposeAfterUse::NO);
+ return Audio::makeWAVStream(_file.get(), DisposeAfterUse::NO);
}
void WavSound::playSound(uint sound, uint loopSound, Audio::Mixer::SoundType type, Audio::SoundHandle *handle, bool loop, int vol) {
@@ -257,7 +255,7 @@ public:
Audio::AudioStream *VocSound::makeAudioStream(uint sound) {
assert(_offsets);
_file->seek(_offsets[sound], SEEK_SET);
- return Audio::makeVOCStream(_file, _flags);
+ return Audio::makeVOCStream(_file.get(), _flags);
}
void VocSound::playSound(uint sound, uint loopSound, Audio::Mixer::SoundType type, Audio::SoundHandle *handle, bool loop, int vol) {
diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h
index 2b6aa0f291..5ec4684723 100644
--- a/engines/drascula/drascula.h
+++ b/engines/drascula/drascula.h
@@ -30,6 +30,7 @@
#include "common/file.h"
#include "common/hash-str.h"
#include "common/keyboard.h"
+#include "common/ptr.h"
#include "common/random.h"
#include "common/savefile.h"
#include "common/system.h"
@@ -264,15 +265,13 @@ private:
};
class TextResourceParser {
- Common::SeekableReadStream *_stream;
- DisposeAfterUse::Flag _dispose;
+ Common::DisposablePtr<Common::SeekableReadStream> _stream;
int _maxLen;
void getLine(char *buf);
public:
TextResourceParser(Common::SeekableReadStream *stream, DisposeAfterUse::Flag dispose);
- ~TextResourceParser();
void parseInt(int &result);
void parseString(char *result);
diff --git a/engines/drascula/resource.cpp b/engines/drascula/resource.cpp
index 61609fb940..95a95e3487 100644
--- a/engines/drascula/resource.cpp
+++ b/engines/drascula/resource.cpp
@@ -42,7 +42,7 @@ Common::SeekableReadStream *ArchiveMan::open(const Common::String &filename) {
}
TextResourceParser::TextResourceParser(Common::SeekableReadStream *stream, DisposeAfterUse::Flag dispose) :
- _stream(stream), _dispose(dispose) {
+ _stream(stream, dispose) {
// NOTE: strangely enough, the code before this refactoring used the size of
// the stream as a fixed maximum length for the parser. Using an updated
@@ -50,12 +50,6 @@ TextResourceParser::TextResourceParser(Common::SeekableReadStream *stream, Dispo
_maxLen = _stream->size();
}
-TextResourceParser::~TextResourceParser() {
- if (_dispose == DisposeAfterUse::YES) {
- delete _stream;
- }
-}
-
void TextResourceParser::getLine(char *buf) {
byte c;
char *b;