From d42d6122d963237ea35afc8e7015a2ae5b087523 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 1 Apr 2009 10:43:24 +0000 Subject: Laid the basics for music handling svn-id: r39786 --- engines/cruise/cruise.cpp | 17 ++++++++++++ engines/cruise/cruise.h | 8 ++++++ engines/cruise/cruise_main.cpp | 7 ++--- engines/cruise/cruise_main.h | 2 +- engines/cruise/function.cpp | 59 +++++++++++++++++++++++------------------- engines/cruise/menu.cpp | 4 +-- engines/cruise/module.mk | 1 + engines/cruise/overlay.cpp | 8 +++--- engines/cruise/saveload.cpp | 10 ++----- engines/cruise/vars.cpp | 3 --- engines/cruise/vars.h | 3 --- engines/cruise/volume.cpp | 20 +++----------- engines/cruise/volume.h | 6 ++--- 13 files changed, 77 insertions(+), 71 deletions(-) (limited to 'engines/cruise') 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); -- cgit v1.2.3