aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/sound/music.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/sound/music.h')
-rw-r--r--engines/sci/sound/music.h219
1 files changed, 219 insertions, 0 deletions
diff --git a/engines/sci/sound/music.h b/engines/sci/sound/music.h
new file mode 100644
index 0000000000..eaed0af64d
--- /dev/null
+++ b/engines/sci/sound/music.h
@@ -0,0 +1,219 @@
+/* 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$
+ * $Id$
+ *
+ */
+
+#ifndef SCI_MUSIC_H
+#define SCI_MUSIC_H
+
+#include "common/savefile.h"
+#include "common/serializer.h"
+#include "common/mutex.h"
+
+#include "sound/mixer.h"
+#include "sound/audiostream.h"
+#include "sound/mididrv.h"
+#include "sound/midiparser.h"
+
+#include "sci/sci.h"
+#include "sci/resource.h"
+#include "sci/sound/softseq/mididriver.h"
+
+namespace Sci {
+
+enum TrackType {
+ kTrackAdlib = 0,
+ kTrackGameBlaster = 9,
+ kTrackMT32 = 12,
+ kTrackSpeaker = 18,
+ kTrackTandy = 19
+};
+
+enum SoundStatus {
+ kSoundStopped = 0,
+ kSoundInitialized = 1,
+ kSoundPaused = 2,
+ kSoundPlaying = 3
+};
+
+#define MUSIC_VOLUME_DEFAULT 127
+#define MUSIC_VOLUME_MAX 127
+
+class MidiParser_SCI;
+class SegManager;
+
+class MusicEntry
+#ifndef USE_OLD_MUSIC_FUNCTIONS
+ : public Common::Serializable
+#endif
+{
+public:
+ // Do not get these directly for the sound objects!
+ // It's a bad idea, as the sound code (i.e. the SciMusic
+ // class) should be as separate as possible from the rest
+ // of the engine
+
+ reg_t soundObj;
+
+ SoundResource *soundRes;
+ uint16 resnum;
+
+ uint16 dataInc;
+ uint16 ticker;
+ uint16 signal;
+ byte prio;
+ uint16 loop;
+ byte volume;
+ byte hold;
+
+ int16 pauseCounter;
+ uint sampleLoopCounter;
+
+ byte fadeTo;
+ short fadeStep;
+ uint32 fadeTicker;
+ uint32 fadeTickerStep;
+ bool fadeSetVolume;
+ bool fadeCompleted;
+
+ SoundStatus status;
+
+ Audio::Mixer::SoundType soundType;
+
+#ifndef USE_OLD_MUSIC_FUNCTIONS
+//protected:
+#endif
+ MidiParser_SCI *pMidiParser;
+ Audio::AudioStream* pStreamAud;
+ Audio::SoundHandle hCurrentAud;
+
+public:
+ MusicEntry();
+ ~MusicEntry();
+
+ void doFade();
+ void onTimer();
+
+#ifndef USE_OLD_MUSIC_FUNCTIONS
+ virtual void saveLoadWithSerializer(Common::Serializer &ser);
+#endif
+};
+
+typedef Common::Array<MusicEntry *> MusicList;
+
+class SciMusic
+#ifndef USE_OLD_MUSIC_FUNCTIONS
+ : public Common::Serializable
+#endif
+{
+
+public:
+ SciMusic(SciVersion soundVersion);
+ ~SciMusic();
+
+ void init();
+#if 0
+ void loadPatch();
+#endif
+ void onTimer();
+ void clearPlayList();
+
+ // sound and midi functions
+ void soundInitSnd(MusicEntry *pSnd);
+ void soundPlay(MusicEntry *pSnd);
+ void soundStop(MusicEntry *pSnd);
+ void soundKill(MusicEntry *pSnd);
+ void soundPause(MusicEntry *pSnd);
+ void soundResume(MusicEntry *pSnd);
+ void soundSetVolume(MusicEntry *pSnd, byte volume);
+ void soundSetPriority(MusicEntry *pSnd, byte prio);
+ uint16 soundGetMasterVolume();
+ void soundSetMasterVolume(uint16 vol);
+ uint16 soundGetSoundOn() const { return _soundOn; }
+ void soundSetSoundOn(bool soundOnFlag);
+ uint16 soundGetVoices();
+ uint32 soundGetTempo() const { return _dwTempo; }
+
+ MusicEntry *getSlot(reg_t obj);
+
+ void pushBackSlot(MusicEntry *slotEntry) {
+ Common::StackLock lock(_mutex);
+ _playList.push_back(slotEntry);
+ }
+
+ void printPlayList(Console *con);
+
+ // The following two methods are NOT thread safe - make sure that
+ // the mutex is always locked before calling them
+ MusicList::iterator getPlayListStart() { return _playList.begin(); }
+ MusicList::iterator getPlayListEnd() { return _playList.end(); }
+
+ void sendMidiCommand (uint32 cmd) {
+ Common::StackLock lock(_mutex);
+ _pMidiDrv->send(cmd);
+ }
+
+ void setReverb(byte reverb);
+
+ void resetDriver();
+
+#ifndef USE_OLD_MUSIC_FUNCTIONS
+ virtual void saveLoadWithSerializer(Common::Serializer &ser);
+#endif
+
+ // Mutex for music code. Used to guard access to the song playlist, to the
+ // MIDI parser and to the MIDI driver/player. Note that guarded code must NOT
+ // include references to the mixer, otherwise there will probably be situations
+ // where a deadlock can occur
+ Common::Mutex _mutex;
+
+protected:
+ byte findAudEntry(uint16 nAud, byte&oVolume, uint32& oOffset, uint32&oSize);
+ void sortPlayList();
+#if 0
+ void loadPatchMT32();
+ void patchSysEx(byte * addr, byte *pdata, int len);
+ void patchUpdateAddr(byte *addr, int len);
+#endif
+
+ SciVersion _soundVersion;
+
+ Audio::Mixer *_pMixer;
+ MidiPlayer *_pMidiDrv;
+ MidiDriverType _midiType;
+
+ uint32 _dwTempo;
+ // Mixed Adlib/MIDI mode: when enabled from the ScummVM sound options screen,
+ // and a sound has a digital track, the sound from the Adlib track is played
+ bool _bMultiMidi;
+private:
+ static void miditimerCallback(void *p);
+
+ MusicList _playList;
+ bool _soundOn;
+ byte _reverb;
+};
+
+} // End of namespace Sci
+
+#endif