diff options
-rw-r--r-- | audio/decoders/aiff.cpp | 21 | ||||
-rw-r--r-- | audio/decoders/aiff.h | 9 | ||||
-rw-r--r-- | engines/bbvs/sound.h | 2 | ||||
-rw-r--r-- | engines/pegasus/sound.cpp | 10 | ||||
-rw-r--r-- | engines/saga/sndres.cpp | 15 | ||||
-rw-r--r-- | engines/sci/sound/audio.cpp | 8 | ||||
-rw-r--r-- | engines/sherlock/debugger.cpp | 2 |
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); |