aboutsummaryrefslogtreecommitdiff
path: root/sound/voc.cpp
diff options
context:
space:
mode:
authorJohannes Schickel2010-01-10 15:20:14 +0000
committerJohannes Schickel2010-01-10 15:20:14 +0000
commit6ca0570fe3bb3f3765677ff8cd3f9e0cbf062d6b (patch)
tree732a2cc846d6f70dd2c42b0dc0cd52d45de34bb2 /sound/voc.cpp
parentbda3fc940c3ecca011b04a32fb20970f53f49d1c (diff)
downloadscummvm-rg350-6ca0570fe3bb3f3765677ff8cd3f9e0cbf062d6b.tar.gz
scummvm-rg350-6ca0570fe3bb3f3765677ff8cd3f9e0cbf062d6b.tar.bz2
scummvm-rg350-6ca0570fe3bb3f3765677ff8cd3f9e0cbf062d6b.zip
- Add a SubLoopingAudioStream, which loops a nested part of a stream and thus features the same looping capabilites as LinearMemoryStream and LinearDiskStream.
- Remove custom looping code from LinearMemoryStream and LinearDiskStream. - Adapt various client code to the changes. svn-id: r47226
Diffstat (limited to 'sound/voc.cpp')
-rw-r--r--sound/voc.cpp40
1 files changed, 37 insertions, 3 deletions
diff --git a/sound/voc.cpp b/sound/voc.cpp
index 1c268c0260..79a64769f7 100644
--- a/sound/voc.cpp
+++ b/sound/voc.cpp
@@ -298,7 +298,7 @@ int parseVOCFormat(Common::SeekableReadStream& stream, LinearDiskStreamAudioBloc
return currentBlock;
}
-SeekableAudioStream *makeVOCDiskStream(Common::SeekableReadStream &stream, byte flags, bool takeOwnership) {
+AudioStream *makeVOCDiskStream(Common::SeekableReadStream &stream, byte flags, bool takeOwnership) {
const int MAX_AUDIO_BLOCKS = 256;
LinearDiskStreamAudioBlock *block = new LinearDiskStreamAudioBlock[MAX_AUDIO_BLOCKS];
@@ -317,11 +317,31 @@ SeekableAudioStream *makeVOCDiskStream(Common::SeekableReadStream &stream, byte
return audioStream;
}
-
+
+SeekableAudioStream *makeVOCDiskStreamNoLoop(Common::SeekableReadStream &stream, byte flags, bool takeOwnership) {
+ const int MAX_AUDIO_BLOCKS = 256;
+
+ LinearDiskStreamAudioBlock *block = new LinearDiskStreamAudioBlock[MAX_AUDIO_BLOCKS];
+ int 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 = makeLinearDiskStream(&stream, block, numBlocks, rate, flags, takeOwnership);
+
+ delete[] block;
+
+ return audioStream;
+}
+
#endif
-SeekableAudioStream *makeVOCStream(Common::SeekableReadStream &stream, byte flags, uint loopStart, uint loopEnd, bool takeOwnershipOfStream) {
+AudioStream *makeVOCStream(Common::SeekableReadStream &stream, byte flags, uint loopStart, uint loopEnd, bool takeOwnershipOfStream) {
#ifdef STREAM_AUDIO_FROM_DISK
return makeVOCDiskStream(stream, flags, takeOwnershipOfStream);
#else
@@ -336,5 +356,19 @@ SeekableAudioStream *makeVOCStream(Common::SeekableReadStream &stream, byte flag
#endif
}
+SeekableAudioStream *makeVOCStream(Common::SeekableReadStream &stream, byte flags, bool takeOwnershipOfStream) {
+#ifdef STREAM_AUDIO_FROM_DISK
+ return makeVOCDiskStreamNoLoop(stream, flags, takeOwnershipOfStream);
+#else
+ int size, rate;
+
+ byte *data = loadVOCFromStream(stream, size, rate);
+
+ if (!data)
+ return 0;
+
+ return makeLinearInputStream(data, size, rate, flags | Audio::Mixer::FLAG_AUTOFREE);
+#endif
+}
} // End of namespace Audio