aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction
diff options
context:
space:
mode:
Diffstat (limited to 'engines/parallaction')
-rw-r--r--engines/parallaction/sound_br.cpp75
-rw-r--r--engines/parallaction/sound_ns.cpp100
2 files changed, 25 insertions, 150 deletions
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp
index c80f96b4bc..1bc085fd34 100644
--- a/engines/parallaction/sound_br.cpp
+++ b/engines/parallaction/sound_br.cpp
@@ -27,8 +27,8 @@
#include "common/util.h"
#include "audio/mixer.h"
-#include "audio/mididrv.h"
#include "audio/midiparser.h"
+#include "audio/midiplayer.h"
#include "audio/mods/protracker.h"
#include "audio/decoders/raw.h"
@@ -201,13 +201,9 @@ MidiParser *createParser_MSC() {
}
-class MidiPlayer_MSC : public MidiDriver_BASE {
+class MidiPlayer_MSC : public Audio::MidiPlayer {
public:
- enum {
- NUM_CHANNELS = 16
- };
-
MidiPlayer_MSC(MidiDriver *driver);
~MidiPlayer_MSC();
@@ -215,42 +211,26 @@ public:
void stop();
void pause(bool p);
void updateTimer();
- void adjustVolume(int diff);
void setVolume(int volume);
- int getVolume() const { return _masterVolume; }
- void setLooping(bool loop) { _isLooping = loop; }
// MidiDriver_BASE interface
virtual void send(uint32 b);
- virtual void metaEvent(byte type, byte *data, uint16 length);
private:
static void timerCallback(void *p);
void setVolumeInternal(int volume);
- Common::Mutex _mutex;
- MidiDriver *_driver;
- MidiParser *_parser;
uint8 *_midiData;
- bool _isLooping;
- bool _isPlaying;
bool _paused;
-
- int _masterVolume;
- MidiChannel *_channels[NUM_CHANNELS];
- uint8 _volume[NUM_CHANNELS];
};
MidiPlayer_MSC::MidiPlayer_MSC(MidiDriver *driver)
- : _driver(driver), _parser(0), _midiData(0), _isLooping(false), _isPlaying(false), _paused(false), _masterVolume(0) {
+ : _midiData(0), _paused(false) {
+ _driver = driver;
assert(_driver);
- memset(_channels, 0, sizeof(_channels));
- for (int i = 0; i < NUM_CHANNELS; i++) {
- _volume[i] = 127;
- }
int ret = _driver->open();
if (ret == 0) {
@@ -295,13 +275,9 @@ void MidiPlayer_MSC::play(Common::SeekableReadStream *stream) {
}
void MidiPlayer_MSC::stop() {
- Common::StackLock lock(_mutex);
- if (_isPlaying) {
- _isPlaying = false;
- _parser->unloadMusic();
- free(_midiData);
- _midiData = 0;
- }
+ Audio::MidiPlayer::stop();
+ free(_midiData);
+ _midiData = 0;
}
void MidiPlayer_MSC::pause(bool p) {
@@ -320,10 +296,6 @@ void MidiPlayer_MSC::updateTimer() {
}
}
-void MidiPlayer_MSC::adjustVolume(int diff) {
- setVolume(_masterVolume + diff);
-}
-
void MidiPlayer_MSC::setVolume(int volume) {
_masterVolume = CLIP(volume, 0, 255);
setVolumeInternal(_masterVolume);
@@ -331,43 +303,28 @@ void MidiPlayer_MSC::setVolume(int volume) {
void MidiPlayer_MSC::setVolumeInternal(int volume) {
Common::StackLock lock(_mutex);
- for (int i = 0; i < NUM_CHANNELS; ++i) {
- if (_channels[i]) {
- _channels[i]->volume(_volume[i] * volume / 255);
+ for (int i = 0; i < kNumChannels; ++i) {
+ if (_channelsTable[i]) {
+ _channelsTable[i]->volume(_channelsVolume[i] * volume / 255);
}
}
}
void MidiPlayer_MSC::send(uint32 b) {
+ // FIXME/TODO: Unlike Audio::MidiPlayer::send(), this code
+ // does not handle All Note Off. Is this on purpose?
+ // If not, we could simply remove this method, and use the
+ // inherited one.
const byte ch = b & 0x0F;
byte param2 = (b >> 16) & 0xFF;
switch (b & 0xFFF0) {
case 0x07B0: // volume change
- _volume[ch] = param2;
+ _channelsVolume[ch] = param2;
break;
}
- if (!_channels[ch]) {
- _channels[ch] = (ch == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
- }
- if (_channels[ch]) {
- _channels[ch]->send(b);
- }
-}
-
-void MidiPlayer_MSC::metaEvent(byte type, byte *data, uint16 length) {
- switch (type) {
- case 0x2F: // end of Track
- if (_isLooping) {
- _parser->jumpToTick(0);
- } else {
- stop();
- }
- break;
- default:
- break;
- }
+ sendToChannel(ch, b);
}
void MidiPlayer_MSC::timerCallback(void *p) {
diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp
index f92436497b..8f3f0c39e6 100644
--- a/engines/parallaction/sound_ns.cpp
+++ b/engines/parallaction/sound_ns.cpp
@@ -29,6 +29,7 @@
#include "audio/mixer.h"
#include "audio/midiparser.h"
+#include "audio/midiplayer.h"
#include "audio/mods/protracker.h"
#include "audio/decoders/raw.h"
@@ -38,13 +39,9 @@
namespace Parallaction {
-class MidiPlayer : public MidiDriver_BASE {
+class MidiPlayer : public Audio::MidiPlayer {
public:
- enum {
- NUM_CHANNELS = 16
- };
-
MidiPlayer(MidiDriver *driver);
~MidiPlayer();
@@ -52,38 +49,18 @@ public:
void stop();
void pause(bool p);
void updateTimer();
- void adjustVolume(int diff);
- void setVolume(int volume);
- int getVolume() const { return _masterVolume; }
- void setLooping(bool loop) { _isLooping = loop; }
-
- // MidiDriver_BASE interface
- virtual void send(uint32 b);
- virtual void metaEvent(byte type, byte *data, uint16 length);
private:
-
static void timerCallback(void *p);
- MidiDriver *_driver;
- MidiParser *_parser;
uint8 *_midiData;
- bool _isLooping;
- bool _isPlaying;
bool _paused;
- int _masterVolume;
- MidiChannel *_channelsTable[NUM_CHANNELS];
- uint8 _channelsVolume[NUM_CHANNELS];
- Common::Mutex _mutex;
};
MidiPlayer::MidiPlayer(MidiDriver *driver)
- : _driver(driver), _parser(0), _midiData(0), _isLooping(false), _isPlaying(false), _paused(false), _masterVolume(0) {
- assert(_driver);
- memset(_channelsTable, 0, sizeof(_channelsTable));
- for (int i = 0; i < NUM_CHANNELS; i++) {
- _channelsVolume[i] = 127;
- }
+ : _midiData(0), _paused(false) {
+ assert(driver);
+ _driver = driver;
int ret = _driver->open();
if (ret == 0) {
@@ -128,19 +105,15 @@ void MidiPlayer::play(Common::SeekableReadStream *stream) {
}
void MidiPlayer::stop() {
- Common::StackLock lock(_mutex);
- if (_isPlaying) {
- _isPlaying = false;
- _parser->unloadMusic();
- free(_midiData);
- _midiData = 0;
- }
+ Audio::MidiPlayer::stop();
+ free(_midiData);
+ _midiData = 0;
}
void MidiPlayer::pause(bool p) {
_paused = p;
- for (int i = 0; i < NUM_CHANNELS; ++i) {
+ for (int i = 0; i < kNumChannels; ++i) {
if (_channelsTable[i]) {
_channelsTable[i]->volume(_paused ? 0 : _channelsVolume[i] * _masterVolume / 255);
}
@@ -158,61 +131,6 @@ void MidiPlayer::updateTimer() {
}
}
-void MidiPlayer::adjustVolume(int diff) {
- setVolume(_masterVolume + diff);
-}
-
-void MidiPlayer::setVolume(int volume) {
- _masterVolume = CLIP(volume, 0, 255);
-
- Common::StackLock lock(_mutex);
- for (int i = 0; i < NUM_CHANNELS; ++i) {
- if (_channelsTable[i]) {
- _channelsTable[i]->volume(_channelsVolume[i] * _masterVolume / 255);
- }
- }
-}
-
-void MidiPlayer::send(uint32 b) {
- byte volume, ch = (byte)(b & 0xF);
- switch (b & 0xFFF0) {
- case 0x07B0: // volume change
- volume = (byte)((b >> 16) & 0x7F);
- _channelsVolume[ch] = volume;
- volume = volume * _masterVolume / 255;
- b = (b & 0xFF00FFFF) | (volume << 16);
- break;
- case 0x7BB0: // all notes off
- if (!_channelsTable[ch]) {
- // channel not yet allocated, no need to send the event
- return;
- }
- break;
- }
-
- if (!_channelsTable[ch]) {
- _channelsTable[ch] = (ch == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
- }
- if (_channelsTable[ch]) {
- _channelsTable[ch]->send(b);
- }
-}
-
-void MidiPlayer::metaEvent(byte type, byte *data, uint16 length) {
- switch (type) {
- case 0x2F: // end of Track
- if (_isLooping) {
- _parser->jumpToTick(0);
- } else {
- stop();
- }
- break;
- default:
-// warning("Unhandled meta event: %02x", type);
- break;
- }
-}
-
void MidiPlayer::timerCallback(void *p) {
MidiPlayer *player = (MidiPlayer *)p;