From f24cc1c8be08448c8412afef29be3ffa4ff09dd5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 8 Mar 2010 10:27:42 +0000 Subject: Tweak makeVOCDiskStream * now takes a SeekableReadStream *pointer* like (almost) all other audiostream factories * fix potential memory leak in it * rename takeOwnershipOfStream to disposeAfterUse for consistency svn-id: r48184 --- sound/decoders/voc.cpp | 34 ++++++++++++++++++++-------------- sound/decoders/voc.h | 4 ++-- 2 files changed, 22 insertions(+), 16 deletions(-) (limited to 'sound/decoders') diff --git a/sound/decoders/voc.cpp b/sound/decoders/voc.cpp index 9acc4430d9..5663861f05 100644 --- a/sound/decoders/voc.cpp +++ b/sound/decoders/voc.cpp @@ -299,40 +299,40 @@ int parseVOCFormat(Common::SeekableReadStream& stream, RawStreamBlock* block, in return currentBlock; } -AudioStream *makeVOCDiskStream(Common::SeekableReadStream &stream, byte flags, DisposeAfterUse::Flag takeOwnership) { +AudioStream *makeVOCDiskStream(Common::SeekableReadStream *stream, byte flags, DisposeAfterUse::Flag disposeAfterUse) { const int MAX_AUDIO_BLOCKS = 256; RawStreamBlock *block = new RawStreamBlock[MAX_AUDIO_BLOCKS]; int rate, loops, begin_loop, end_loop; - int numBlocks = parseVOCFormat(stream, block, rate, loops, begin_loop, end_loop); + int numBlocks = parseVOCFormat(*stream, block, rate, loops, begin_loop, end_loop); AudioStream *audioStream = 0; // Create an audiostream from the data. Note the numBlocks may be 0, // e.g. when invalid data is encountered. See bug #2890038. if (numBlocks) - audioStream = makeRawDiskStream_OLD(&stream, block, numBlocks, rate, flags, takeOwnership/*, begin_loop, end_loop*/); + audioStream = makeRawDiskStream_OLD(stream, block, numBlocks, rate, flags, disposeAfterUse/*, begin_loop, end_loop*/); delete[] block; return audioStream; } -SeekableAudioStream *makeVOCDiskStreamNoLoop(Common::SeekableReadStream &stream, byte flags, DisposeAfterUse::Flag takeOwnership) { +SeekableAudioStream *makeVOCDiskStreamNoLoop(Common::SeekableReadStream *stream, byte flags, DisposeAfterUse::Flag disposeAfterUse) { const int MAX_AUDIO_BLOCKS = 256; RawStreamBlock *block = new RawStreamBlock[MAX_AUDIO_BLOCKS]; int rate, loops, begin_loop, end_loop; - int numBlocks = parseVOCFormat(stream, block, rate, loops, begin_loop, end_loop); + int numBlocks = parseVOCFormat(*stream, block, rate, loops, begin_loop, end_loop); SeekableAudioStream *audioStream = 0; // Create an audiostream from the data. Note the numBlocks may be 0, // e.g. when invalid data is encountered. See bug #2890038. if (numBlocks) - audioStream = makeRawDiskStream_OLD(&stream, block, numBlocks, rate, flags, takeOwnership); + audioStream = makeRawDiskStream_OLD(stream, block, numBlocks, rate, flags, disposeAfterUse); delete[] block; @@ -342,16 +342,19 @@ SeekableAudioStream *makeVOCDiskStreamNoLoop(Common::SeekableReadStream &stream, #endif -AudioStream *makeVOCStream(Common::SeekableReadStream &stream, byte flags, uint loopStart, uint loopEnd, DisposeAfterUse::Flag takeOwnershipOfStream) { +AudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flags, uint loopStart, uint loopEnd, DisposeAfterUse::Flag disposeAfterUse) { #ifdef STREAM_AUDIO_FROM_DISK - return makeVOCDiskStream(stream, flags, takeOwnershipOfStream); + return makeVOCDiskStream(stream, flags, disposeAfterUse); #else int size, rate; - byte *data = loadVOCFromStream(stream, size, rate); + byte *data = loadVOCFromStream(*stream, size, rate); - if (!data) + if (!data) { + if (disposeAfterUse == DisposeAfterUse::YES) + delete stream; return 0; + } SeekableAudioStream *s = Audio::makeRawStream(data, size, rate, flags); @@ -379,16 +382,19 @@ AudioStream *makeVOCStream(Common::SeekableReadStream &stream, byte flags, uint #endif } -SeekableAudioStream *makeVOCStream(Common::SeekableReadStream &stream, byte flags, DisposeAfterUse::Flag takeOwnershipOfStream) { +SeekableAudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flags, DisposeAfterUse::Flag disposeAfterUse) { #ifdef STREAM_AUDIO_FROM_DISK - return makeVOCDiskStreamNoLoop(stream, flags, takeOwnershipOfStream); + return makeVOCDiskStreamNoLoop(*stream, flags, disposeAfterUse); #else int size, rate; - byte *data = loadVOCFromStream(stream, size, rate); + byte *data = loadVOCFromStream(*stream, size, rate); - if (!data) + if (!data) { + if (disposeAfterUse == DisposeAfterUse::YES) + delete stream; return 0; + } return makeRawStream(data, size, rate, flags); #endif diff --git a/sound/decoders/voc.h b/sound/decoders/voc.h index 191f42db02..79956ee62a 100644 --- a/sound/decoders/voc.h +++ b/sound/decoders/voc.h @@ -95,12 +95,12 @@ extern byte *loadVOCFromStream(Common::ReadStream &stream, int &size, int &rate) * * This function uses loadVOCFromStream() internally. */ -AudioStream *makeVOCStream(Common::SeekableReadStream &stream, byte flags = 0, uint loopStart = 0, uint loopEnd = 0, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::NO); +AudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flags = 0, uint loopStart = 0, uint loopEnd = 0, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::NO); /** * This does not use any of the looping features of VOC files! */ -SeekableAudioStream *makeVOCStream(Common::SeekableReadStream &stream, byte flags, DisposeAfterUse::Flag disposeAfterUse); +SeekableAudioStream *makeVOCStream(Common::SeekableReadStream *stream, byte flags, DisposeAfterUse::Flag disposeAfterUse); } // End of namespace Audio -- cgit v1.2.3