[Scummvm-cvs-logs] scummvm master -> 35f08ca0fbcead4f18b65baba35f83c3e9f2a914

Strangerke Strangerke at scummvm.org
Sun Jan 3 00:24:40 CET 2016


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:
35f08ca0fb TONY: Add support for compressed music and sfx


Commit: 35f08ca0fbcead4f18b65baba35f83c3e9f2a914
    https://github.com/scummvm/scummvm/commit/35f08ca0fbcead4f18b65baba35f83c3e9f2a914
Author: Strangerke (strangerke at scummvm.org)
Date: 2016-01-03T00:17:43+01:00

Commit Message:
TONY: Add support for compressed music and sfx

Changed paths:
    engines/tony/sound.cpp
    engines/tony/sound.h



diff --git a/engines/tony/sound.cpp b/engines/tony/sound.cpp
index faf91c1..2fc0afa 100644
--- a/engines/tony/sound.cpp
+++ b/engines/tony/sound.cpp
@@ -28,7 +28,9 @@
 
 #include "audio/audiostream.h"
 #include "audio/decoders/adpcm.h"
-#include "audio/decoders/raw.h"
+#include "audio/decoders/flac.h"
+#include "audio/decoders/mp3.h"
+#include "audio/decoders/vorbis.h"
 #include "audio/decoders/wave.h"
 #include "common/textconsole.h"
 #include "tony/game.h"
@@ -49,6 +51,18 @@ static int remapVolume(int volume) {
 	return (int)((double)Audio::Mixer::kMaxChannelVolume * pow(10.0, dsvol / 2000.0) + 0.5);
 }
 
+// Another obvious rip from gob engine. Hi DrMcCoy!
+Common::String setExtension(const Common::String &str, const Common::String &ext) {
+	if (str.empty())
+		return str;
+
+	const char *dot = strrchr(str.c_str(), '.');
+	if (dot)
+		return Common::String(str.c_str(), dot - str.c_str()) + ext;
+
+	return str + ext;
+}
+
 /****************************************************************************\
 *       FPSOUND Methods
 \****************************************************************************/
