aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2009-04-01 10:43:24 +0000
committerPaul Gilbert2009-04-01 10:43:24 +0000
commitd42d6122d963237ea35afc8e7015a2ae5b087523 (patch)
tree1c0ba80a2e44f7cf6a5b3747ba30390a3238f6b3
parentd093adbb55e054e22d9ef976bf83dc2d5e04c9ce (diff)
downloadscummvm-rg350-d42d6122d963237ea35afc8e7015a2ae5b087523.tar.gz
scummvm-rg350-d42d6122d963237ea35afc8e7015a2ae5b087523.tar.bz2
scummvm-rg350-d42d6122d963237ea35afc8e7015a2ae5b087523.zip
Laid the basics for music handling
svn-id: r39786
-rw-r--r--engines/cruise/cruise.cpp17
-rw-r--r--engines/cruise/cruise.h8
-rw-r--r--engines/cruise/cruise_main.cpp7
-rw-r--r--engines/cruise/cruise_main.h2
-rw-r--r--engines/cruise/function.cpp59
-rw-r--r--engines/cruise/menu.cpp4
-rw-r--r--engines/cruise/module.mk1
-rw-r--r--engines/cruise/overlay.cpp8
-rw-r--r--engines/cruise/saveload.cpp10
-rw-r--r--engines/cruise/vars.cpp3
-rw-r--r--engines/cruise/vars.h3
-rw-r--r--engines/cruise/volume.cpp20
-rw-r--r--engines/cruise/volume.h6
13 files changed, 77 insertions, 71 deletions
diff --git a/engines/cruise/cruise.cpp b/engines/cruise/cruise.cpp
index 1f5f7d912e..ddedf742fb 100644
--- a/engines/cruise/cruise.cpp
+++ b/engines/cruise/cruise.cpp
@@ -68,6 +68,8 @@ CruiseEngine::CruiseEngine(OSystem * syst, const CRUISEGameDescription *gameDesc
CruiseEngine::~CruiseEngine() {
delete _debugger;
+ delete _music;
+
freeSystem();
}
@@ -108,6 +110,21 @@ void CruiseEngine::initialize() {
// another bit of video init
readVolCnf();
+
+ // Setup mixer
+ _musicVolume = ConfMan.getInt("music_volume");
+ _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
+ _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
+
+ int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI);
+ _mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32"));
+ _adlib = (midiDriver == MD_ADLIB);
+
+ _driver = MidiDriver::createMidi(midiDriver);
+ if (_mt32)
+ _driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
+
+ _music = new MusicPlayer();
}
bool CruiseEngine::loadLanguageStrings() {
diff --git a/engines/cruise/cruise.h b/engines/cruise/cruise.h
index a3fcd0216b..b07482aaac 100644
--- a/engines/cruise/cruise.h
+++ b/engines/cruise/cruise.h
@@ -33,6 +33,7 @@
#include "cruise/cruise_main.h"
#include "cruise/debugger.h"
+#include "cruise/sound.h"
namespace Cruise {
@@ -53,6 +54,10 @@ class CruiseEngine: public Engine {
private:
bool _preLoad;
Debugger *_debugger;
+ MidiDriver *_driver;
+ MusicPlayer *_music;
+ bool _mt32, _adlib;
+ int _musicVolume;
Common::StringList _langStrings;
CursorType _savedCursor;
uint32 lastTick, lastTickDebug;
@@ -78,6 +83,9 @@ public:
uint32 getFeatures() const;
Common::Language getLanguage() const;
Common::Platform getPlatform() const;
+ MusicPlayer &music() { return *_music; }
+ bool mt32() const { return _mt32; }
+ bool adlib() const { return _adlib; }
virtual GUI::Debugger *getDebugger() { return _debugger; }
virtual void pauseEngineIntern(bool pause);
const char *langString(LangStringId langId) { return _langStrings[(int)langId].c_str(); }
diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp
index 7ca5750206..79c62225d4 100644
--- a/engines/cruise/cruise_main.cpp
+++ b/engines/cruise/cruise_main.cpp
@@ -43,7 +43,7 @@ void drawBlackSolidBoxSmall() {
drawSolidBox(64, 100, 256, 117, 0);
}
-void loadPakedFileToMem(int fileIdx, uint8 *buffer) {
+void loadPackedFileToMem(int fileIdx, uint8 *buffer) {
changeCursor(CURSOR_DISK);
currentVolumeFile.seek(volumePtrToFileDescriptor[fileIdx].offset, SEEK_SET);
@@ -343,7 +343,7 @@ int loadFileSub1(uint8 **ptr, const char *name, uint8 *ptr2) {
if (volumePtrToFileDescriptor[fileIdx].size + 2 != unpackedSize) {
uint8 *pakedBuffer = (uint8 *) mallocAndZero(volumePtrToFileDescriptor[fileIdx].size + 2);
- loadPakedFileToMem(fileIdx, pakedBuffer);
+ loadPackedFileToMem(fileIdx, pakedBuffer);
uint32 realUnpackedSize = READ_BE_UINT32(pakedBuffer + volumePtrToFileDescriptor[fileIdx].size - 4);
@@ -353,7 +353,7 @@ int loadFileSub1(uint8 **ptr, const char *name, uint8 *ptr2) {
free(pakedBuffer);
} else {
- loadPakedFileToMem(fileIdx, unpackedBuffer);
+ loadPackedFileToMem(fileIdx, unpackedBuffer);
}
*ptr = unpackedBuffer;
@@ -1901,6 +1901,7 @@ void *mallocAndZero(int32 size) {
void *ptr;
ptr = malloc(size);
+ assert(ptr);
memset(ptr, 0, size);
return ptr;
}
diff --git a/engines/cruise/cruise_main.h b/engines/cruise/cruise_main.h
index b5328cb3d0..649e8e7ef9 100644
--- a/engines/cruise/cruise_main.h
+++ b/engines/cruise/cruise_main.h
@@ -104,7 +104,7 @@ uint8 *mainProc14(uint16 overlay, uint16 idx);
void printInfoBlackBox(const char *string);
void waitForPlayerInput(void);
int initCt(const char * ctpName);
-void loadPakedFileToMem(int fileIdx, uint8 * buffer);
+void loadPackedFileToMem(int fileIdx, uint8 * buffer);
int getNumObjectsByClass(int scriptIdx, int param);
void resetFileEntryRange(int param1, int param2);
int getProcParam(int overlayIdx, int param2, const char * name);
diff --git a/engines/cruise/function.cpp b/engines/cruise/function.cpp
index 55e08c99e1..148f8df111 100644
--- a/engines/cruise/function.cpp
+++ b/engines/cruise/function.cpp
@@ -26,6 +26,7 @@
#include "cruise/cruise.h"
#include "cruise/cruise_main.h"
#include "cruise/cell.h"
+#include "cruise/sound.h"
#include "cruise/staticres.h"
#include "common/util.h"
@@ -732,11 +733,6 @@ int16 Op_LoadCt(void) {
return initCt((char*)popPtr());
}
-int16 Op_LoadSong(void) {
- popPtr();
- return 0;
-}
-
int16 Op_EndAnim(void) {
int param1 = popVar();
int param2 = popVar();
@@ -1207,12 +1203,6 @@ int16 Op_TrackAnim(void) { // setup actor position
return 0;
}
-int16 Op_StopSong(void) {
- printf("Partial op 45 stop sound\n");
-
- return 0;
-}
-
int16 Op_BgName(void) {
char* bgName = (char*)popPtr();
int bgIdx = popVar();
@@ -1237,38 +1227,55 @@ int16 Op_StopFX(void) {
return 0;
}
-int16 Op_PlaySong(void) {
- printf("PlaySong()\n");
+int16 Op_LoadSong(void) {
+ const char *ptr = (const char *)popPtr();
+ char buffer[33];
+
+ strcpy(buffer, ptr);
+ strupr(buffer);
+ _vm->music().loadSong(buffer);
+ changeCursor(CURSOR_NORMAL);
return 0;
}
-void setVar49Value(int value) {
- flagCt = value;
-}
+int16 Op_PlaySong(void) {
+ if (_vm->music().songLoaded() && !_vm->music().songPlayed())
+ _vm->music().startSong();
-int16 Op_CTOn(void) {
- setVar49Value(1);
return 0;
}
-int16 Op_CTOff(void) {
- setVar49Value(0);
+int16 Op_StopSong(void) {
+ if (_vm->music().isPlaying())
+ _vm->music().stop();
+
return 0;
}
int16 Op_FadeSong(void) {
- printf("FadeSong()\n");
+ _vm->music().fadeSong();
+
return 0;
}
int16 Op_FreeSong(void) {
- printf("FreeSong()\n");
- //freeStuff1();
- freeStuff2();
+ _vm->music().stop();
+ _vm->music().removeSong();
+ return 0;
+}
+
+void setVar49Value(int value) {
+ flagCt = value;
+}
- playMusic2 = 0;
- playMusic = 0;
+int16 Op_CTOn(void) {
+ setVar49Value(1);
+ return 0;
+}
+
+int16 Op_CTOff(void) {
+ setVar49Value(0);
return 0;
}
diff --git a/engines/cruise/menu.cpp b/engines/cruise/menu.cpp
index f5d61a4843..04cc3d3751 100644
--- a/engines/cruise/menu.cpp
+++ b/engines/cruise/menu.cpp
@@ -207,9 +207,7 @@ int playerMenu(int menuX, int menuY) {
if (entrerMenuJoueur && displayOn) {
if (remdo) {
- musicName[0] = 0;
- playMusic2 = 0;
- playMusic = 0;
+ _vm->music().removeSong();
freeStuff2();
}
/*
diff --git a/engines/cruise/module.mk b/engines/cruise/module.mk
index 1622062159..5c36b2a7c1 100644
--- a/engines/cruise/module.mk
+++ b/engines/cruise/module.mk
@@ -26,6 +26,7 @@ MODULE_OBJS := \
polys.o \
saveload.o \
script.o \
+ sound.o \
stack.o \
staticres.o \
various.o \
diff --git a/engines/cruise/overlay.cpp b/engines/cruise/overlay.cpp
index 1c7c65b000..03b64b0382 100644
--- a/engines/cruise/overlay.cpp
+++ b/engines/cruise/overlay.cpp
@@ -117,13 +117,13 @@ int loadOverlay(const char *scriptName) {
(char *)mallocAndZero(volumePtrToFileDescriptor[fileIdx].
size + 2);
- loadPakedFileToMem(fileIdx, (uint8 *) pakedBuffer);
+ loadPackedFileToMem(fileIdx, (uint8 *) pakedBuffer);
delphineUnpack((uint8 *)unpackedBuffer, (const uint8 *)pakedBuffer, volumePtrToFileDescriptor[fileIdx].size);
free(pakedBuffer);
} else {
- loadPakedFileToMem(fileIdx, (uint8 *) unpackedBuffer);
+ loadPackedFileToMem(fileIdx, (uint8 *) unpackedBuffer);
}
printf("OVL loading done...\n");
@@ -498,13 +498,13 @@ int loadOverlay(const char *scriptName) {
mallocAndZero(volumePtrToFileDescriptor[fileIdx].
size + 2);
- loadPakedFileToMem(fileIdx, (uint8 *) pakedBuffer);
+ loadPackedFileToMem(fileIdx, (uint8 *) pakedBuffer);
delphineUnpack((uint8 *) unpackedBuffer, (const uint8 *)pakedBuffer, volumePtrToFileDescriptor[fileIdx].size);
free(pakedBuffer);
} else {
- loadPakedFileToMem(fileIdx, (uint8 *) unpackedBuffer);
+ loadPackedFileToMem(fileIdx, (uint8 *) unpackedBuffer);
}
Common::MemoryReadStream s2(unpackedBuffer, unpackedSize);
diff --git a/engines/cruise/saveload.cpp b/engines/cruise/saveload.cpp
index 2cee1fc11d..37107be58e 100644
--- a/engines/cruise/saveload.cpp
+++ b/engines/cruise/saveload.cpp
@@ -24,6 +24,7 @@
*/
#include "cruise/cruise_main.h"
+#include "cruise/cruise.h"
#include "common/serializer.h"
#include "common/savefile.h"
@@ -46,9 +47,6 @@ static void syncPalette(Common::Serializer &s, uint8 *p) {
}
static void syncBasicInfo(Common::Serializer &s) {
- s.syncAsSint16LE(songLoaded);
- s.syncAsSint16LE(songPlayed);
- s.syncAsSint16LE(songLoop);
s.syncAsSint16LE(activeMouse);
s.syncAsSint16LE(userEnabled);
s.syncAsSint16LE(dialogueEnabled);
@@ -63,8 +61,6 @@ static void syncBasicInfo(Common::Serializer &s) {
s.syncAsSint16LE(displayOn);
s.syncAsSint16LE(isMessage);
s.syncAsSint16LE(fadeFlag);
- s.syncAsSint16LE(playMusic);
- s.syncAsSint16LE(playMusic2);
s.syncAsSint16LE(automaticMode);
s.syncAsSint16LE(titleColor);
s.syncAsSint16LE(itemColor);
@@ -558,11 +554,11 @@ static void syncCT(Common::Serializer &s) {
static void DoSync(Common::Serializer &s) {
syncBasicInfo(s);
+ _vm->music().doSync(s);
syncPalette(s, newPal);
syncPalette(s, workpal);
- s.syncString(musicName, 21);
s.syncString(currentCtpName, 40);
syncBackgroundTable(s);
@@ -700,8 +696,6 @@ void initVars(void) {
isMessage = 0;
fadeFlag = 0;
- playMusic = 0;
- playMusic2 = 0;
automaticMode = 0;
// video param (vga and mcga mode)
diff --git a/engines/cruise/vars.cpp b/engines/cruise/vars.cpp
index 393682002a..f3165f8cef 100644
--- a/engines/cruise/vars.cpp
+++ b/engines/cruise/vars.cpp
@@ -51,7 +51,6 @@ int32 volumeDataLoaded = 0;
int16 numOfDisks;
-char musicName[21];
char lastOverlay[15];
char nextOverlay[15];
@@ -125,8 +124,6 @@ int16 sysY = 0;
int16 automoveInc;
int16 automoveMax;
int16 isMessage;
-int16 playMusic;
-int16 playMusic2;
int16 automaticMode;
int16 aniX;
int16 aniY;
diff --git a/engines/cruise/vars.h b/engines/cruise/vars.h
index 8a1054dab6..a6d9e87613 100644
--- a/engines/cruise/vars.h
+++ b/engines/cruise/vars.h
@@ -154,7 +154,6 @@ extern int32 volumeDataLoaded;
extern int16 numOfDisks;
-extern char musicName[21];
extern char lastOverlay[15];
extern char nextOverlay[15];
@@ -227,8 +226,6 @@ extern int16 sysY;
extern int16 automoveInc;
extern int16 automoveMax;
extern int16 isMessage;
-extern int16 playMusic;
-extern int16 playMusic2;
extern int16 automaticMode;
extern int16 aniX;
extern int16 aniY;
diff --git a/engines/cruise/volume.cpp b/engines/cruise/volume.cpp
index 1accb8f755..0f89e68dd9 100644
--- a/engines/cruise/volume.cpp
+++ b/engines/cruise/volume.cpp
@@ -189,22 +189,6 @@ int32 findFileInDisksSub1(const char *fileName) {
return (foundDisk);
}
-void strToUpper(char *fileName) {
- char character;
-
- do {
- character = *fileName;
-
- if (character >= 'a' && character <= 'z') {
- character &= 0xDF;
- *fileName = character;
- }
-
- fileName++;
-
- } while (character);
-}
-
void freeDisk(void) {
if (currentVolumeFile.isOpen()) {
currentVolumeFile.close();
@@ -266,10 +250,12 @@ void askDisk(int16 discNumber) {
changeCursor(currentCursor);
}
-int16 findFileInDisks(char *fileName) {
+int16 findFileInDisks(const char *name) {
+ char fileName[50];
int disk;
int fileIdx;
+ strcpy(fileName, name);
strToUpper(fileName);
if (!volumeDataLoaded) {
diff --git a/engines/cruise/volume.h b/engines/cruise/volume.h
index d42ecd57cc..da1d3990dd 100644
--- a/engines/cruise/volume.h
+++ b/engines/cruise/volume.h
@@ -30,13 +30,13 @@ namespace Cruise {
int16 readVolCnf(void);
int closeCnf(void);
-int16 findFileInDisks(char * fileName);
+int16 findFileInDisks(const char *name);
void freeDisk(void);
-int16 findFileInList(const char * fileName);
+int16 findFileInList(const char *fileName);
////////////////
-void strToUpper(char * fileName);
+#define strToUpper(FILENAME) strupr(FILENAME)
void drawMsgString(const char * string);
void askDisk(int16 discNumber);
void setObjectPosition(int16 param1, int16 param2, int16 param3, int16 param4);