[Scummvm-cvs-logs] scummvm master -> b6fdc7be888034eb67e7b667a8d362105067a7ca

clone2727 clone2727 at gmail.com
Sat Jun 6 23:21:50 CEST 2015


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
b6fdc7be88 AUDIO: Make makeAIFFStream return a RewindableAudioStream


Commit: b6fdc7be888034eb67e7b667a8d362105067a7ca
    https://github.com/scummvm/scummvm/commit/b6fdc7be888034eb67e7b667a8d362105067a7ca
Author: Matthew Hoops (clone2727 at gmail.com)
Date: 2015-06-06T17:20:41-04:00

Commit Message:
AUDIO: Make makeAIFFStream return a RewindableAudioStream

All callers requiring SeekableAudioStream have been adapted by using dynamic_cast

Changed paths:
    audio/decoders/aiff.cpp
    audio/decoders/aiff.h
    engines/bbvs/sound.h
    engines/pegasus/sound.cpp
    engines/saga/sndres.cpp
    engines/sci/sound/audio.cpp
    engines/sherlock/debugger.cpp



diff --git a/audio/decoders/aiff.cpp b/audio/decoders/aiff.cpp
index 3a5849f..7d6ed43 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 14bfd05..3af2efb 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 4e44c2b..4d3253c 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 5b437b8..ddcb2be 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 39578e9..b8d03c9 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 757d622..fb9a3f1 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 a627d7c..4d8ea6c 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);






More information about the Scummvm-git-logs mailing list