@@ -226,22 +240,59 @@ bool FPSfx::loadFile(const char *fileName) {
 	if (!_soundSupported)
 		return true;
 
+	SoundCodecs codec = FPCODEC_UNKNOWN;
+
 	Common::File file;
-	if (!file.open(fileName)) {
+	if (file.open(fileName))
+		codec = FPCODEC_ADPCM;
+	else if (file.open(setExtension(fileName, ".MP3")))
+		codec = FPCODEC_MP3;
+	else if (file.open(setExtension(fileName, ".OGG")))
+		codec = FPCODEC_OGG;
+	else if (file.open(setExtension(fileName, ".FLA")))
+		codec = FPCODEC_FLAC;
+	else {
 		warning("FPSfx::LoadFile(): Cannot open sfx file!");
 		return false;
 	}
 
-	if (file.readUint32BE() != MKTAG('A', 'D', 'P', 0x10)) {
-		warning("FPSfx::LoadFile(): Invalid ADP header!");
+	Common::SeekableReadStream *buffer;
+	switch (codec) {
+	case FPCODEC_ADPCM: {
+		if (file.readUint32BE() != MKTAG('A', 'D', 'P', 0x10)) {
+			warning("FPSfx::LoadFile(): Invalid ADP header!");
+			return false;
+		}
+
+		uint32 rate = file.readUint32LE();
+		uint32 channels = file.readUint32LE();
+
+		buffer = file.readStream(file.size() - file.pos());
+		_rewindableStream = Audio::makeADPCMStream(buffer, DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, channels);
+		}
+		break;
+	case FPCODEC_MP3:
+#ifdef USE_MAD
+		buffer = file.readStream(file.size());
+		_rewindableStream = Audio::makeMP3Stream(buffer, DisposeAfterUse::YES);
+#endif
+		break;
+	case FPCODEC_OGG:
+#ifdef USE_VORBIS
+		buffer = file.readStream(file.size());
+		_rewindableStream = Audio::makeVorbisStream(buffer, DisposeAfterUse::YES);
+#endif
+		break;
+	case FPCODEC_FLAC:
+		buffer = file.readStream(file.size());
+#ifdef USE_FLAC
+		_rewindableStream = Audio::makeFLACStream(buffer, DisposeAfterUse::YES);
+#endif
+		break;
+	default:
 		return false;
 	}
 
-	uint32 rate = file.readUint32LE();
-	uint32 channels = file.readUint32LE();
-
-	Common::SeekableReadStream *buffer = file.readStream(file.size() - file.pos());
-	_rewindableStream = Audio::makeADPCMStream(buffer, DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, channels);
 	_fileLoaded = true;
 	return true;
 }
@@ -457,7 +508,7 @@ void FPStream::release() {
  * Opens a file stream
  *
  * @param fileName      Filename to be opened
- * @param codec         CODEC to be used to uncompress samples
+ * @param bufSize       Buffer size
  *
  * @returns             True is everything is OK, False otherwise
  */
@@ -468,13 +519,32 @@ bool FPStream::loadFile(const Common::String &fileName, int bufSize) {
 	if (_fileLoaded)
 		unloadFile();
 
+	SoundCodecs codec = FPCODEC_UNKNOWN;
+
 	// Open the file stream for reading
-	if (!_file.open(fileName)) {
-		// Fallback: try with an extra '0' prefix
-		if (!_file.open("0" + fileName))
-			return false;
+	if (_file.open(fileName))
+		codec = FPCODEC_ADPCM;
+	else if (_file.open(setExtension(fileName, ".MP3")))
+		codec = FPCODEC_MP3;
+	else if (_file.open(setExtension(fileName, ".OGG")))
+		codec = FPCODEC_OGG;
+	else if (_file.open(setExtension(fileName, ".FLA")))
+		codec = FPCODEC_FLAC;
+	// Fallback: try with an extra '0' prefix
+	else if (_file.open("0" + fileName)) {
+		codec = FPCODEC_ADPCM;
 		warning("FPStream::loadFile(): Fallback from %s to %s", fileName.c_str(), _file.getName());
-	}
+	} else if (_file.open(setExtension("0" + fileName, ".MP3"))) {
+		codec = FPCODEC_MP3;
+		warning("FPStream::loadFile(): Fallback from %s to %s", fileName.c_str(), _file.getName());
+	} else if (_file.open(setExtension("0" + fileName, ".OGG"))) {
+		codec = FPCODEC_OGG;
+		warning("FPStream::loadFile(): Fallback from %s to %s", fileName.c_str(), _file.getName());
+	} else if (_file.open(setExtension("0" + fileName, ".FLA"))) {
+		codec = FPCODEC_FLAC;
+		warning("FPStream::loadFile(): Fallback from %s to %s", fileName.c_str(), _file.getName());
+	} else
+		return false;
 
 	// Save the size of the stream
 	_size = _file.size();
@@ -482,9 +552,45 @@ bool FPStream::loadFile(const Common::String &fileName, int bufSize) {
 #ifdef __amigaos4__
 	// HACK: AmigaOS 4 has weird performance problems with reading in the audio thread,
 	// so we read the whole stream into memory.
-	_rewindableStream = Audio::makeADPCMStream(_file.readStream(_size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, 44100, 2);
+	switch (codec) {
+	case FPCODEC_ADPCM:
+		_rewindableStream = Audio::makeADPCMStream(_file.readStream(_size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, 44100, 2);
+		break;
+	case FPCODEC_MP3:
+		_rewindableStream = Audio::makeMP3Stream(&_file, DisposeAfterUse::YES);
+		break;
+	case FPCODEC_OGG:
+		_rewindableStream = Audio::makeVorbisStream(&_file, DisposeAfterUse::YES);
+		break;
+	case FPCODEC_FLAC:
+		_rewindableStream = Audio::makeFLACStream(&_file, DisposeAfterUse::YES);
+		break;
+	default:
+		break;
+	}
 #else
-	_rewindableStream = Audio::makeADPCMStream(&_file, DisposeAfterUse::NO, 0, Audio::kADPCMDVI, 44100, 2);
+	switch (codec) {
+	case FPCODEC_ADPCM:
+		_rewindableStream = Audio::makeADPCMStream(&_file, DisposeAfterUse::NO, 0, Audio::kADPCMDVI, 44100, 2);
+		break;
+	case FPCODEC_MP3:
+#ifdef USE_MAD
+		_rewindableStream = Audio::makeMP3Stream(&_file, DisposeAfterUse::NO);
+#endif
+		break;
+	case FPCODEC_OGG:
+#ifdef USE_VORBIS
+		_rewindableStream = Audio::makeVorbisStream(&_file, DisposeAfterUse::NO);
+#endif
+		break;
+	case FPCODEC_FLAC:
+#ifdef USE_FLAC
+		_rewindableStream = Audio::makeFLACStream(&_file, DisposeAfterUse::NO);
+#endif
+		break;
+	default:
+		break;
+	}
 #endif
 
 	// All done
diff --git a/engines/tony/sound.h b/engines/tony/sound.h
index 2ea1162..206935f 100644
--- a/engines/tony/sound.h
+++ b/engines/tony/sound.h
@@ -45,8 +45,11 @@ class FPStream;
 class FPSfx;
 
 enum SoundCodecs {
-	FPCODEC_RAW,
-	FPCODEC_ADPCM
+	FPCODEC_UNKNOWN,
+	FPCODEC_ADPCM,
+	FPCODEC_MP3,
+	FPCODEC_OGG,
+	FPCODEC_FLAC
 };
 
 /**






More information about the Scummvm-git-logs mailing list