aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction/music.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/parallaction/music.h')
-rw-r--r--engines/parallaction/music.h52
1 files changed, 49 insertions, 3 deletions
diff --git a/engines/parallaction/music.h b/engines/parallaction/music.h
index 4f3f211002..eef249a7d4 100644
--- a/engines/parallaction/music.h
+++ b/engines/parallaction/music.h
@@ -23,11 +23,57 @@
#ifndef PARALLACTION_MUSIC_H
#define PARALLACTION_MUSIC_H
+#include "common/util.h"
+#include "common/mutex.h"
+
+#include "sound/mididrv.h"
+
+class MidiParser;
+
namespace Parallaction {
-void stopMusic();
-void playMusic();
-void loadMusic(const char *filename);
+class MidiPlayer : public MidiDriver {
+public:
+
+ enum {
+ NUM_CHANNELS = 16
+ };
+
+ MidiPlayer(MidiDriver *driver);
+ ~MidiPlayer();
+
+ void play(const char *filename);
+ void stop();
+ void updateTimer();
+ void adjustVolume(int diff);
+ void setVolume(int volume);
+ int getVolume() const { return _masterVolume; }
+ void setLooping(bool loop) { _isLooping = loop; }
+
+ // MidiDriver interface
+ int open();
+ void close();
+ void send(uint32 b);
+ void metaEvent(byte type, byte *data, uint16 length);
+ void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
+ uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
+ MidiChannel *allocateChannel() { return 0; }
+ MidiChannel *getPercussionChannel() { return 0; }
+
+private:
+
+ static void timerCallback(void *p);
+
+ MidiDriver *_driver;
+ MidiParser *_parser;
+ uint8 *_midiData;
+ bool _isLooping;
+ bool _isPlaying;
+ int _masterVolume;
+ MidiChannel *_channelsTable[NUM_CHANNELS];
+ uint8 _channelsVolume[NUM_CHANNELS];
+ Common::Mutex _mutex;
+};
} // namespace Parallaction