aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/sound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/startrek/sound.cpp')
-rwxr-xr-xengines/startrek/sound.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/engines/startrek/sound.cpp b/engines/startrek/sound.cpp
new file mode 100755
index 0000000000..114ec8acec
--- /dev/null
+++ b/engines/startrek/sound.cpp
@@ -0,0 +1,192 @@
+/* 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: https://scummvm-startrek.googlecode.com/svn/trunk/sound.cpp $
+ * $Id: sound.cpp 15 2010-06-27 06:13:42Z clone2727 $
+ *
+ */
+
+#include "startrek/sound.h"
+
+#include "common/file.h"
+#include "common/macresman.h"
+
+#include "audio/mods/protracker.h"
+#include "audio/decoders/raw.h"
+
+namespace StarTrek {
+
+// Main Sound Functions
+
+Sound::Sound(StarTrekEngine *vm) : _vm(vm) {
+ if (_vm->getPlatform() == Common::kPlatformDOS || _vm->getPlatform() == Common::kPlatformMacintosh) {
+ // The main PC versions use XMIDI. ST25 Demo and Macintosh versions use SMF.
+ if ((_vm->getGameType() == GType_ST25 && _vm->getFeatures() & GF_DEMO) || _vm->getPlatform() == Common::kPlatformMacintosh)
+ _midiParser = MidiParser::createParser_SMF();
+ else
+ _midiParser = MidiParser::createParser_XMIDI();
+
+ _midiDevice = MidiDriver::detectDevice(MDT_PCSPK|MDT_ADLIB|MDT_MIDI);
+ _midiDriver = MidiDriver::createMidi(_midiDevice);
+ _midiDriver->open();
+ _midiParser->setMidiDriver(_midiDriver);
+ _midiParser->setTimerRate(_midiDriver->getBaseTempo());
+ }
+
+ if (_vm->getPlatform() == Common::kPlatformMacintosh) {
+ _macAudioResFork = new Common::MacResManager();
+ if (!_macAudioResFork->open("Star Trek Audio"))
+ error("Could not open 'Star Trek Audio'");
+ assert(_macAudioResFork->hasResFork());
+ } else
+ _macAudioResFork = 0;
+
+ _soundHandle = new Audio::SoundHandle();
+}
+
+Sound::~Sound() {
+ delete _midiParser;
+ delete _midiDriver;
+ delete _soundHandle;
+ delete _macAudioResFork;
+}
+
+void Sound::playSound(const char *baseSoundName) {
+ if (_vm->getPlatform() == Common::kPlatformAmiga)
+ playAmigaSound(baseSoundName);
+ else if (_vm->getPlatform() == Common::kPlatformMacintosh)
+ playMacSMFSound(baseSoundName);
+ else if (_vm->getFeatures() & GF_DEMO)
+ playSMFSound(baseSoundName);
+ else
+ playXMIDISound(baseSoundName);
+}
+
+void Sound::playSoundEffect(const char *baseSoundName) {
+ if (_vm->getPlatform() == Common::kPlatformAmiga)
+ playAmigaSoundEffect(baseSoundName);
+ else if (_vm->getPlatform() == Common::kPlatformMacintosh)
+ playMacSoundEffect(baseSoundName);
+ else
+ error("PC Sound Effects Not Supported");
+}
+
+// PC Functions
+
+void Sound::playSMFSound(const char *baseSoundName) {
+ Common::String soundName = baseSoundName;
+
+ soundName += '.';
+
+ switch (MidiDriver::getMusicType(_midiDevice)) {
+ case MT_MT32:
+ soundName += "ROL";
+ break;
+ case MT_PCSPK:
+ return; // Not supported...
+ default:
+ soundName += "ADL";
+ break;
+ }
+
+ debug(0, "Playing sound \'%s\'\n", soundName.c_str());
+ Common::SeekableReadStream *soundStream = _vm->openFile(soundName.c_str());
+
+ byte *soundData = (byte *)malloc(soundStream->size());
+ soundStream->read(soundData, soundStream->size());
+ _midiParser->loadMusic(soundData, soundStream->size());
+ delete soundStream;
+
+ _midiDriver->setTimerCallback(_midiParser, MidiParser::timerCallback);
+}
+
+void Sound::playXMIDISound(const char *baseSoundName) {
+ Common::String soundName = baseSoundName;
+
+ soundName += '.';
+
+ switch (MidiDriver::getMusicType(_midiDevice)) {
+ case MT_MT32:
+ soundName += "MT";
+ break;
+ case MT_PCSPK:
+ soundName += "PC";
+ break;
+ default:
+ soundName += "AD";
+ break;
+ }
+
+ debug(0, "Playing sound \'%s\'\n", soundName.c_str());
+ Common::SeekableReadStream *soundStream = _vm->openFile(soundName.c_str());
+
+ byte *soundData = (byte *)malloc(soundStream->size());
+ soundStream->read(soundData, soundStream->size());
+ _midiParser->loadMusic(soundData, soundStream->size());
+ delete soundStream;
+
+ _midiDriver->setTimerCallback(_midiParser, MidiParser::timerCallback);
+}
+
+// Amiga Functions
+
+void Sound::playAmigaSound(const char *baseSoundName) {
+ // Nope, this is wrong... see http://protracker.de/files/amiga/formats/theplayer_41_format.txt
+#if 0
+ Common::String soundName = baseSoundName;
+ soundName += ".SNG";
+ if (_vm->_mixer->isSoundHandleActive(*_soundHandle))
+ _vm->_mixer->stopHandle(*_soundHandle);
+ _vm->_mixer->playInputStream(Audio::Mixer::kMusicSoundType, _soundHandle, Audio::makeProtrackerStream(_vm->openFile(soundName.c_str())));
+#endif
+}
+
+void Sound::playAmigaSoundEffect(const char *baseSoundName) {
+ Common::String soundName = baseSoundName;
+ soundName += ".SFX";
+
+ if (_vm->_mixer->isSoundHandleActive(*_soundHandle))
+ _vm->_mixer->stopHandle(*_soundHandle);
+
+ Audio::AudioStream *audStream = (Audio::AudioStream *)Audio::makeRawStream(_vm->openFile(soundName.c_str()), 11025, 0);
+ _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, _soundHandle, audStream);
+}
+
+// Macintosh Functions
+
+void Sound::playMacSMFSound(const char *baseSoundName) {
+ Common::SeekableReadStream *soundStream = _macAudioResFork->getResource(baseSoundName);
+ byte *soundData = (byte *)malloc(soundStream->size());
+ soundStream->read(soundData, soundStream->size());
+ _midiParser->loadMusic(soundData, soundStream->size());
+ delete soundStream;
+
+ _midiDriver->setTimerCallback(_midiParser, MidiParser::timerCallback);
+}
+
+void Sound::playMacSoundEffect(const char *baseSoundName) {
+ if (_vm->_mixer->isSoundHandleActive(*_soundHandle))
+ _vm->_mixer->stopHandle(*_soundHandle);
+
+ Audio::AudioStream *audStream = (Audio::AudioStream *)Audio::makeRawStream(_macAudioResFork->getResource(baseSoundName), 11025, 0);
+ _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, _soundHandle, audStream);
+}
+
+} // End of namespace StarTrek