From 4ab45170163f70a85c400bc50d0e20501e0cd24c Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 22 Jun 2009 20:27:47 +0000 Subject: Added stream-reading loading wrappers to MDYPlayer and added a workaround to fix TBR reading for the moment svn-id: r41781 --- engines/gob/sound/adlib.cpp | 69 ++++++++++++++++++++++++++++++++------------- engines/gob/sound/adlib.h | 5 ++++ engines/gob/sound/sound.cpp | 26 +++++++++++++++-- 3 files changed, 78 insertions(+), 22 deletions(-) (limited to 'engines/gob') diff --git a/engines/gob/sound/adlib.cpp b/engines/gob/sound/adlib.cpp index a888b6ee49..32452b3d84 100644 --- a/engines/gob/sound/adlib.cpp +++ b/engines/gob/sound/adlib.cpp @@ -498,18 +498,13 @@ void MDYPlayer::init() { _timbresSize = 0; } -bool MDYPlayer::loadMDY(const char *fileName) { - Common::File song; - byte mdyHeader[70]; - - unload(); - song.open(fileName); - if (!song.isOpen()) - return false; +bool MDYPlayer::loadMDY(Common::SeekableReadStream &stream) { + unloadMDY(); _freeData = true; - song.read(mdyHeader, 70); + byte mdyHeader[70]; + stream.read(mdyHeader, 70); _tickBeat = mdyHeader[36]; _beatMeasure = mdyHeader[37]; @@ -527,8 +522,7 @@ bool MDYPlayer::loadMDY(const char *fileName) { _pitchBendRangeStep = 300; _data = new byte[_dataSize]; - song.read(_data, _dataSize); - song.close(); + stream.read(_data, _dataSize); reset(); _playPos = _data; @@ -536,28 +530,63 @@ bool MDYPlayer::loadMDY(const char *fileName) { return true; } +bool MDYPlayer::loadMDY(const char *fileName) { + Common::File song; + + song.open(fileName); + if (!song.isOpen()) + return false; + + bool loaded = loadMDY(song); + + song.close(); + + return loaded; +} + +bool MDYPlayer::loadTBR(Common::SeekableReadStream &stream) { + unloadTBR(); + + _timbresSize = stream.size(); + + // FIXME: _timbresSize is smaller than setVoice() expects! + uint32 rSize = MAX(_timbresSize, 810); + + _timbres = new byte[rSize]; + memset(_timbres, 0, rSize); + + stream.read(_timbres, _timbresSize); + + reset(); + setVoices(); + + return true; +} + bool MDYPlayer::loadTBR(const char *fileName) { Common::File timbres; - unload(); timbres.open(fileName); if (!timbres.isOpen()) return false; - _timbresSize = timbres.size(); - _timbres = new byte[_timbresSize]; - timbres.read(_timbres, _timbresSize); - timbres.close(); + bool loaded = loadTBR(timbres); - reset(); - setVoices(); + timbres.close(); - return true; + return loaded; } void MDYPlayer::unload() { + unloadTBR(); + unloadMDY(); +} + +void MDYPlayer::unloadMDY() { AdLib::unload(); +} +void MDYPlayer::unloadTBR() { delete[] _timbres; _timbres = 0; @@ -636,7 +665,7 @@ void MDYPlayer::interpret() { setVoice(channel, timbre, false); break; case 0xE0: - warning("Pitch bend not yet implemented\n"); + warning("Pitch bend not yet implemented"); note = *(_playPos)++; note += (unsigned)(*(_playPos++)) << 7; diff --git a/engines/gob/sound/adlib.h b/engines/gob/sound/adlib.h index 3772b93551..3f7b46643f 100644 --- a/engines/gob/sound/adlib.h +++ b/engines/gob/sound/adlib.h @@ -142,7 +142,9 @@ public: ~MDYPlayer(); bool loadMDY(const char *fileName); + bool loadMDY(Common::SeekableReadStream &stream); bool loadTBR(const char *fileName); + bool loadTBR(Common::SeekableReadStream &stream); void unload(); @@ -162,6 +164,9 @@ protected: void setVoices(); void setVoice(byte voice, byte instr, bool set); + void unloadTBR(); + void unloadMDY(); + private: void init(); }; diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp index 21e06e4700..d667a2d592 100644 --- a/engines/gob/sound/sound.cpp +++ b/engines/gob/sound/sound.cpp @@ -279,7 +279,18 @@ bool Sound::adlibLoadMDY(const char *fileName) { debugC(1, kDebugSound, "Adlib: Loading MDY data (\"%s\")", fileName); - return _mdyPlayer->loadMDY(fileName); + if (!_vm->_dataIO->existData(fileName)) { + warning("Can't open MDY file \"%s\"", fileName); + return false; + } + + DataStream *stream = _vm->_dataIO->getDataStream(fileName); + + bool loaded = _mdyPlayer->loadMDY(*stream); + + delete stream; + + return loaded; } bool Sound::adlibLoadTBR(const char *fileName) { @@ -289,9 +300,20 @@ bool Sound::adlibLoadTBR(const char *fileName) { if (!_mdyPlayer) _mdyPlayer = new MDYPlayer(*_vm->_mixer); + if (!_vm->_dataIO->existData(fileName)) { + warning("Can't open TBR file \"%s\"", fileName); + return false; + } + debugC(1, kDebugSound, "Adlib: Loading MDY instruments (\"%s\")", fileName); - return _mdyPlayer->loadTBR(fileName); + DataStream *stream = _vm->_dataIO->getDataStream(fileName); + + bool loaded = _mdyPlayer->loadTBR(*stream); + + delete stream; + + return loaded; } void Sound::adlibPlayTrack(const char *trackname) { -- cgit v1.2.3