aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--audio/decoders/aiff.cpp21
-rw-r--r--audio/decoders/aiff.h9
-rw-r--r--engines/bbvs/sound.h2
-rw-r--r--engines/pegasus/sound.cpp10
-rw-r--r--engines/saga/sndres.cpp15
-rw-r--r--engines/sci/sound/audio.cpp8
-rw-r--r--engines/sherlock/debugger.cpp2
7 files changed, 38 insertions, 29 deletions
diff --git a/audio/decoders/aiff.cpp b/audio/decoders/aiff.cpp
index 3a5849f6fd..7d6ed43575 100644
--- a/audio/decoders/aiff.cpp
+++ b/audio/decoders/aiff.cpp
@@ -33,6 +33,7 @@
#include "common/substream.h"
#include "common/textconsole.h"
+#include "audio/audiostream.h"
#include "audio/decoders/aiff.h"
#include "audio/decoders/raw.h"
#include "audio/decoders/3do.h"
@@ -71,13 +72,7 @@ static const uint32 kVersionAIFC = MKTAG('A', 'I', 'F', 'C');
// Codecs
static const uint32 kCodecPCM = MKTAG('N', 'O', 'N', 'E'); // very original
-// temporary Wrapper
-// TODO: adjust all calling code to use makeAIFFAudioStream() and dynamic_cast
-SeekableAudioStream *makeAIFFStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) {
- return dynamic_cast<Audio::SeekableAudioStream *>(makeAIFFAudioStream(stream, disposeAfterUse));
-}
-
-AudioStream *makeAIFFAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) {
+RewindableAudioStream *makeAIFFStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) {
if (stream->readUint32BE() != MKTAG('F', 'O', 'R', 'M')) {
warning("makeAIFFStream: No 'FORM' header");
@@ -192,8 +187,6 @@ AudioStream *makeAIFFAudioStream(Common::SeekableReadStream *stream, DisposeAfte
return 0;
}
- bool stereo = channels > 1 ? true : false;
-
switch (codec) {
case kCodecPCM:
case MKTAG('t', 'w', 'o', 's'):
@@ -202,7 +195,7 @@ AudioStream *makeAIFFAudioStream(Common::SeekableReadStream *stream, DisposeAfte
byte rawFlags = 0;
if (bitsPerSample == 16)
rawFlags |= Audio::FLAG_16BITS;
- if (stereo)
+ if (channels == 2)
rawFlags |= Audio::FLAG_STEREO;
if (codec == MKTAG('s', 'o', 'w', 't'))
rawFlags |= Audio::FLAG_LITTLE_ENDIAN;
@@ -210,9 +203,7 @@ AudioStream *makeAIFFAudioStream(Common::SeekableReadStream *stream, DisposeAfte
return makeRawStream(dataStream, rate, rawFlags);
}
case MKTAG('i', 'm', 'a', '4'):
- // TODO: QT IMA ADPCM is not Seekable
- // Need to make this function return only an AudioStream and adapt
- // calling code to use dynamic_cast.
+ // TODO: Use QT IMA ADPCM
warning("Unhandled AIFF-C QT IMA ADPCM compression");
break;
case MKTAG('Q', 'D', 'M', '2'):
@@ -222,10 +213,10 @@ AudioStream *makeAIFFAudioStream(Common::SeekableReadStream *stream, DisposeAfte
break;
case MKTAG('A', 'D', 'P', '4'):
// ADP4 on 3DO
- return make3DO_ADP4AudioStream(dataStream, rate, stereo);
+ return make3DO_ADP4AudioStream(dataStream, rate, channels == 2);
case MKTAG('S', 'D', 'X', '2'):
// SDX2 on 3DO
- return make3DO_SDX2AudioStream(dataStream, rate, stereo);
+ return make3DO_SDX2AudioStream(dataStream, rate, channels == 2);
default:
warning("Unhandled AIFF-C compression tag '%s'", tag2str(codec));
}
diff --git a/audio/decoders/aiff.h b/audio/decoders/aiff.h
index 14bfd05ad9..3af2efb4c9 100644
--- a/audio/decoders/aiff.h
+++ b/audio/decoders/aiff.h
@@ -42,8 +42,7 @@ class SeekableReadStream;
namespace Audio {
-class AudioStream;
-class SeekableAudioStream;
+class RewindableAudioStream;
/**
* Try to load an AIFF from the given seekable stream and create an AudioStream
@@ -53,11 +52,7 @@ class SeekableAudioStream;
* @param disposeAfterUse whether to delete the stream after use
* @return a new SeekableAudioStream, or NULL, if an error occurred
*/
-SeekableAudioStream *makeAIFFStream(
- Common::SeekableReadStream *stream,
- DisposeAfterUse::Flag disposeAfterUse);
-
-AudioStream *makeAIFFAudioStream(
+RewindableAudioStream *makeAIFFStream(
Common::SeekableReadStream *stream,
DisposeAfterUse::Flag disposeAfterUse);
diff --git a/engines/bbvs/sound.h b/engines/bbvs/sound.h
index 4e44c2b962..4d3253c48e 100644
--- a/engines/bbvs/sound.h
+++ b/engines/bbvs/sound.h
@@ -38,7 +38,7 @@ public:
void stop();
bool isPlaying();
protected:
- Audio::SeekableAudioStream *_stream;
+ Audio::RewindableAudioStream *_stream;
Audio::SoundHandle _handle;
// Keep the filename for debugging purposes
Common::String _filename;
diff --git a/engines/pegasus/sound.cpp b/engines/pegasus/sound.cpp
index 5b437b81d4..ddcb2be010 100644
--- a/engines/pegasus/sound.cpp
+++ b/engines/pegasus/sound.cpp
@@ -59,7 +59,15 @@ void Sound::initFromAIFFFile(const Common::String &fileName) {
return;
}
- _stream = Audio::makeAIFFStream(file, DisposeAfterUse::YES);
+ Audio::RewindableAudioStream *stream = Audio::makeAIFFStream(file, DisposeAfterUse::YES);
+
+ _stream = dynamic_cast<Audio::SeekableAudioStream *>(stream);
+
+ if (!_stream) {
+ delete stream;
+ warning("AIFF stream '%s' is not seekable", fileName.c_str());
+ return;
+ }
}
void Sound::initFromQuickTime(const Common::String &fileName) {
diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp
index 39578e96f0..b8d03c9c08 100644
--- a/engines/saga/sndres.cpp
+++ b/engines/saga/sndres.cpp
@@ -327,9 +327,18 @@ bool SndRes::load(ResourceContext *context, uint32 resourceId, SoundBuffer &buff
result = true;
} break;
case kSoundAIFF: {
- Audio::SeekableAudioStream *audStream = Audio::makeAIFFStream(READ_STREAM(soundResourceLength), DisposeAfterUse::YES);
- buffer.stream = audStream;
- buffer.streamLength = audStream->getLength();
+ Audio::RewindableAudioStream *audStream = Audio::makeAIFFStream(READ_STREAM(soundResourceLength), DisposeAfterUse::YES);
+ Audio::SeekableAudioStream *seekStream = dynamic_cast<Audio::SeekableAudioStream *>(audStream);
+
+ if (!seekStream) {
+ warning("AIFF file is not seekable");
+ delete audStream;
+ result = false;
+ break;
+ }
+
+ buffer.stream = seekStream;
+ buffer.streamLength = seekStream->getLength();
result = true;
} break;
case kSoundVOC: {
diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp
index 757d622962..fb9a3f17b9 100644
--- a/engines/sci/sound/audio.cpp
+++ b/engines/sci/sound/audio.cpp
@@ -391,7 +391,13 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32
} else if (audioRes->size > 4 && READ_BE_UINT32(audioRes->data) == MKTAG('F','O','R','M')) {
// AIFF detected
Common::SeekableReadStream *waveStream = new Common::MemoryReadStream(audioRes->data, audioRes->size, DisposeAfterUse::NO);
- audioSeekStream = Audio::makeAIFFStream(waveStream, DisposeAfterUse::YES);
+ Audio::RewindableAudioStream *rewindStream = Audio::makeAIFFStream(waveStream, DisposeAfterUse::YES);
+ audioSeekStream = dynamic_cast<Audio::SeekableAudioStream *>(rewindStream);
+
+ if (!audioSeekStream) {
+ warning("AIFF file is not seekable");
+ delete rewindStream;
+ }
} else if (audioRes->size > 14 && READ_BE_UINT16(audioRes->data) == 1 && READ_BE_UINT16(audioRes->data + 2) == 1
&& READ_BE_UINT16(audioRes->data + 4) == 5 && READ_BE_UINT32(audioRes->data + 10) == 0x00018051) {
// Mac snd detected
diff --git a/engines/sherlock/debugger.cpp b/engines/sherlock/debugger.cpp
index a627d7c494..4d8ea6c447 100644
--- a/engines/sherlock/debugger.cpp
+++ b/engines/sherlock/debugger.cpp
@@ -106,7 +106,7 @@ bool Debugger::cmd3DO_PlayAudio(int argc, const char **argv) {
Audio::SoundHandle testHandle;
// Try to load the given file as AIFF/AIFC
- testStream = Audio::makeAIFFAudioStream(file, DisposeAfterUse::YES);
+ testStream = Audio::makeAIFFStream(file, DisposeAfterUse::YES);
if (testStream) {
g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &testHandle, testStream);