aboutsummaryrefslogtreecommitdiff
path: root/engines/tony
diff options
context:
space:
mode:
authorVincent Bénony2016-01-06 16:20:23 +0100
committerVincent Bénony2016-01-06 16:20:23 +0100
commitefdb5679ce6304dbc854afbbc511e633d7513338 (patch)
treee680a240e5f6018fc3a4cce53b50060caa22a929 /engines/tony
parent4687ff6d6d2863cc95c8137543ecf9c39bc01723 (diff)
parentb72c02bad44749a1355acefdb198e36b2e772575 (diff)
downloadscummvm-rg350-efdb5679ce6304dbc854afbbc511e633d7513338.tar.gz
scummvm-rg350-efdb5679ce6304dbc854afbbc511e633d7513338.tar.bz2
scummvm-rg350-efdb5679ce6304dbc854afbbc511e633d7513338.zip
IOS: Merge branch 'master' into ios-fix
Diffstat (limited to 'engines/tony')
-rw-r--r--engines/tony/loc.cpp27
-rw-r--r--engines/tony/loc.h2
-rw-r--r--engines/tony/sound.cpp208
-rw-r--r--engines/tony/sound.h13
-rw-r--r--engines/tony/tony.cpp41
-rw-r--r--engines/tony/tony.h1
6 files changed, 206 insertions, 86 deletions
diff --git a/engines/tony/loc.cpp b/engines/tony/loc.cpp
index 09a00deed1..be2b20294f 100644
--- a/engines/tony/loc.cpp
+++ b/engines/tony/loc.cpp
@@ -506,15 +506,13 @@ void RMItem::readFromStream(Common::SeekableReadStream &ds, bool bLOX) {
if (!ds.err()) {
for (int i = 0; i < _nSprites && !ds.err(); i++) {
// Download the sprites
- if (bLOX) {
+ if (bLOX)
_sprites[i].LOXGetSizeFromStream(ds, &dimx, &dimy);
- _sprites[i].init(newItemSpriteBuffer(dimx, dimy, true));
- _sprites[i].readFromStream(ds, true);
- } else {
+ else
_sprites[i].getSizeFromStream(ds, &dimx, &dimy);
- _sprites[i].init(newItemSpriteBuffer(dimx, dimy, false));
- _sprites[i].readFromStream(ds, false);
- }
+
+ _sprites[i].init(newItemSpriteBuffer(dimx, dimy, bLOX));
+ _sprites[i].readFromStream(ds, bLOX);
if (_cm == CM_256 && _bPal)
_sprites[i].setPalette(_pal._data);
@@ -523,21 +521,14 @@ void RMItem::readFromStream(Common::SeekableReadStream &ds, bool bLOX) {
if (!ds.err()) {
for (int i = 0; i < _nSfx && !ds.err(); i++) {
- if (bLOX)
- _sfx[i].readFromStream(ds, true);
- else
- _sfx[i].readFromStream(ds, false);
+ _sfx[i].readFromStream(ds, bLOX);
}
}
// Read the pattern from pattern 1
if (!ds.err()) {
- for (int i = 1; i <= _nPatterns && !ds.err(); i++) {
- if (bLOX)
- _patterns[i].readFromStream(ds, true);
- else
- _patterns[i].readFromStream(ds, false);
- }
+ for (int i = 1; i <= _nPatterns && !ds.err(); i++)
+ _patterns[i].readFromStream(ds, bLOX);
}
// Initialize the current pattern
@@ -610,7 +601,7 @@ void RMItem::draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim) {
// Offset direction for scrolling
prim->getDst().offset(-_curScroll);
- // We must offset the cordinates of the item inside the primitive
+ // We must offset the coordinates of the item inside the primitive
// It is estimated as nonno + (babbo + figlio)
prim->getDst().offset(calculatePos());
diff --git a/engines/tony/loc.h b/engines/tony/loc.h
index ac65a4a0bd..d065d60445 100644
--- a/engines/tony/loc.h
+++ b/engines/tony/loc.h
@@ -151,7 +151,7 @@ public:
// Reads the position of the pattern
RMPoint pos();
- void readFromStream(Common::ReadStream &ds, bool bLOX = false);
+ void readFromStream(Common::ReadStream &ds, bool bLOX);
private:
void updateCoord();
diff --git a/engines/tony/sound.cpp b/engines/tony/sound.cpp
index 2a4eb826f3..aa86750ad5 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
\****************************************************************************/
@@ -204,12 +218,45 @@ bool FPSfx::loadVoiceFromVDB(Common::File &vdbFP) {
if (!_soundSupported)
return true;
- uint32 size = vdbFP.readUint32LE();
- uint32 rate = vdbFP.readUint32LE();
- _isVoice = true;
-
- _rewindableStream = Audio::makeADPCMStream(vdbFP.readStream(size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, 1);
+ switch (g_vm->_vdbCodec) {
+ case FPCODEC_ADPCM: {
+ uint32 size = vdbFP.readUint32LE();
+ uint32 rate = vdbFP.readUint32LE();
+ _rewindableStream = Audio::makeADPCMStream(vdbFP.readStream(size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, 1);
+ }
+ break;
+ case FPCODEC_MP3 : {
+#ifdef USE_MAD
+ uint32 size = vdbFP.readUint32LE();
+ _rewindableStream = Audio::makeMP3Stream(vdbFP.readStream(size), DisposeAfterUse::YES);
+#else
+ return false;
+#endif
+ }
+ break;
+ case FPCODEC_OGG : {
+#ifdef USE_VORBIS
+ uint32 size = vdbFP.readUint32LE();
+ _rewindableStream = Audio::makeVorbisStream(vdbFP.readStream(size), DisposeAfterUse::YES);
+#else
+ return false;
+#endif
+ }
+ break;
+ case FPCODEC_FLAC : {
+#ifdef USE_FLAC
+ uint32 size = vdbFP.readUint32LE();
+ _rewindableStream = Audio::makeFLACStream(vdbFP.readStream(size), DisposeAfterUse::YES);
+#else
+ return false;
+#endif
+ }
+ break;
+ default:
+ return false;
+ }
+ _isVoice = true;
_fileLoaded = true;
setVolume(62);
return true;
@@ -219,39 +266,64 @@ bool FPSfx::loadVoiceFromVDB(Common::File &vdbFP) {
* Opens a file and loads a sound effect.
*
* @param fileName Sfx filename
- * @param codec CODEC used to uncompress the samples
*
* @returns True is everything is OK, False otherwise
*/
-bool FPSfx::loadFile(const char *fileName, uint32 codec) {
+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!");
- return false;
- }
-
- uint32 rate = file.readUint32LE();
- uint32 channels = file.readUint32LE();
+ Common::SeekableReadStream *buffer;
+ switch (codec) {
+ case FPCODEC_ADPCM: {
+ if (file.readUint32BE() != MKTAG('A', 'D', 'P', 0x10)) {
+ warning("FPSfx::LoadFile(): Invalid ADP header!");
+ return false;
+ }
- Common::SeekableReadStream *buffer = file.readStream(file.size() - file.pos());
+ uint32 rate = file.readUint32LE();
+ uint32 channels = file.readUint32LE();
- if (codec == FPCODEC_ADPCM) {
+ buffer = file.readStream(file.size() - file.pos());
_rewindableStream = Audio::makeADPCMStream(buffer, DisposeAfterUse::YES, 0, Audio::kADPCMDVI, rate, channels);
- } else {
- byte flags = Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN;
-
- if (channels == 2)
- flags |= Audio::FLAG_STEREO;
-
- _rewindableStream = Audio::makeRawStream(buffer, rate, flags, DisposeAfterUse::YES);
+ }
+ 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;
}
_fileLoaded = true;
@@ -469,50 +541,96 @@ 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
*/
-bool FPStream::loadFile(const Common::String &fileName, uint32 codec, int bufSize) {
+bool FPStream::loadFile(const Common::String &fileName, int bufSize) {
if (!_soundSupported)
return true;
if (_fileLoaded)
unloadFile();
- // Save the codec type
- _codec = codec;
+ 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();
- switch (_codec) {
- case FPCODEC_RAW:
- _rewindableStream = Audio::makeRawStream(&_file, 44100, Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN | Audio::FLAG_STEREO, DisposeAfterUse::NO);
- break;
-
- case FPCODEC_ADPCM:
#ifdef __amigaos4__
- // HACK: AmigaOS 4 has weird performance problems with reading in the audio thread,
- // so we read the whole stream into memory.
+ // HACK: AmigaOS 4 has weird performance problems with reading in the audio thread,
+ // so we read the whole stream into memory.
+ switch (codec) {
+ case FPCODEC_ADPCM:
_rewindableStream = Audio::makeADPCMStream(_file.readStream(_size), DisposeAfterUse::YES, 0, Audio::kADPCMDVI, 44100, 2);
+ break;
+ case FPCODEC_MP3:
+#ifdef USE_MAD
+ _rewindableStream = Audio::makeMP3Stream(&_file, DisposeAfterUse::YES);
+#endif
+ break;
+ case FPCODEC_OGG:
+#ifdef USE_VORBIS
+ _rewindableStream = Audio::makeVorbisStream(&_file, DisposeAfterUse::YES);
+#endif
+ break;
+ case FPCODEC_FLAC:
+#ifdef USE_FLAC
+ _rewindableStream = Audio::makeFLACStream(&_file, DisposeAfterUse::YES);
+#endif
+ break;
+ default:
+ break;
+ }
#else
+ 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:
- _file.close();
- return false;
+ break;
}
+#endif
// All done
_fileLoaded = true;
diff --git a/engines/tony/sound.h b/engines/tony/sound.h
index 446dc68d80..206935f314 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
};
/**
@@ -179,7 +182,7 @@ public:
* @returns True is everything is OK, False otherwise
*/
- bool loadFile(const char *fileName, uint32 codec = FPCODEC_RAW);
+ bool loadFile(const char *fileName);
bool loadWave(Common::SeekableReadStream *stream);
bool loadVoiceFromVDB(Common::File &vdbFP);
@@ -246,7 +249,6 @@ class FPStream {
private:
uint32 _bufferSize; // Buffer size (bytes)
uint32 _size; // Stream size (bytes)
- uint32 _codec; // CODEC used
Common::File _file; // File handle used for the stream
@@ -297,12 +299,11 @@ public:
* Opens a file stream
*
* @param fileName Filename to be opened
- * @param codec CODEC to be used to uncompress samples
*
* @returns True is everything is OK, False otherwise
*/
- bool loadFile(const Common::String &fileName, uint32 codec = FPCODEC_RAW, int sync = 2000);
+ bool loadFile(const Common::String &fileName, int sync);
/**
* Closes a file stream (opened or not).
diff --git a/engines/tony/tony.cpp b/engines/tony/tony.cpp
index 2857bb93f8..d8fa45cb5d 100644
--- a/engines/tony/tony.cpp
+++ b/engines/tony/tony.cpp
@@ -82,6 +82,7 @@ TonyEngine::TonyEngine(OSystem *syst, const TonyGameDescription *gameDesc) : Eng
_bQuitNow = false;
_bTimeFreezed = false;
_nTimeFreezed = 0;
+ _vdbCodec = FPCODEC_UNKNOWN;
}
TonyEngine::~TonyEngine() {
@@ -323,10 +324,10 @@ void TonyEngine::playMusic(int nChannel, const Common::String &fname, int nFX, b
_stream[GLOBALS._nextChannel]->unloadFile();
if (!getIsDemo()) {
- if (!_stream[GLOBALS._nextChannel]->loadFile(fname, FPCODEC_ADPCM, nSync))
+ if (!_stream[GLOBALS._nextChannel]->loadFile(fname, nSync))
error("failed to open music file '%s'", fname.c_str());
} else {
- _stream[GLOBALS._nextChannel]->loadFile(fname, FPCODEC_ADPCM, nSync);
+ _stream[GLOBALS._nextChannel]->loadFile(fname, nSync);
}
_stream[GLOBALS._nextChannel]->setLoop(bLoop);
@@ -335,10 +336,10 @@ void TonyEngine::playMusic(int nChannel, const Common::String &fname, int nFX, b
GLOBALS._flipflop = 1 - GLOBALS._flipflop;
} else {
if (!getIsDemo()) {
- if (!_stream[nChannel]->loadFile(fname, FPCODEC_ADPCM, nSync))
+ if (!_stream[nChannel]->loadFile(fname, nSync))
error("failed to open music file '%s'", fname.c_str());
} else {
- _stream[nChannel]->loadFile(fname, FPCODEC_ADPCM, nSync);
+ _stream[nChannel]->loadFile(fname, nSync);
}
_stream[nChannel]->setLoop(bLoop);
@@ -356,10 +357,10 @@ void TonyEngine::doNextMusic(CORO_PARAM, const void *param) {
CORO_BEGIN_CODE(_ctx);
if (!g_vm->getIsDemo()) {
- if (!streams[GLOBALS._nextChannel]->loadFile(GLOBALS._nextMusic, FPCODEC_ADPCM, GLOBALS._nextSync))
+ if (!streams[GLOBALS._nextChannel]->loadFile(GLOBALS._nextMusic, GLOBALS._nextSync))
error("failed to open next music file '%s'", GLOBALS._nextMusic.c_str());
} else {
- streams[GLOBALS._nextChannel]->loadFile(GLOBALS._nextMusic, FPCODEC_ADPCM, GLOBALS._nextSync);
+ streams[GLOBALS._nextChannel]->loadFile(GLOBALS._nextMusic, GLOBALS._nextSync);
}
streams[GLOBALS._nextChannel]->setLoop(GLOBALS._nextLoop);
@@ -433,7 +434,7 @@ void TonyEngine::preloadSFX(int nChannel, const char *fn) {
_theSound.createSfx(&_sfx[nChannel]);
- _sfx[nChannel]->loadFile(fn, FPCODEC_ADPCM);
+ _sfx[nChannel]->loadFile(fn);
}
FPSfx *TonyEngine::createSFX(Common::SeekableReadStream *stream) {
@@ -453,7 +454,7 @@ void TonyEngine::preloadUtilSFX(int nChannel, const char *fn) {
_theSound.createSfx(&_utilSfx[nChannel]);
- _utilSfx[nChannel]->loadFile(fn, FPCODEC_ADPCM);
+ _utilSfx[nChannel]->loadFile(fn);
_utilSfx[nChannel]->setVolume(63);
}
@@ -573,18 +574,26 @@ void TonyEngine::loadState(CORO_PARAM, int n) {
}
bool TonyEngine::openVoiceDatabase() {
- char id[4];
- uint32 numfiles;
-
// Open the voices database
if (!_vdbFP.open("voices.vdb"))
- return false;
+ if (!_vdbFP.open("voices.mdb"))
+ if (!_vdbFP.open("voices.odb"))
+ if (!_vdbFP.open("voices.fdb"))
+ return false;
_vdbFP.seek(-8, SEEK_END);
- numfiles = _vdbFP.readUint32LE();
- _vdbFP.read(id, 4);
-
- if (id[0] != 'V' || id[1] != 'D' || id[2] != 'B' || id[3] != '1') {
+ uint32 numfiles = _vdbFP.readUint32LE();
+ int32 id = _vdbFP.readUint32BE();
+
+ if (id == MKTAG('V', 'D', 'B', '1'))
+ _vdbCodec = FPCODEC_ADPCM;
+ else if (id == MKTAG('M', 'D', 'B', '1'))
+ _vdbCodec = FPCODEC_MP3;
+ else if (id == MKTAG('O', 'D', 'B', '1'))
+ _vdbCodec = FPCODEC_OGG;
+ else if (id == MKTAG('F', 'D', 'B', '1'))
+ _vdbCodec = FPCODEC_FLAC;
+ else {
_vdbFP.close();
return false;
}
diff --git a/engines/tony/tony.h b/engines/tony/tony.h
index 40a5184c31..40bace8db8 100644
--- a/engines/tony/tony.h
+++ b/engines/tony/tony.h
@@ -104,6 +104,7 @@ public:
RMResUpdate _resUpdate;
uint32 _hEndOfFrame;
Common::File _vdbFP;
+ SoundCodecs _vdbCodec;
Common::Array<VoiceHeader> _voices;
FPSound _theSound;
Common::List<FPSfx *> _activeSfx;