aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/sound/sound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob/sound/sound.cpp')
-rw-r--r--engines/gob/sound/sound.cpp194
1 files changed, 143 insertions, 51 deletions
diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp
index f0cf17b989..d3afc9baa3 100644
--- a/engines/gob/sound/sound.cpp
+++ b/engines/gob/sound/sound.cpp
@@ -31,20 +31,28 @@
#include "gob/game.h"
#include "gob/inter.h"
+#include "gob/sound/pcspeaker.h"
+#include "gob/sound/soundblaster.h"
+#include "gob/sound/adlib.h"
+#include "gob/sound/infogrames.h"
+#include "gob/sound/protracker.h"
+#include "gob/sound/cdrom.h"
+
namespace Gob {
Sound::Sound(GobEngine *vm) : _vm(vm) {
_pcspeaker = new PCSpeaker(*_vm->_mixer);
_blaster = new SoundBlaster(*_vm->_mixer);
- _adlib = 0;
+ _adlPlayer = 0;
+ _mdyPlayer = 0;
_infogrames = 0;
_protracker = 0;
_cdrom = 0;
_bgatmos = 0;
- if (!_vm->_noMusic && _vm->hasAdlib())
- _adlib = new AdLib(*_vm->_mixer);
+ _hasAdLib = (!_vm->_noMusic && _vm->hasAdlib());
+
if (!_vm->_noMusic && (_vm->getPlatform() == Common::kPlatformAmiga)) {
_infogrames = new Infogrames(*_vm->_mixer);
_protracker = new Protracker(*_vm->_mixer);
@@ -62,7 +70,8 @@ Sound::Sound(GobEngine *vm) : _vm(vm) {
Sound::~Sound() {
delete _pcspeaker;
delete _blaster;
- delete _adlib;
+ delete _adlPlayer;
+ delete _mdyPlayer;
delete _infogrames;
delete _protracker;
delete _cdrom;
@@ -105,14 +114,11 @@ bool Sound::sampleLoad(SoundDesc *sndDesc, SoundType type, const char *fileName,
debugC(2, kDebugSound, "Loading sample \"%s\"", fileName);
- int16 handle = _vm->_dataIO->openData(fileName);
- if (handle < 0) {
+ if (!_vm->_dataIO->existData(fileName)) {
warning("Can't open sample file \"%s\"", fileName);
return false;
}
- _vm->_dataIO->closeData(handle);
-
byte *data;
uint32 size;
@@ -121,7 +127,7 @@ bool Sound::sampleLoad(SoundDesc *sndDesc, SoundType type, const char *fileName,
return false;
size = _vm->_dataIO->getDataSize(fileName);
- return sndDesc->load(type, SOUND_FILE, data, size);
+ return sndDesc->load(type, data, size);
}
void Sound::sampleFree(SoundDesc *sndDesc, bool noteAdlib, int index) {
@@ -130,9 +136,14 @@ void Sound::sampleFree(SoundDesc *sndDesc, bool noteAdlib, int index) {
if (sndDesc->getType() == SOUND_ADL) {
- if (_adlib && noteAdlib)
- if ((index == -1) || (_adlib->getIndex() == index))
- _adlib->stopPlay();
+ if (noteAdlib) {
+ if (_adlPlayer)
+ if ((index == -1) || (_adlPlayer->getIndex() == index))
+ _adlPlayer->stopPlay();
+ if (_mdyPlayer)
+ if ((index == -1) || (_mdyPlayer->getIndex() == index))
+ _mdyPlayer->stopPlay();
+ }
} else {
@@ -223,50 +234,112 @@ void Sound::infogramesStop() {
_infogrames->stop();
}
-bool Sound::adlibLoad(const char *fileName) {
- if (!_adlib)
+bool Sound::adlibLoadADL(const char *fileName) {
+ if (!_hasAdLib)
return false;
- debugC(1, kDebugSound, "Adlib: Loading data (\"%s\")", fileName);
+ if (!_adlPlayer)
+ _adlPlayer = new ADLPlayer(*_vm->_mixer);
+
+ debugC(1, kDebugSound, "Adlib: Loading ADL data (\"%s\")", fileName);
- return _adlib->load(fileName);
+ return _adlPlayer->load(fileName);
}
-bool Sound::adlibLoad(byte *data, uint32 size, int index) {
- if (!_adlib)
+bool Sound::adlibLoadADL(byte *data, uint32 size, int index) {
+ if (!_hasAdLib)
return false;
- debugC(1, kDebugSound, "Adlib: Loading data (%d)", index);
+ if (!_adlPlayer)
+ _adlPlayer = new ADLPlayer(*_vm->_mixer);
+
+ debugC(1, kDebugSound, "Adlib: Loading ADL data (%d)", index);
- return _adlib->load(data, size, index);
+ return _adlPlayer->load(data, size, index);
}
void Sound::adlibUnload() {
- if (!_adlib)
+ if (!_hasAdLib)
return;
debugC(1, kDebugSound, "Adlib: Unloading data");
- _adlib->unload();
+ if (_adlPlayer)
+ _adlPlayer->unload();
+ if (_mdyPlayer)
+ _mdyPlayer->unload();
+}
+
+bool Sound::adlibLoadMDY(const char *fileName) {
+ if (!_hasAdLib)
+ return false;
+
+ if (!_mdyPlayer)
+ _mdyPlayer = new MDYPlayer(*_vm->_mixer);
+
+ debugC(1, kDebugSound, "Adlib: Loading MDY data (\"%s\")", 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) {
+ if (!_hasAdLib)
+ return false;
+
+ 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);
+
+ DataStream *stream = _vm->_dataIO->getDataStream(fileName);
+
+ bool loaded = _mdyPlayer->loadTBR(*stream);
+
+ delete stream;
+
+ return loaded;
}
void Sound::adlibPlayTrack(const char *trackname) {
- if (!_adlib || _adlib->isPlaying())
+ if (!_hasAdLib)
return;
- debugC(1, kDebugSound, "Adlib: Playing track \"%s\"", trackname);
+ if (!_adlPlayer)
+ _adlPlayer = new ADLPlayer(*_vm->_mixer);
- _adlib->unload();
- _adlib->load(trackname);
- _adlib->startPlay();
+ if (_adlPlayer->isPlaying())
+ return;
+
+ debugC(1, kDebugSound, "Adlib: Playing ADL track \"%s\"", trackname);
+
+ _adlPlayer->unload();
+ _adlPlayer->load(trackname);
+ _adlPlayer->startPlay();
}
void Sound::adlibPlayBgMusic() {
- int track;
-
- if (!_adlib)
+ if (!_hasAdLib)
return;
+ if (!_adlPlayer)
+ _adlPlayer = new ADLPlayer(*_vm->_mixer);
+
static const char *tracksMac[] = {
// "musmac1.adl", // TODO: This track isn't played correctly at all yet
"musmac2.adl",
@@ -285,58 +358,82 @@ void Sound::adlibPlayBgMusic() {
};
if (_vm->getPlatform() == Common::kPlatformWindows) {
- track = _vm->_util->getRandom(ARRAYSIZE(tracksWin));
+ int track = _vm->_util->getRandom(ARRAYSIZE(tracksWin));
adlibPlayTrack(tracksWin[track]);
} else {
- track = _vm->_util->getRandom(ARRAYSIZE(tracksMac));
+ int track = _vm->_util->getRandom(ARRAYSIZE(tracksMac));
adlibPlayTrack(tracksMac[track]);
}
}
void Sound::adlibPlay() {
- if (!_adlib)
+ if (!_hasAdLib)
return;
debugC(1, kDebugSound, "Adlib: Starting playback");
- _adlib->startPlay();
+ if (_adlPlayer)
+ _adlPlayer->startPlay();
+ if (_mdyPlayer)
+ _mdyPlayer->startPlay();
}
void Sound::adlibStop() {
- if (!_adlib)
+ if (!_hasAdLib)
return;
debugC(1, kDebugSound, "Adlib: Stopping playback");
- _adlib->stopPlay();
+ if (_adlPlayer)
+ _adlPlayer->stopPlay();
+ if (_mdyPlayer)
+ _mdyPlayer->stopPlay();
}
bool Sound::adlibIsPlaying() const {
- if (!_adlib)
+ if (!_hasAdLib)
return false;
- return _adlib->isPlaying();
+ if (_adlPlayer && _adlPlayer->isPlaying())
+ return true;
+ if (_mdyPlayer && _mdyPlayer->isPlaying())
+ return true;
+
+ return false;
}
int Sound::adlibGetIndex() const {
- if (!_adlib)
+ if (!_hasAdLib)
return -1;
- return _adlib->getIndex();
+ if (_adlPlayer)
+ return _adlPlayer->getIndex();
+ if (_mdyPlayer)
+ return _mdyPlayer->getIndex();
+
+ return -1;
}
bool Sound::adlibGetRepeating() const {
- if (!_adlib)
+ if (!_hasAdLib)
return false;
- return _adlib->getRepeating();
+ if (_adlPlayer)
+ return _adlPlayer->getRepeating();
+ if (_mdyPlayer)
+ return _mdyPlayer->getRepeating();
+
+ return false;
}
void Sound::adlibSetRepeating(int32 repCount) {
- if (!_adlib)
+ if (!_hasAdLib)
return;
- _adlib->setRepeating(repCount);
+ if (_adlPlayer)
+ _adlPlayer->setRepeating(repCount);
+ if (_mdyPlayer)
+ _mdyPlayer->setRepeating(repCount);
}
void Sound::blasterPlay(SoundDesc *sndDesc, int16 repCount,
@@ -425,17 +522,12 @@ void Sound::cdLoadLIC(const char *fname) {
debugC(1, kDebugSound, "CDROM: Loading LIC \"%s\"", fname);
- int handle = _vm->_dataIO->openData(fname);
-
- if (handle == -1)
+ if (!_vm->_dataIO->existData(fname))
return;
- _vm->_dataIO->closeData(handle);
-
_vm->_dataIO->getUnpackedData(fname);
- handle = _vm->_dataIO->openData(fname);
- DataStream *stream = _vm->_dataIO->openAsStream(handle, true);
+ DataStream *stream = _vm->_dataIO->getDataStream(fname);
_cdrom->readLIC(*stream);