diff options
author | Vincent Bénony | 2016-01-06 16:20:23 +0100 |
---|---|---|
committer | Vincent Bénony | 2016-01-06 16:20:23 +0100 |
commit | efdb5679ce6304dbc854afbbc511e633d7513338 (patch) | |
tree | e680a240e5f6018fc3a4cce53b50060caa22a929 /engines/tony | |
parent | 4687ff6d6d2863cc95c8137543ecf9c39bc01723 (diff) | |
parent | b72c02bad44749a1355acefdb198e36b2e772575 (diff) | |
download | scummvm-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.cpp | 27 | ||||
-rw-r--r-- | engines/tony/loc.h | 2 | ||||
-rw-r--r-- | engines/tony/sound.cpp | 208 | ||||
-rw-r--r-- | engines/tony/sound.h | 13 | ||||
-rw-r--r-- | engines/tony/tony.cpp | 41 | ||||
-rw-r--r-- | engines/tony/tony.h | 1 |
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; |