aboutsummaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorMax Horn2004-09-04 10:12:22 +0000
committerMax Horn2004-09-04 10:12:22 +0000
commit3511e688ab560cd25b9d68b166a4eda85987248a (patch)
treea3fe377d783808978c08dce22bb6713adad83185 /sound
parenteff7b341d0ef40279743cc9794a3de8561b1b40a (diff)
downloadscummvm-rg350-3511e688ab560cd25b9d68b166a4eda85987248a.tar.gz
scummvm-rg350-3511e688ab560cd25b9d68b166a4eda85987248a.tar.bz2
scummvm-rg350-3511e688ab560cd25b9d68b166a4eda85987248a.zip
Fix for bug #1022265 (Memory leak in vorbis.cpp?)
svn-id: r14889
Diffstat (limited to 'sound')
-rw-r--r--sound/vorbis.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/sound/vorbis.cpp b/sound/vorbis.cpp
index 26b04599ca..e629a9b093 100644
--- a/sound/vorbis.cpp
+++ b/sound/vorbis.cpp
@@ -32,7 +32,7 @@
#include <vorbis/vorbisfile.h>
-AudioStream *makeVorbisStream(OggVorbis_File *file, int duration);
+static AudioStream *makeVorbisStream(OggVorbis_File *file, int duration);
#pragma mark -
@@ -211,11 +211,12 @@ class VorbisInputStream : public AudioStream {
int16 _buffer[4096];
const int16 *_bufferEnd;
const int16 *_pos;
+ bool _deleteFileAfterUse;
void refill();
inline bool eosIntern() const;
public:
- VorbisInputStream(OggVorbis_File *file, int duration);
+ VorbisInputStream(OggVorbis_File *file, int duration, bool deleteFileAfterUse);
~VorbisInputStream();
int readBuffer(int16 *buffer, const int numSamples);
@@ -234,8 +235,10 @@ public:
#endif
-VorbisInputStream::VorbisInputStream(OggVorbis_File *file, int duration)
- : _ov_file(file), _bufferEnd(_buffer + ARRAYSIZE(_buffer)) {
+VorbisInputStream::VorbisInputStream(OggVorbis_File *file, int duration, bool deleteFileAfterUse)
+ : _ov_file(file),
+ _bufferEnd(_buffer + ARRAYSIZE(_buffer)),
+ _deleteFileAfterUse(deleteFileAfterUse) {
// Check the header, determine if this is a stereo stream
_numChannels = ov_info(_ov_file, -1)->channels;
@@ -252,6 +255,8 @@ VorbisInputStream::VorbisInputStream(OggVorbis_File *file, int duration)
VorbisInputStream::~VorbisInputStream() {
ov_clear(_ov_file);
+ if (_deleteFileAfterUse)
+ delete _ov_file;
}
inline int16 VorbisInputStream::read() {
@@ -320,8 +325,8 @@ void VorbisInputStream::refill() {
_bufferEnd = (int16 *)read_pos;
}
-AudioStream *makeVorbisStream(OggVorbis_File *file, int duration) {
- return new VorbisInputStream(file, duration);
+static AudioStream *makeVorbisStream(OggVorbis_File *file, int duration) {
+ return new VorbisInputStream(file, duration, false);
}
AudioStream *makeVorbisStream(File *file, uint32 size) {
@@ -340,7 +345,7 @@ AudioStream *makeVorbisStream(File *file, uint32 size) {
return 0;
} else {
file->incRef();
- return new VorbisInputStream(ov_file, 0);
+ return new VorbisInputStream(ov_file, 0, true);
}
}