aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dists/msvc9/scumm.vcproj8
-rw-r--r--engines/scumm/module.mk1
-rw-r--r--engines/scumm/player_v4a.cpp149
-rw-r--r--engines/scumm/player_v4a.h77
-rw-r--r--engines/scumm/scumm.cpp3
-rw-r--r--engines/scumm/sound.cpp3
-rw-r--r--sound/mods/tfmx.cpp26
-rw-r--r--tfmx/tfmxplayer.cpp2
8 files changed, 252 insertions, 17 deletions
diff --git a/dists/msvc9/scumm.vcproj b/dists/msvc9/scumm.vcproj
index 56f9ad2dae..9b07375cc6 100644
--- a/dists/msvc9/scumm.vcproj
+++ b/dists/msvc9/scumm.vcproj
@@ -687,6 +687,14 @@
>
</File>
<File
+ RelativePath="..\..\engines\scumm\player_v4a.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\engines\scumm\player_v4a.h"
+ >
+ </File>
+ <File
RelativePath="..\..\engines\scumm\resource.cpp"
>
</File>
diff --git a/engines/scumm/module.mk b/engines/scumm/module.mk
index 58d8db91fc..51fbecdb0d 100644
--- a/engines/scumm/module.mk
+++ b/engines/scumm/module.mk
@@ -40,6 +40,7 @@ MODULE_OBJS := \
player_v2a.o \
player_v2cms.o \
player_v3a.o \
+ player_v4a.o \
resource_v2.o \
resource_v3.o \
resource_v4.o \
diff --git a/engines/scumm/player_v4a.cpp b/engines/scumm/player_v4a.cpp
new file mode 100644
index 0000000000..46a6388d98
--- /dev/null
+++ b/engines/scumm/player_v4a.cpp
@@ -0,0 +1,149 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+
+#include "engines/engine.h"
+#include "scumm/player_v4a.h"
+#include "scumm/scumm.h"
+
+#include "common/file.h"
+
+namespace Scumm {
+
+Player_V4A::Player_V4A(ScummEngine *scumm, Audio::Mixer *mixer)
+ : _vm(scumm), _mixer(mixer), _slots(), _musicId(), _tfmxPlay(0) {
+ init();
+}
+
+bool Player_V4A::init() {
+ if (_vm->_game.id != GID_MONKEY_VGA)
+ error("player_v4a - unknown game");
+
+ Common::File fileMdat;
+ Common::File fileSample;
+ bool mdatExists = fileMdat.open("music.dat");
+ bool sampleExists = fileSample.open("sample.dat");
+
+ if (mdatExists && sampleExists) {
+ Audio::Tfmx *play = new Audio::Tfmx(_mixer->getOutputRate(), true);
+ if (play->load(fileMdat, fileSample))
+ _tfmxPlay = play;
+ else
+ delete play;
+ }
+}
+
+Player_V4A::~Player_V4A() {
+ delete _tfmxPlay;
+}
+
+void Player_V4A::setMusicVolume (int vol) {
+}
+
+int Player_V4A::getSlot (int id) const {
+ for (int i = 0; i < ARRAYSIZE(_slots); i++) {
+ if (_slots[i].id == id)
+ return i;
+ }
+
+ if (id == 0)
+ warning("player_v4a - out of music channels");
+ return -1;
+}
+
+
+void Player_V4A::stopAllSounds() {
+ if (_musicId)
+ stopSound(_musicId);
+}
+
+void Player_V4A::stopSound(int nr) {
+ if (nr == _musicId) {
+ _mixer->stopHandle(_musicHandle);
+ _musicId = 0;
+ }
+}
+
+void Player_V4A::startSound(int nr) {
+ assert(_vm);
+ byte *ptr = _vm->getResourceAddress(rtSound, nr);
+ assert(ptr);
+
+ char buf[22];
+ sprintf(buf,"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", ptr[0], ptr[1], ptr[2], ptr[3],
+ ptr[4], ptr[5], ptr[6], ptr[7], ptr[8], ptr[9] );
+ debug("%s", buf);
+
+
+ static const uint8 monkeyCommands[52] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 18, 17,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 16, 34, 0, 1, 2, 3, 7, 8, 10, 11, 4, 5, 14, 15, 12,
+ 6, 13, 9, 19 };
+
+ static const uint8 monkeyTypes[52] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0 };
+
+ int val = ptr[9];
+ if (val < 0 || val >= ARRAYSIZE(monkeyTypes))
+ debug("Tfmx: illegal Songnumber %i", val);
+ bool soundFX = monkeyTypes[val] == 1;
+ int index = monkeyCommands[val];
+ if (soundFX) {
+ // SoundFX
+ debug("Tfmx: Soundpattern %i", index);
+
+ } else {
+ // Song
+ debug("Tfmx: Song %i", index);
+ assert(_tfmxPlay);
+ _mixer->stopHandle(_musicHandle);
+
+ _tfmxPlay->doSong(index);
+ _musicId = nr;
+
+ _mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_musicHandle, _tfmxPlay, -1, Audio::Mixer::kMaxChannelVolume, 0, false, false);
+ }
+}
+
+
+int Player_V4A::getMusicTimer() const {
+ static int t = 0;
+ t += 300;
+ return t;
+}
+
+int Player_V4A::getSoundStatus(int nr) const {
+ if (nr == _musicId)
+ return _mixer->isSoundHandleActive(_musicHandle);
+ /*if (getSfxChan(nr) != -1)
+ return 1;*/
+ return 0;
+}
+
+} // End of namespace Scumm
diff --git a/engines/scumm/player_v4a.h b/engines/scumm/player_v4a.h
new file mode 100644
index 0000000000..ed9bc50120
--- /dev/null
+++ b/engines/scumm/player_v4a.h
@@ -0,0 +1,77 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef SCUMM_PLAYER_V4A_H
+#define SCUMM_PLAYER_V4A_H
+
+#include "common/scummsys.h"
+#include "scumm/music.h"
+#include "sound/mixer.h"
+#include "sound/mods/tfmx.h"
+
+class Mixer;
+
+namespace Scumm {
+
+class ScummEngine;
+
+/**
+ * Scumm V4 Amiga sound/music driver.
+ */
+class Player_V4A : public MusicEngine {
+public:
+ Player_V4A(ScummEngine *scumm, Audio::Mixer *mixer);
+ virtual ~Player_V4A();
+
+ virtual void setMusicVolume(int vol);
+ virtual void startSound(int sound);
+ virtual void stopSound(int sound);
+ virtual void stopAllSounds();
+ virtual int getMusicTimer() const;
+ virtual int getSoundStatus(int sound) const;
+
+private:
+ ScummEngine *_vm;
+ Audio::Tfmx *_tfmxPlay;
+ Audio::Mixer *_mixer;
+ Audio::SoundHandle _musicHandle;
+
+ enum {V4A_MAXSFX = 8};
+
+ struct SoundSlot {
+ int id;
+ byte patternNum;
+ byte channel;
+ } _slots[V4A_MAXSFX];
+
+ int _musicId;
+
+ int getSlot (int id) const;
+ bool init();
+};
+
+} // End of namespace Scumm
+
+#endif
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index dcbf95ef4b..5fcde33346 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -55,6 +55,7 @@
#include "scumm/player_v2.h"
#include "scumm/player_v2a.h"
#include "scumm/player_v3a.h"
+#include "scumm/player_v4a.h"
#include "scumm/he/resource_he.h"
#include "scumm/scumm_v0.h"
#include "scumm/scumm_v8.h"
@@ -1669,7 +1670,7 @@ void ScummEngine::setupMusic(int midi) {
} else if (_game.platform == Common::kPlatformPCEngine && _game.version == 3) {
// TODO: Add support for music format
} else if (_game.platform == Common::kPlatformAmiga && _game.version <= 4) {
- // TODO: Add support for music format
+ _musicEngine = new Player_V4A(this, _mixer);
} else if (_game.id == GID_MANIAC && _game.version == 1) {
_musicEngine = new Player_V1(this, _mixer, midiDriver != MD_PCSPK);
} else if (_game.version <= 2) {
diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp
index bc3ca00571..0932882591 100644
--- a/engines/scumm/sound.cpp
+++ b/engines/scumm/sound.cpp
@@ -441,7 +441,8 @@ void Sound::playSound(int soundID) {
if (_vm->_game.id == GID_MONKEY_VGA || _vm->_game.id == GID_MONKEY_EGA
|| (_vm->_game.id == GID_MONKEY && _vm->_game.platform == Common::kPlatformMacintosh)) {
// Sound is currently not supported at all in the amiga versions of these games
- if (_vm->_game.platform == Common::kPlatformAmiga) {
+ if (_vm->_game.platform == Common::kPlatformAmiga && false) {
+
int track = -1;
if (soundID == 50)
track = 17;
diff --git a/sound/mods/tfmx.cpp b/sound/mods/tfmx.cpp
index 16f7f19b91..5f4598b518 100644
--- a/sound/mods/tfmx.cpp
+++ b/sound/mods/tfmx.cpp
@@ -31,8 +31,6 @@
#include "sound/mods/tfmx.h"
-#include "tfmx/tfmxdebug.h"
-
namespace Audio {
const uint16 Tfmx::noteIntervalls[64] = {
@@ -58,7 +56,7 @@ Tfmx::~Tfmx() {
}
void Tfmx::interrupt() {
- assert(!_end);
+ //assert(!_end);
for (int i = 0; i < kNumVoices; ++i) {
ChannelContext &channel = _channelCtx[i];
@@ -66,7 +64,6 @@ void Tfmx::interrupt() {
// wait for DMA Interupts to happen
int doneDma = getChannelDmaCount(channel.paulaChannel);
if (doneDma >= channel.dmaIntCount) {
- debug("channel %d, DMA done", i);
channel.dmaIntCount = 0;
channel.macroRun = true;
}
@@ -190,7 +187,7 @@ static void warnMacroUnimplemented(const byte *macroPtr, int level) {
else
debug("Warning - Macro not completely supported:");
- displayMacroStep(macroPtr);
+// displayMacroStep(macroPtr);
}
FORCEINLINE bool Tfmx::macroStep(ChannelContext &channel) {
@@ -229,7 +226,6 @@ FORCEINLINE bool Tfmx::macroStep(ChannelContext &channel) {
channel.volume = macroPtr[3];
else if (macroPtr[3])
channel.volume = channel.relVol * 3 + macroPtr[3];
- debug("DMA Off: %02X %02X%02X%02X", macroPtr[0], macroPtr[1], macroPtr[2], macroPtr[3]);
return true;
case 0x01: // DMA On
@@ -263,7 +259,6 @@ FORCEINLINE bool Tfmx::macroStep(ChannelContext &channel) {
return true;
// FT
case 0x05: // Loop. Parameters: Loopcount, MacroStep(W)
- // debug("Step %d, Loopcount: %02X", channel.macroStep, channel.macroLoopCount);
if (channel.macroLoopCount != 0) {
if (channel.macroLoopCount == 0xFF)
channel.macroLoopCount = macroPtr[1];
@@ -337,7 +332,6 @@ FORCEINLINE bool Tfmx::macroStep(ChannelContext &channel) {
case 0x11: // AddBegin. Parameters: times, Offset(W)
// TODO: implement Parameter
macroPtr[1];
-// debug("prev: %06X, after: %06X", channel.sampleStart, channel.sampleStart + (int16)READ_BE_UINT16(&macroPtr[2]));
channel.sampleStart += (int16)READ_BE_UINT16(&macroPtr[2]);
Paula::setChannelSampleStart(channel.paulaChannel, _resource.getSamplePtr(channel.sampleStart));
warnMacroUnimplemented(macroPtr, 1);
@@ -465,15 +459,15 @@ doTrackstep:
;
_playerCtx.pendingTrackstep = false;
}
+ int runningPatterns = 0;
for (int i = 0; i < kNumChannels; ++i) {
- assert(!_playerCtx.pendingTrackstep);
-
const uint8 pattCmd = _patternCtx[i].command;
if (pattCmd < 0x90) { // execute Patternstep
// FIXME: 0x90 is very likely a bug, 0x80 would make more sense
assert(pattCmd < 0x80);
+ ++runningPatterns;
if (_patternCtx[i].wait == 0) {
// issue all Steps for this tick
while (patternStep(_patternCtx[i]))
@@ -496,14 +490,18 @@ doTrackstep:
goto doTrackstep;
}
}
+ if (!runningPatterns) {
+ _playerCtx.enabled = 0;
+ stopPaula();
+ }
}
FORCEINLINE bool Tfmx::patternStep(PatternContext &pattern) {
const byte *const patternPtr = (byte *)(_resource.getPatternPtr(pattern.offset) + pattern.step);
++pattern.step;
- debug("Pattern %04X +%d", pattern.offset, pattern.step-1);
- displayPatternstep(patternPtr);
+ /*debug("Pattern %04X +%d", pattern.offset, pattern.step-1);
+ displayPatternstep(patternPtr);*/
const byte pattCmd = patternPtr[0];
@@ -603,8 +601,8 @@ FORCEINLINE bool Tfmx::patternStep(PatternContext &pattern) {
bool Tfmx::trackStep() {
const uint16 *const trackData = _resource.getTrackPtr(_trackCtx.posInd);
- debug( "TStep %04X", _trackCtx.posInd);
- displayTrackstep(trackData);
+// debug( "TStep %04X", _trackCtx.posInd);
+// displayTrackstep(trackData);
if (trackData[0] != FROM_BE_16(0xEFFE)) {
// 8 commands for Patterns
diff --git a/tfmx/tfmxplayer.cpp b/tfmx/tfmxplayer.cpp
index e6895f7efa..b286d6d43d 100644
--- a/tfmx/tfmxplayer.cpp
+++ b/tfmx/tfmxplayer.cpp
@@ -141,7 +141,7 @@ void tfmxmain(const int argc, const char *const argv[]) {
while( true)
player->readBuffer(buf, ARRAYSIZE(buf));
#endif
- int maxsecs = 2 * 60;
+ int maxsecs = 10 * 60;
if (playflag == 1) {
// get Mixer, assume this never fails
Audio::Mixer *mixer = g_system->getMixer();