[Scummvm-cvs-logs] SF.net SVN: scummvm: [26619] scummvm/trunk/engines/parallaction
peres001 at users.sourceforge.net
peres001 at users.sourceforge.net
Fri Apr 27 22:06:43 CEST 2007
Revision: 26619
http://scummvm.svn.sourceforge.net/scummvm/?rev=26619&view=rev
Author: peres001
Date: 2007-04-27 13:06:42 -0700 (Fri, 27 Apr 2007)
Log Message:
-----------
Refactored music code for dos version and added music to Amiga versions.
Modified Paths:
--------------
scummvm/trunk/engines/parallaction/callables.cpp
scummvm/trunk/engines/parallaction/defs.h
scummvm/trunk/engines/parallaction/disk.cpp
scummvm/trunk/engines/parallaction/disk.h
scummvm/trunk/engines/parallaction/intro.cpp
scummvm/trunk/engines/parallaction/location.cpp
scummvm/trunk/engines/parallaction/menu.cpp
scummvm/trunk/engines/parallaction/music.cpp
scummvm/trunk/engines/parallaction/music.h
scummvm/trunk/engines/parallaction/parallaction.cpp
scummvm/trunk/engines/parallaction/parallaction.h
Modified: scummvm/trunk/engines/parallaction/callables.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/callables.cpp 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/callables.cpp 2007-04-27 20:06:42 UTC (rev 26619)
@@ -55,7 +55,8 @@
return;
flag = 0;
- _vm->_midiPlayer->play("boogie2");
+ _vm->_soundMan->setMusicFile("boogie2");
+ _vm->_soundMan->playMusic();
return;
}
@@ -452,11 +453,11 @@
}
void _c_startMusic(void*) {
- // TODO: to be implemented
+ _vm->_soundMan->playMusic();
}
void _c_closeMusic(void*) {
- // TODO: to be implemented
+ _vm->_soundMan->stopMusic();
}
} // namespace Parallaction
Modified: scummvm/trunk/engines/parallaction/defs.h
===================================================================
--- scummvm/trunk/engines/parallaction/defs.h 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/defs.h 2007-04-27 20:06:42 UTC (rev 26619)
@@ -28,6 +28,8 @@
namespace Parallaction {
+#define PATH_LEN 200
+
template <class T>
class ManagedList : public Common::List<T> {
Modified: scummvm/trunk/engines/parallaction/disk.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/disk.cpp 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/disk.cpp 2007-04-27 20:06:42 UTC (rev 26619)
@@ -569,7 +569,17 @@
return t;
}
+Common::ReadStream* DosDisk::loadMusic(const char* name) {
+ char path[PATH_LEN];
+ sprintf(path, "%s.mid", name);
+ Common::File *stream = new Common::File;
+ if (!stream->open(path))
+ errorFileNotFound(path);
+
+ return stream;
+}
+
#pragma mark -
@@ -1157,5 +1167,9 @@
return t;
}
+Common::ReadStream* AmigaDisk::loadMusic(const char* name) {
+ return openArchivedFile(name);
+}
+
} // namespace Parallaction
Modified: scummvm/trunk/engines/parallaction/disk.h
===================================================================
--- scummvm/trunk/engines/parallaction/disk.h 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/disk.h 2007-04-27 20:06:42 UTC (rev 26619)
@@ -111,7 +111,7 @@
virtual void loadSlide(const char *filename) = 0;
virtual void loadScenery(const char* background, const char* mask) = 0;
virtual Table* loadTable(const char* name) = 0;
-
+ virtual Common::ReadStream* loadMusic(const char* name) = 0;
};
class DosDisk : public Disk {
@@ -146,6 +146,7 @@
void loadSlide(const char *filename);
void loadScenery(const char* background, const char* mask);
Table* loadTable(const char* name);
+ Common::ReadStream* loadMusic(const char* name);
};
class AmigaDisk : public Disk {
@@ -176,6 +177,7 @@
void loadSlide(const char *filename);
void loadScenery(const char* background, const char* mask);
Table* loadTable(const char* name);
+ Common::ReadStream* loadMusic(const char* name);
};
} // namespace Parallaction
Modified: scummvm/trunk/engines/parallaction/intro.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/intro.cpp 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/intro.cpp 2007-04-27 20:06:42 UTC (rev 26619)
@@ -126,7 +126,12 @@
void _c_startIntro(void *parm) {
_rightHandAnim = _vm->findAnimation("righthand");
- _vm->_midiPlayer->play("intro");
+
+ if (_vm->getPlatform() == Common::kPlatformPC) {
+ _vm->_soundMan->setMusicFile("intro");
+ _vm->_soundMan->playMusic();
+ }
+
_engineFlags |= kEngineMouse;
return;
@@ -144,6 +149,8 @@
_di = _vm->_gfx->getStringWidth(_credits[_si]._name);
_vm->_gfx->displayString((SCREEN_WIDTH - _di)/2, 100, _credits[_si]._name);
+ _vm->_gfx->updateScreen();
+
for (uint16 v2 = 0; v2 < 100; v2++) {
_vm->updateInput();
if (_mouseButtons != kMouseLeftUp)
@@ -155,8 +162,12 @@
waitUntilLeftClick();
- _engineFlags &= ~kEngineMouse;
- _vm->_menu->selectCharacter();
+ if (_vm->getFeatures() & GF_DEMO) {
+ _engineFlags |= kEngineQuit;
+ } else {
+ _engineFlags &= ~kEngineMouse;
+ _vm->_menu->selectCharacter();
+ }
return;
}
Modified: scummvm/trunk/engines/parallaction/location.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/location.cpp 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/location.cpp 2007-04-27 20:06:42 UTC (rev 26619)
@@ -150,6 +150,10 @@
if (!scumm_stricmp(_tokens[0], "SOUND")) {
strcpy(_soundFile, _tokens[1]);
}
+ if (!scumm_stricmp(_tokens[0], "MUSIC")) {
+ if (getPlatform() == Common::kPlatformAmiga)
+ _soundMan->setMusicFile(_tokens[1]);
+ }
fillBuffers(*_locationScript, true);
}
@@ -307,7 +311,7 @@
void Parallaction::changeLocation(char *location) {
debugC(1, kDebugLocation, "changeLocation to '%s'", location);
- pickMusic(location);
+ _soundMan->playLocationMusic(location);
// WORKAROUND: this if-statement has been added to avoid crashes caused by
// execution of label jobs after a location switch. The other workaround in
Modified: scummvm/trunk/engines/parallaction/menu.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/menu.cpp 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/menu.cpp 2007-04-27 20:06:42 UTC (rev 26619)
@@ -289,7 +289,7 @@
v14._height = BLOCK_HEIGHT;
_vm->changeCursor(kCursorArrow);
- _vm->_midiPlayer->stop();
+ _vm->_soundMan->stopMusic();
_vm->_gfx->setFont(kFontMenu);
Modified: scummvm/trunk/engines/parallaction/music.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/music.cpp 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/music.cpp 2007-04-27 20:06:42 UTC (rev 26619)
@@ -22,17 +22,62 @@
#include "common/stdafx.h"
#include "common/file.h"
-#include "parallaction/parallaction.h"
#include "common/stream.h"
+#include "sound/mixer.h"
#include "sound/midiparser.h"
+#include "sound/mods/protracker.h"
#include "parallaction/music.h"
+#include "parallaction/parallaction.h"
namespace Parallaction {
+class MidiPlayer : public MidiDriver {
+public:
+
+ enum {
+ NUM_CHANNELS = 16
+ };
+
+ MidiPlayer(MidiDriver *driver);
+ ~MidiPlayer();
+
+ void play(const char *filename);
+ void stop();
+ void updateTimer();
+ void adjustVolume(int diff);
+ void setVolume(int volume);
+ int getVolume() const { return _masterVolume; }
+ void setLooping(bool loop) { _isLooping = loop; }
+
+ // MidiDriver interface
+ int open();
+ void close();
+ void send(uint32 b);
+ void metaEvent(byte type, byte *data, uint16 length);
+ void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
+ uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
+ MidiChannel *allocateChannel() { return 0; }
+ MidiChannel *getPercussionChannel() { return 0; }
+
+private:
+
+ static void timerCallback(void *p);
+
+ MidiDriver *_driver;
+ MidiParser *_parser;
+ uint8 *_midiData;
+ bool _isLooping;
+ bool _isPlaying;
+ int _masterVolume;
+ MidiChannel *_channelsTable[NUM_CHANNELS];
+ uint8 _channelsVolume[NUM_CHANNELS];
+ Common::Mutex _mutex;
+};
+
MidiPlayer::MidiPlayer(MidiDriver *driver)
: _driver(driver), _parser(0), _midiData(0), _isLooping(false), _isPlaying(false), _masterVolume(0) {
assert(_driver);
@@ -180,4 +225,121 @@
player->updateTimer();
}
+
+DosSoundMan::DosSoundMan(Parallaction *vm, MidiDriver *midiDriver) : SoundMan(vm), _musicData1(0) {
+ _midiPlayer = new MidiPlayer(midiDriver);
+}
+
+DosSoundMan::~DosSoundMan() {
+ delete _midiPlayer;
+}
+
+void DosSoundMan::playMusic() {
+ _midiPlayer->play(_musicFile);
+}
+
+void DosSoundMan::stopMusic() {
+ _midiPlayer->stop();
+}
+
+void DosSoundMan::playCharacterMusic(const char *character) {
+
+ if (!scumm_stricmp(_vm->_location._name, "night") ||
+ !scumm_stricmp(_vm->_location._name, "intsushi")) {
+ return;
+ }
+
+ char *name = const_cast<char*>(character);
+
+ if (IS_MINI_CHARACTER(name))
+ name+=4;
+
+ if (!scumm_stricmp(name, _dinoName)) {
+ setMusicFile("dino");
+ } else
+ if (!scumm_stricmp(name, _donnaName)) {
+ setMusicFile("dough");
+ } else
+ if (!scumm_stricmp(name, _doughName)) {
+ setMusicFile("nuts");
+ } else {
+ warning("unknown character '%s' in DosSoundMan::playCharacterMusic", character);
+ return;
+ }
+
+ playMusic();
+}
+
+void DosSoundMan::playLocationMusic(const char *location) {
+ if (_musicData1 != 0) {
+ playCharacterMusic(_vm->_characterName);
+ _musicData1 = 0;
+ debugC(2, kDebugLocation, "changeLocation: started character specific music");
+ }
+
+ if (!scumm_stricmp(location, "night") || !scumm_stricmp(location, "intsushi")) {
+ setMusicFile("nuts");
+ playMusic();
+
+ debugC(2, kDebugLocation, "changeLocation: started music 'soft'");
+ }
+
+ if (!scumm_stricmp(location, "museo") ||
+ !scumm_stricmp(location, "caveau") ||
+ !scumm_strnicmp(location, "plaza1", 6) ||
+ !scumm_stricmp(location, "estgrotta") ||
+ !scumm_stricmp(location, "intgrottadopo") ||
+ !scumm_stricmp(location, "endtgz") ||
+ !scumm_stricmp(location, "common")) {
+
+ stopMusic();
+ _musicData1 = 1;
+
+ debugC(2, kDebugLocation, "changeLocation: music stopped");
+ }
+}
+
+AmigaSoundMan::AmigaSoundMan(Parallaction *vm) : SoundMan(vm) {
+ _musicStream = 0;
+}
+
+AmigaSoundMan::~AmigaSoundMan() {
+ stopMusic();
+}
+
+void AmigaSoundMan::playMusic() {
+ stopMusic();
+
+ Common::ReadStream *stream = _vm->_disk->loadMusic(_musicFile);
+ _musicStream = Audio::makeProtrackerStream(stream);
+ delete stream;
+
+ _mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_musicHandle, _musicStream, -1, 255, 0, false, true);
+}
+
+void AmigaSoundMan::stopMusic() {
+ _mixer->stopHandle(_musicHandle);
+ delete _musicStream;
+}
+
+void AmigaSoundMan::playCharacterMusic(const char *character) {
+}
+
+void AmigaSoundMan::playLocationMusic(const char *location) {
+}
+
+
+SoundMan::SoundMan(Parallaction *vm) : _vm(vm) {
+ _mixer = _vm->_mixer;
+}
+
+void SoundMan::setMusicVolume(int value) {
+ _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, value);
+}
+
+void SoundMan::setMusicFile(const char *filename) {
+ strcpy(_musicFile, filename);
+}
+
+
} // namespace Parallaction
Modified: scummvm/trunk/engines/parallaction/music.h
===================================================================
--- scummvm/trunk/engines/parallaction/music.h 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/music.h 2007-04-27 20:06:42 UTC (rev 26619)
@@ -26,55 +26,71 @@
#include "common/util.h"
#include "common/mutex.h"
+#include "sound/audiostream.h"
+#include "sound/mixer.h"
#include "sound/mididrv.h"
+#include "parallaction/defs.h"
+
class MidiParser;
namespace Parallaction {
-class MidiPlayer : public MidiDriver {
+class Parallaction;
+class MidiPlayer;
+
+class SoundMan {
+
+protected:
+ Parallaction *_vm;
+ Audio::Mixer *_mixer;
+ char _musicFile[PATH_LEN];
+
public:
+ SoundMan(Parallaction *vm);
+ virtual ~SoundMan() {}
- enum {
- NUM_CHANNELS = 16
- };
+ void setMusicFile(const char *filename);
- MidiPlayer(MidiDriver *driver);
- ~MidiPlayer();
+ virtual void playMusic() = 0;
+ virtual void stopMusic() = 0;
- void play(const char *filename);
- void stop();
- void updateTimer();
- void adjustVolume(int diff);
- void setVolume(int volume);
- int getVolume() const { return _masterVolume; }
- void setLooping(bool loop) { _isLooping = loop; }
+ virtual void playCharacterMusic(const char *character) = 0;
+ virtual void playLocationMusic(const char *location) = 0;
- // MidiDriver interface
- int open();
- void close();
- void send(uint32 b);
- void metaEvent(byte type, byte *data, uint16 length);
- void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
- uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
- MidiChannel *allocateChannel() { return 0; }
- MidiChannel *getPercussionChannel() { return 0; }
+ void setMusicVolume(int value);
+};
-private:
+class DosSoundMan : public SoundMan {
- static void timerCallback(void *p);
+ MidiPlayer *_midiPlayer;
+ int _musicData1;
- MidiDriver *_driver;
- MidiParser *_parser;
- uint8 *_midiData;
- bool _isLooping;
- bool _isPlaying;
- int _masterVolume;
- MidiChannel *_channelsTable[NUM_CHANNELS];
- uint8 _channelsVolume[NUM_CHANNELS];
- Common::Mutex _mutex;
+public:
+ DosSoundMan(Parallaction *vm, MidiDriver *midiDriver);
+ ~DosSoundMan();
+ void playMusic();
+ void stopMusic();
+
+ void playCharacterMusic(const char *character);
+ void playLocationMusic(const char *location);
};
+class AmigaSoundMan : public SoundMan {
+
+ Audio::AudioStream *_musicStream;
+ Audio::SoundHandle _musicHandle;
+
+public:
+ AmigaSoundMan(Parallaction *vm);
+ AmigaSoundMan::~AmigaSoundMan();
+ void playMusic();
+ void stopMusic();
+
+ void playCharacterMusic(const char *character);
+ void playLocationMusic(const char *location);
+};
+
} // namespace Parallaction
#endif
Modified: scummvm/trunk/engines/parallaction/parallaction.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction.cpp 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/parallaction.cpp 2007-04-27 20:06:42 UTC (rev 26619)
@@ -124,7 +124,7 @@
Parallaction::~Parallaction() {
- delete _midiPlayer;
+ delete _soundMan;
delete _disk;
delete _globalTable;
@@ -165,10 +165,10 @@
_activeItem._id = 0;
_procCurrentHoverItem = -1;
- _musicData1 = 0;
+// _musicData1 = 0;
strcpy(_characterName1, "null");
- _midiPlayer = 0;
+ _soundMan = 0;
_baseTime = 0;
@@ -205,12 +205,15 @@
_animations.push_front(&_vm->_char._ani);
_gfx = new Gfx(this);
- int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI);
- MidiDriver *driver = MidiDriver::createMidi(midiDriver);
- _midiPlayer = new MidiPlayer(driver);
+ if (getPlatform() == Common::kPlatformPC) {
+ int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI);
+ MidiDriver *driver = MidiDriver::createMidi(midiDriver);
+ _soundMan = new DosSoundMan(this, driver);
+ _soundMan->setMusicVolume(ConfMan.getInt("music_volume"));
+ } else {
+ _soundMan = new AmigaSoundMan(this);
+ }
- _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
-
return 0;
}
@@ -721,50 +724,6 @@
return;
}
-void Parallaction::selectCharacterMusic(const char *name) {
- if (IS_MINI_CHARACTER(name))
- name+=4;
-
- if (!scumm_stricmp(name, _dinoName)) {
- _midiPlayer->play("dino");
- } else if (!scumm_stricmp(name, _donnaName)) {
- _midiPlayer->play("donna");
- } else {
- _midiPlayer->play("nuts");
- }
-
- return;
-}
-
-void Parallaction::pickMusic(const char *location) {
- if (_musicData1 != 0) {
- selectCharacterMusic(_vm->_characterName);
- _musicData1 = 0;
- debugC(2, kDebugLocation, "changeLocation: started character specific music");
- }
-
- if (!scumm_stricmp(location, "night") || !scumm_stricmp(location, "intsushi")) {
- _vm->_midiPlayer->play("soft");
-
- debugC(2, kDebugLocation, "changeLocation: started music 'soft'");
- }
-
- if (!scumm_stricmp(location, "museo") ||
- !scumm_stricmp(location, "caveau") ||
- !scumm_strnicmp(location, "plaza1", 6) ||
- !scumm_stricmp(location, "estgrotta") ||
- !scumm_stricmp(location, "intgrottadopo") ||
- !scumm_stricmp(location, "endtgz") ||
- !scumm_stricmp(location, "common")) {
-
- _vm->_midiPlayer->stop();
- _musicData1 = 1;
-
- debugC(2, kDebugLocation, "changeLocation: music stopped");
- }
-}
-
-
void Parallaction::changeCharacter(const char *name) {
char baseName[20];
@@ -796,8 +755,7 @@
_vm->_char._ani._cnv = _disk->loadFrames(fullName);
- if (scumm_stricmp(name, "night") && scumm_stricmp(name, "intsushi"))
- selectCharacterMusic(name);
+ _soundMan->playCharacterMusic(name);
}
}
Modified: scummvm/trunk/engines/parallaction/parallaction.h
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction.h 2007-04-27 19:59:40 UTC (rev 26618)
+++ scummvm/trunk/engines/parallaction/parallaction.h 2007-04-27 20:06:42 UTC (rev 26619)
@@ -196,8 +196,6 @@
#define IS_MINI_CHARACTER(s) (((s)[0] == 'm'))
#define IS_DUMMY_CHARACTER(s) (((s)[0] == 'D'))
-#define PATH_LEN 200
-
void waitUntilLeftClick();
@@ -218,7 +216,7 @@
class Gfx;
class Menu;
-class MidiPlayer;
+class SoundMan;
@@ -347,9 +345,8 @@
const PARALLACTIONGameDescription *_gameDescription;
public:
+ SoundMan *_soundMan;
- MidiPlayer *_midiPlayer;
-
Gfx* _gfx;
Menu* _menu;
Disk* _disk;
@@ -391,8 +388,6 @@
int16 _transCurrentHoverItem;
uint32 _baseTime;
-
- uint16 _musicData1; // only used in changeLocation
char _characterName1[50]; // only used in changeCharacter
int16 _keyDown;
@@ -441,9 +436,6 @@
void parseCommands(Script &script, CommandList&);
- void pickMusic(const char *location);
- void selectCharacterMusic(const char *name);
-
void freeCharacter();
void initResources();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list