[Scummvm-cvs-logs] scummvm master -> 7949d7c6def2df6f3d44db4f55e9d1d3a87a0412
fingolfin
max at quendi.de
Fri Mar 25 14:18:21 CET 2011
This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
00ad039b4c TOUCHE: Change MidiPlayer to derive from Audio::MidiPlayer
bd637b4c5c TOUCHE: Move _gmToRol to midi.cpp
6bf4745a1b HUGO: Move MidiDriver creation into MidiPlayer constructor
9ffc4e0151 PARALLACTION: Move MidiDriver creation into MidiPlayer(_MSC) constructors
61ff5de0cf AUDIO: Rename 'channel' to 'ch'
f333d93fe8 TINSEL: Remove unused TinselEngine::_musicVolume member
db3802b021 AUDIO: Whitespace fix
7949d7c6de AUDIO: Move more common code to Audio::MidiPlayer
Commit: 00ad039b4cb0959b602592579d16adfac89bffc1
https://github.com/scummvm/scummvm/commit/00ad039b4cb0959b602592579d16adfac89bffc1
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:14:13-07:00
Commit Message:
TOUCHE: Change MidiPlayer to derive from Audio::MidiPlayer
Changed paths:
engines/touche/midi.cpp
engines/touche/midi.h
diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp
index 4349a29..9450f04 100644
--- a/engines/touche/midi.cpp
+++ b/engines/touche/midi.cpp
@@ -33,8 +33,9 @@
namespace Touche {
MidiPlayer::MidiPlayer()
- : _driver(0), _parser(0), _midiData(0), _isLooping(false), _isPlaying(false), _masterVolume(0) {
- memset(_channelsTable, 0, sizeof(_channelsTable));
+ : _midiData(0) {
+
+ // FIXME: Necessary?
memset(_channelsVolume, 0, sizeof(_channelsVolume));
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
@@ -81,13 +82,9 @@ void MidiPlayer::play(Common::ReadStream &stream, int size, bool loop) {
}
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::updateTimer() {
@@ -102,9 +99,17 @@ void MidiPlayer::adjustVolume(int diff) {
}
void MidiPlayer::setVolume(int volume) {
+ // FIXME: This is almost identical to Audio::MidiPlayer::setVolume,
+ // the only difference is that this implementation will always
+ // transmit the volume change, even if the current _masterVolume
+ // equals the new master volume. This *could* make a difference in
+ // some situations.
+ // So, we should determine whether Touche requires this behavioral
+ // difference; and maybe also if other engines could benefit from it
+ // (as hypothetically, it might fix some subtle bugs?)
_masterVolume = CLIP(volume, 0, 255);
Common::StackLock lock(_mutex);
- for (int i = 0; i < NUM_CHANNELS; ++i) {
+ for (int i = 0; i < kNumChannels; ++i) {
if (_channelsTable[i]) {
_channelsTable[i]->volume(_channelsVolume[i] * _masterVolume / 255);
}
@@ -112,47 +117,10 @@ void MidiPlayer::setVolume(int volume) {
}
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;
- default:
- if ((b & 0xF0) == 0xC0 && _nativeMT32) { // program change
- b = (b & 0xFFFF00FF) | (_gmToRol[(b >> 8) & 0x7F] << 8);
- }
- 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;
+ if ((b & 0xF0) == 0xC0 && _nativeMT32) { // program change
+ b = (b & 0xFFFF00FF) | (_gmToRol[(b >> 8) & 0x7F] << 8);
}
+ Audio::MidiPlayer::send(b);
}
void MidiPlayer::timerCallback(void *p) {
diff --git a/engines/touche/midi.h b/engines/touche/midi.h
index bc5adc6..091deab 100644
--- a/engines/touche/midi.h
+++ b/engines/touche/midi.h
@@ -29,7 +29,7 @@
#include "common/util.h"
#include "common/mutex.h"
-#include "audio/mididrv.h"
+#include "audio/midiplayer.h"
class MidiParser;
@@ -39,13 +39,8 @@ namespace Common {
namespace Touche {
-class MidiPlayer : public MidiDriver_BASE {
+class MidiPlayer : public Audio::MidiPlayer {
public:
-
- enum {
- NUM_CHANNELS = 16
- };
-
MidiPlayer();
~MidiPlayer();
@@ -54,27 +49,15 @@ public:
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;
- int _masterVolume;
- bool _nativeMT32;
- MidiChannel *_channelsTable[NUM_CHANNELS];
- uint8 _channelsVolume[NUM_CHANNELS];
- Common::Mutex _mutex;
static const uint8 _gmToRol[];
};
Commit: bd637b4c5c159c2eeefe14634a7c227c1e2df800
https://github.com/scummvm/scummvm/commit/bd637b4c5c159c2eeefe14634a7c227c1e2df800
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:14:13-07:00
Commit Message:
TOUCHE: Move _gmToRol to midi.cpp
Changed paths:
engines/touche/midi.cpp
engines/touche/midi.h
engines/touche/staticres.cpp
diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp
index 9450f04..bdf5788 100644
--- a/engines/touche/midi.cpp
+++ b/engines/touche/midi.cpp
@@ -32,6 +32,18 @@
namespace Touche {
+static const uint8 _gmToRol[256] = {
+ 0x01, 0x02, 0x03, 0x08, 0x04, 0x05, 0x11, 0x14, 0x66, 0x66, 0x66, 0x62, 0x69, 0x68, 0x67, 0x26,
+ 0x09, 0x0A, 0x0B, 0x0E, 0x0F, 0x10, 0x10, 0x10, 0x3C, 0x3D, 0x3D, 0x3D, 0x3D, 0x3E, 0x3F, 0x3F,
+ 0x47, 0x41, 0x42, 0x48, 0x45, 0x46, 0x1D, 0x1E, 0x35, 0x36, 0x37, 0x39, 0x33, 0x34, 0x3A, 0x71,
+ 0x31, 0x32, 0x31, 0x32, 0x23, 0x23, 0x23, 0x7B, 0x59, 0x5B, 0x5F, 0x5A, 0x5D, 0x60, 0x19, 0x1A,
+ 0x4F, 0x50, 0x51, 0x52, 0x55, 0x56, 0x57, 0x53, 0x4B, 0x49, 0x4D, 0x4E, 0x6F, 0x6C, 0x6D, 0x6E,
+ 0x30, 0x19, 0x4E, 0x2B, 0x28, 0x23, 0x19, 0x30, 0x21, 0x25, 0x1C, 0x21, 0x24, 0x22, 0x21, 0x22,
+ 0x2A, 0x25, 0x24, 0x26, 0x2E, 0x22, 0x29, 0x21, 0x40, 0x40, 0x6A, 0x6A, 0x68, 0x10, 0x35, 0x10,
+ 0x7F, 0x6B, 0x69, 0x75, 0x76, 0x72, 0x74, 0x01, 0x01, 0x70, 0x01, 0x7D, 0x7C, 0x01, 0x01, 0x01
+};
+
+
MidiPlayer::MidiPlayer()
: _midiData(0) {
diff --git a/engines/touche/midi.h b/engines/touche/midi.h
index 091deab..8f2f850 100644
--- a/engines/touche/midi.h
+++ b/engines/touche/midi.h
@@ -58,8 +58,6 @@ private:
static void timerCallback(void *p);
uint8 *_midiData;
-
- static const uint8 _gmToRol[];
};
} // namespace Touche
diff --git a/engines/touche/staticres.cpp b/engines/touche/staticres.cpp
index a377a6e..74aa795 100644
--- a/engines/touche/staticres.cpp
+++ b/engines/touche/staticres.cpp
@@ -1822,15 +1822,4 @@ int Graphics::_fontSize = Graphics::_engFontSize;
const uint8 *Graphics::_fontData = Graphics::_engFontData;
-const uint8 MidiPlayer::_gmToRol[] = {
- 0x01, 0x02, 0x03, 0x08, 0x04, 0x05, 0x11, 0x14, 0x66, 0x66, 0x66, 0x62, 0x69, 0x68, 0x67, 0x26,
- 0x09, 0x0A, 0x0B, 0x0E, 0x0F, 0x10, 0x10, 0x10, 0x3C, 0x3D, 0x3D, 0x3D, 0x3D, 0x3E, 0x3F, 0x3F,
- 0x47, 0x41, 0x42, 0x48, 0x45, 0x46, 0x1D, 0x1E, 0x35, 0x36, 0x37, 0x39, 0x33, 0x34, 0x3A, 0x71,
- 0x31, 0x32, 0x31, 0x32, 0x23, 0x23, 0x23, 0x7B, 0x59, 0x5B, 0x5F, 0x5A, 0x5D, 0x60, 0x19, 0x1A,
- 0x4F, 0x50, 0x51, 0x52, 0x55, 0x56, 0x57, 0x53, 0x4B, 0x49, 0x4D, 0x4E, 0x6F, 0x6C, 0x6D, 0x6E,
- 0x30, 0x19, 0x4E, 0x2B, 0x28, 0x23, 0x19, 0x30, 0x21, 0x25, 0x1C, 0x21, 0x24, 0x22, 0x21, 0x22,
- 0x2A, 0x25, 0x24, 0x26, 0x2E, 0x22, 0x29, 0x21, 0x40, 0x40, 0x6A, 0x6A, 0x68, 0x10, 0x35, 0x10,
- 0x7F, 0x6B, 0x69, 0x75, 0x76, 0x72, 0x74, 0x01, 0x01, 0x70, 0x01, 0x7D, 0x7C, 0x01, 0x01, 0x01
-};
-
} // namespace Touche
Commit: 6bf4745a1bdd2116702e8b53107315ed621c6627
https://github.com/scummvm/scummvm/commit/6bf4745a1bdd2116702e8b53107315ed621c6627
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:43-07:00
Commit Message:
HUGO: Move MidiDriver creation into MidiPlayer constructor
Changed paths:
engines/hugo/sound.cpp
engines/hugo/sound.h
diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp
index 04da0c8..f0a0882 100644
--- a/engines/hugo/sound.cpp
+++ b/engines/hugo/sound.cpp
@@ -47,8 +47,11 @@
namespace Hugo {
-MidiPlayer::MidiPlayer(MidiDriver *driver)
+MidiPlayer::MidiPlayer()
: _midiData(0) {
+
+ MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
+ _driver = MidiDriver::createMidi(dev);
assert(_driver);
_paused = false;
}
@@ -158,10 +161,7 @@ void MidiPlayer::timerCallback(void *p) {
}
SoundHandler::SoundHandler(HugoEngine *vm) : _vm(vm) {
- MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
- MidiDriver *driver = MidiDriver::createMidi(dev);
-
- _midiPlayer = new MidiPlayer(driver);
+ _midiPlayer = new MidiPlayer();
_speakerStream = new Audio::PCSpeaker(_vm->_mixer->getOutputRate());
_vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_speakerHandle,
_speakerStream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
diff --git a/engines/hugo/sound.h b/engines/hugo/sound.h
index b8a7bf9..f3a141a 100644
--- a/engines/hugo/sound.h
+++ b/engines/hugo/sound.h
@@ -41,7 +41,7 @@ namespace Hugo {
class MidiPlayer : public Audio::MidiPlayer {
public:
- MidiPlayer(MidiDriver *driver);
+ MidiPlayer();
~MidiPlayer();
void pause(bool p);
Commit: 9ffc4e015138098fa21d234bb195c99a29b17380
https://github.com/scummvm/scummvm/commit/9ffc4e015138098fa21d234bb195c99a29b17380
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:47-07:00
Commit Message:
PARALLACTION: Move MidiDriver creation into MidiPlayer(_MSC) constructors
Changed paths:
engines/parallaction/parallaction_br.cpp
engines/parallaction/parallaction_ns.cpp
engines/parallaction/sound.h
engines/parallaction/sound_br.cpp
engines/parallaction/sound_ns.cpp
diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp
index 457c421..619a4f7 100644
--- a/engines/parallaction/parallaction_br.cpp
+++ b/engines/parallaction/parallaction_br.cpp
@@ -61,9 +61,7 @@ Common::Error Parallaction_br::init() {
_disk = new DosDisk_br(this);
}
_disk->setLanguage(2); // NOTE: language is now hardcoded to English. Original used command-line parameters.
- MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
- MidiDriver *driver = MidiDriver::createMidi(dev);
- _soundManI = new DosSoundMan_br(this, driver);
+ _soundManI = new DosSoundMan_br(this);
} else {
_disk = new AmigaDisk_br(this);
_disk->setLanguage(2); // NOTE: language is now hardcoded to English. Original used command-line parameters.
diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp
index c3d917a..ffac22e 100644
--- a/engines/parallaction/parallaction_ns.cpp
+++ b/engines/parallaction/parallaction_ns.cpp
@@ -166,9 +166,7 @@ Common::Error Parallaction_ns::init() {
_disk->init();
if (getPlatform() == Common::kPlatformPC) {
- MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
- MidiDriver *driver = MidiDriver::createMidi(dev);
- _soundManI = new DosSoundMan_ns(this, driver);
+ _soundManI = new DosSoundMan_ns(this);
_soundManI->setMusicVolume(ConfMan.getInt("music_volume"));
} else {
_soundManI = new AmigaSoundMan_ns(this);
diff --git a/engines/parallaction/sound.h b/engines/parallaction/sound.h
index 7b3eff3..455189d 100644
--- a/engines/parallaction/sound.h
+++ b/engines/parallaction/sound.h
@@ -140,7 +140,7 @@ class DosSoundMan_ns : public SoundMan_ns {
public:
- DosSoundMan_ns(Parallaction_ns *vm, MidiDriver *midiDriver);
+ DosSoundMan_ns(Parallaction_ns *vm);
~DosSoundMan_ns();
void playMusic();
void stopMusic();
@@ -228,7 +228,7 @@ class DosSoundMan_br : public SoundMan_br {
Audio::AudioStream *loadChannelData(const char *filename, Channel *ch, bool looping);
public:
- DosSoundMan_br(Parallaction_br *vm, MidiDriver *midiDriver);
+ DosSoundMan_br(Parallaction_br *vm);
~DosSoundMan_br();
void playMusic();
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp
index 1bc085f..9f807f5 100644
--- a/engines/parallaction/sound_br.cpp
+++ b/engines/parallaction/sound_br.cpp
@@ -204,7 +204,7 @@ MidiParser *createParser_MSC() {
class MidiPlayer_MSC : public Audio::MidiPlayer {
public:
- MidiPlayer_MSC(MidiDriver *driver);
+ MidiPlayer_MSC();
~MidiPlayer_MSC();
void play(Common::SeekableReadStream *stream);
@@ -227,9 +227,11 @@ private:
-MidiPlayer_MSC::MidiPlayer_MSC(MidiDriver *driver)
+MidiPlayer_MSC::MidiPlayer_MSC()
: _midiData(0), _paused(false) {
- _driver = driver;
+
+ MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
+ _driver = MidiDriver::createMidi(dev);
assert(_driver);
int ret = _driver->open();
@@ -333,8 +335,8 @@ void MidiPlayer_MSC::timerCallback(void *p) {
player->updateTimer();
}
-DosSoundMan_br::DosSoundMan_br(Parallaction_br *vm, MidiDriver *driver) : SoundMan_br(vm) {
- _midiPlayer = new MidiPlayer_MSC(driver);
+DosSoundMan_br::DosSoundMan_br(Parallaction_br *vm) : SoundMan_br(vm) {
+ _midiPlayer = new MidiPlayer_MSC();
assert(_midiPlayer);
}
diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp
index 8f3f0c3..239abab 100644
--- a/engines/parallaction/sound_ns.cpp
+++ b/engines/parallaction/sound_ns.cpp
@@ -42,7 +42,7 @@ namespace Parallaction {
class MidiPlayer : public Audio::MidiPlayer {
public:
- MidiPlayer(MidiDriver *driver);
+ MidiPlayer();
~MidiPlayer();
void play(Common::SeekableReadStream *stream);
@@ -57,10 +57,12 @@ private:
bool _paused;
};
-MidiPlayer::MidiPlayer(MidiDriver *driver)
+MidiPlayer::MidiPlayer()
: _midiData(0), _paused(false) {
- assert(driver);
- _driver = driver;
+
+ MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
+ _driver = MidiDriver::createMidi(dev);
+ assert(_driver);
int ret = _driver->open();
if (ret == 0) {
@@ -137,8 +139,8 @@ void MidiPlayer::timerCallback(void *p) {
player->updateTimer();
}
-DosSoundMan_ns::DosSoundMan_ns(Parallaction_ns *vm, MidiDriver *midiDriver) : SoundMan_ns(vm), _playing(false) {
- _midiPlayer = new MidiPlayer(midiDriver);
+DosSoundMan_ns::DosSoundMan_ns(Parallaction_ns *vm) : SoundMan_ns(vm), _playing(false) {
+ _midiPlayer = new MidiPlayer();
}
DosSoundMan_ns::~DosSoundMan_ns() {
Commit: 61ff5de0cfb286443e0554d83ad74ee3577c51ae
https://github.com/scummvm/scummvm/commit/61ff5de0cfb286443e0554d83ad74ee3577c51ae
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:51-07:00
Commit Message:
AUDIO: Rename 'channel' to 'ch'
Changed paths:
audio/midiplayer.cpp
audio/midiplayer.h
diff --git a/audio/midiplayer.cpp b/audio/midiplayer.cpp
index 12d03d7..d797ba2 100644
--- a/audio/midiplayer.cpp
+++ b/audio/midiplayer.cpp
@@ -75,32 +75,33 @@ void MidiPlayer::syncVolume() {
void MidiPlayer::send(uint32 b) {
- byte channel = (byte)(b & 0x0F);
+ byte ch = (byte)(b & 0x0F);
if ((b & 0xFFF0) == 0x07B0) {
// Adjust volume changes by master volume
byte volume = (byte)((b >> 16) & 0x7F);
- _channelsVolume[channel] = volume;
+ _channelsVolume[ch] = volume;
volume = volume * _masterVolume / 255;
b = (b & 0xFF00FFFF) | (volume << 16);
} else if ((b & 0xFFF0) == 0x007BB0) {
// Only respond to All Notes Off if this channel
// has currently been allocated
- if (!_channelsTable[channel])
+ if (!_channelsTable[ch])
return;
}
- sendToChannel(channel, b);
+ sendToChannel(ch, b);
}
-void MidiPlayer::sendToChannel(byte channel, uint32 b) {
- if (!_channelsTable[channel]) {
- _channelsTable[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
+void MidiPlayer::sendToChannel(byte ch, uint32 b) {
+ if (!_channelsTable[ch]) {
+ _channelsTable[ch] = (ch == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
// TODO: Some engines overload this method to insert code at this
// point which calls the channel's volume() method.
// Does this make sense, and should we maybe do it in general?
}
- if (_channelsTable[channel])
- _channelsTable[channel]->send(b);
+ if (_channelsTable[ch]) {
+ _channelsTable[ch]->send(b);
+ }
}
void MidiPlayer::metaEvent(byte type, byte *data, uint16 length) {
diff --git a/audio/midiplayer.h b/audio/midiplayer.h
index fd60d0b..7815489 100644
--- a/audio/midiplayer.h
+++ b/audio/midiplayer.h
@@ -85,7 +85,7 @@ public:
* This method is invoked by send() after suitably filtering
* the message b.
*/
- virtual void sendToChannel(byte channel, uint32 b);
+ virtual void sendToChannel(byte ch, uint32 b);
/**
* This method is invoked by metaEvent when an end-of-track
Commit: f333d93fe8985ad2b50f1ef936737cde40d926e9
https://github.com/scummvm/scummvm/commit/f333d93fe8985ad2b50f1ef936737cde40d926e9
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:52-07:00
Commit Message:
TINSEL: Remove unused TinselEngine::_musicVolume member
Changed paths:
engines/tinsel/music.cpp
engines/tinsel/music.h
engines/tinsel/tinsel.cpp
engines/tinsel/tinsel.h
diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp
index 943beb4..d53b985 100644
--- a/engines/tinsel/music.cpp
+++ b/engines/tinsel/music.cpp
@@ -405,20 +405,6 @@ MidiMusicPlayer::MidiMusicPlayer() {
_driver->setTimerCallback(this, &onTimer);
}
-
- _xmidiParser = MidiParser::createParser_XMIDI();
-}
-
-MidiMusicPlayer::~MidiMusicPlayer() {
- _driver->setTimerCallback(NULL, NULL);
- stop();
- if (_driver) {
- _driver->close();
- delete _driver;
- _driver = 0;
- }
- _xmidiParser->setMidiDriver(NULL);
- delete _xmidiParser;
}
void MidiMusicPlayer::setVolume(int volume) {
@@ -441,15 +427,9 @@ void MidiMusicPlayer::send(uint32 b) {
}
}
-void MidiMusicPlayer::onTimer(void *refCon) {
- MidiMusicPlayer *music = (MidiMusicPlayer *)refCon;
- Common::StackLock lock(music->_mutex);
-
- if (music->_isPlaying)
- music->_parser->onTimer();
-}
-
void MidiMusicPlayer::playXMIDI(byte *midiData, uint32 size, bool loop) {
+ Common::StackLock lock(_mutex);
+
if (_isPlaying)
return;
@@ -467,8 +447,8 @@ void MidiMusicPlayer::playXMIDI(byte *midiData, uint32 size, bool loop) {
// Load XMID resource data
- if (_xmidiParser->loadMusic(midiData, size)) {
- MidiParser *parser = _xmidiParser;
+ MidiParser *parser = MidiParser::createParser_XMIDI();
+ if (parser->loadMusic(midiData, size)) {
parser->setTrack(0);
parser->setMidiDriver(this);
parser->setTimerRate(getBaseTempo());
@@ -479,6 +459,8 @@ void MidiMusicPlayer::playXMIDI(byte *midiData, uint32 size, bool loop) {
_isLooping = loop;
_isPlaying = true;
+ } else {
+ delete parser;
}
}
diff --git a/engines/tinsel/music.h b/engines/tinsel/music.h
index 9436c02..af089ca 100644
--- a/engines/tinsel/music.h
+++ b/engines/tinsel/music.h
@@ -64,7 +64,6 @@ void dumpMusic();
class MidiMusicPlayer : public Audio::MidiPlayer {
public:
MidiMusicPlayer();
- ~MidiMusicPlayer();
virtual void setVolume(int volume);
@@ -80,12 +79,6 @@ public:
// The original sets the "sequence timing" to 109 Hz, whatever that
// means. The default is 120.
uint32 getBaseTempo() { return _driver ? (109 * _driver->getBaseTempo()) / 120 : 0; }
-
-protected:
-
- static void onTimer(void *data);
-
- MidiParser *_xmidiParser;
};
class PCMMusicPlayer : public Audio::AudioStream {
diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp
index ef0fe1c..1b31737 100644
--- a/engines/tinsel/tinsel.cpp
+++ b/engines/tinsel/tinsel.cpp
@@ -859,8 +859,6 @@ TinselEngine::TinselEngine(OSystem *syst, const TinselGameDescription *gameDesc)
_midiMusic = new MidiMusicPlayer();
_pcmMusic = new PCMMusicPlayer();
- _musicVolume = ConfMan.getInt("music_volume");
-
_sound = new SoundManager(this);
_bmv = new BMVPlayer();
diff --git a/engines/tinsel/tinsel.h b/engines/tinsel/tinsel.h
index 009f6fe..5c7a1cd 100644
--- a/engines/tinsel/tinsel.h
+++ b/engines/tinsel/tinsel.h
@@ -219,9 +219,6 @@ public:
RectList _clipRects;
private:
- //MidiMusicPlayer *_midiMusic;
- int _musicVolume;
-
void NextGameCycle();
void CreateConstProcesses();
void RestartGame();
Commit: db3802b02140d80e1a4e8ead91c1b7e39ee940c5
https://github.com/scummvm/scummvm/commit/db3802b02140d80e1a4e8ead91c1b7e39ee940c5
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:52-07:00
Commit Message:
AUDIO: Whitespace fix
Changed paths:
audio/midiparser.cpp
diff --git a/audio/midiparser.cpp b/audio/midiparser.cpp
index e01b8a7..a6df602 100644
--- a/audio/midiparser.cpp
+++ b/audio/midiparser.cpp
@@ -350,7 +350,7 @@ void MidiParser::hangAllActiveNotes() {
if (_next_event.command() == 0x8) {
if (temp_active[_next_event.basic.param1] & (1 << _next_event.channel())) {
hangingNote(_next_event.channel(), _next_event.basic.param1, (advance_tick - _position._last_event_tick) * _psec_per_tick, false);
- temp_active[_next_event.basic.param1] &= ~ (1 << _next_event.channel());
+ temp_active[_next_event.basic.param1] &= ~(1 << _next_event.channel());
}
} else if (_next_event.event == 0xFF && _next_event.ext.type == 0x2F) {
// warning("MidiParser::hangAllActiveNotes(): Hit End of Track with active notes left");
Commit: 7949d7c6def2df6f3d44db4f55e9d1d3a87a0412
https://github.com/scummvm/scummvm/commit/7949d7c6def2df6f3d44db4f55e9d1d3a87a0412
Author: Max Horn (max at quendi.de)
Date: 2011-03-25T06:15:53-07:00
Commit Message:
AUDIO: Move more common code to Audio::MidiPlayer
This also should fix some regressions from the previous
commits, related to MidiParser's either being leaked,
or being deleted and then used again (i.e., crashing).
I tested as many games as I had available, but further
testing of all affected engines is called for anyway.
Changed paths:
audio/midiplayer.cpp
audio/midiplayer.h
engines/agi/sound_midi.cpp
engines/agi/sound_midi.h
engines/draci/music.cpp
engines/draci/music.h
engines/hugo/sound.cpp
engines/hugo/sound.h
engines/m4/midi.cpp
engines/m4/midi.h
engines/made/music.cpp
engines/made/music.h
engines/parallaction/sound_br.cpp
engines/parallaction/sound_ns.cpp
engines/tinsel/music.cpp
engines/touche/midi.cpp
engines/touche/midi.h
diff --git a/audio/midiplayer.cpp b/audio/midiplayer.cpp
index d797ba2..1e39b99 100644
--- a/audio/midiplayer.cpp
+++ b/audio/midiplayer.cpp
@@ -33,6 +33,7 @@ namespace Audio {
MidiPlayer::MidiPlayer() :
_driver(0),
_parser(0),
+ _midiData(0),
_isLooping(false),
_isPlaying(false),
_masterVolume(0),
@@ -45,19 +46,29 @@ MidiPlayer::MidiPlayer() :
}
MidiPlayer::~MidiPlayer() {
-// TODO
+ // FIXME/TODO: In some engines, stop() was called first;
+ // in others, _driver->setTimerCallback(NULL, NULL) came first.
+ // Hopefully, this make no real difference, but we should
+ // watch out for regressions.
+ stop();
+
+ // Unhook & unload the driver
+ if (_driver) {
+ _driver->setTimerCallback(0, 0);
+ _driver->close();
+ delete _driver;
+ _driver = 0;
+ }
}
void MidiPlayer::setVolume(int volume) {
volume = CLIP(volume, 0, 255);
-
if (_masterVolume == volume)
return;
Common::StackLock lock(_mutex);
_masterVolume = volume;
-
for (int i = 0; i < kNumChannels; ++i) {
if (_channelsTable[i]) {
_channelsTable[i]->volume(_channelsVolume[i] * _masterVolume / 255);
@@ -123,8 +134,7 @@ void MidiPlayer::endOfTrack() {
stop();
}
-#if 0
-void MidiPlayer::onTimer(void *data) {
+void MidiPlayer::timerCallback(void *data) {
assert(data);
((MidiPlayer *)data)->onTimer();
}
@@ -132,20 +142,13 @@ void MidiPlayer::onTimer(void *data) {
void MidiPlayer::onTimer() {
Common::StackLock lock(_mutex);
- // FIXME: There are various alternatives for this function:
+ // TODO: Maybe we can replace _isPlaying
+ // by a simple check for "_parser != 0" ?
-#if 0
- if (_parser) {
+ if (_isPlaying && _parser) {
_parser->onTimer();
}
-#elif 0
- if (_isPlaying) {
- assert(_parser);
- _parser->onTimer();
- }
-#endif
}
-#endif
void MidiPlayer::stop() {
@@ -154,8 +157,19 @@ void MidiPlayer::stop() {
_isPlaying = false;
if (_parser) {
_parser->unloadMusic();
+
+ // FIXME/TODO: The MidiParser destructor calls allNotesOff()
+ // but unloadMusic also does. To suppress double notes-off,
+ // we reset the midi driver of _parser before deleting it.
+ // This smells very fishy, in any case.
+ _parser->setMidiDriver(0);
+
+ delete _parser;
_parser = NULL;
}
+
+ free(_midiData);
+ _midiData = 0;
}
void MidiPlayer::pause() {
diff --git a/audio/midiplayer.h b/audio/midiplayer.h
index 7815489..1bb7942 100644
--- a/audio/midiplayer.h
+++ b/audio/midiplayer.h
@@ -47,11 +47,10 @@ namespace Audio {
* should perform memory management on the MidiParser object(s) being
* used, and possibly more.
*
- * Also, care should be taken to ensure that mutex locking is done right;
- * currently, it isn't: That is, many engines have (and already had before
- * this class was introduced) various potential deadlocks hiding in their
- * MIDI code, caused by a thread trying to lock a mutex twice -- this may
- * work on some systems, but on others is a sure way towards a deadlock.
+ * Also, pause/resume handling should be unified (we provide an implementation,
+ * but several subclasses use different ones).
+ *
+ * Also, care should be taken to ensure that mutex locking is done right.
*
* @todo Document origin of this class. It is based on code shared by
* several engines (e.g. DRACI says it copied it from MADE, which took
@@ -64,6 +63,7 @@ public:
// TODO: Implement ways to actually play stuff
//virtual void play(TODO);
+
// TODO: Document these
virtual void stop();
virtual void pause();
@@ -71,19 +71,42 @@ public:
bool isPlaying() const { return _isPlaying; }
+ /**
+ * Return the currently active master volume, in the range 0-255.
+ */
int getVolume() const { return _masterVolume; }
- virtual void setVolume(int volume); // FIXME: Overloaded by Tinsel
+
+ /**
+ * Set the master volume to the specified value in the range 0-255.
+ * (values outside this range are automatically clipped).
+ * This may cause suitable MIDI events to be sent to active channels.
+ *
+ * @todo This method currently does not do anything if the new volume
+ * matches the old volume. But some engines always update the
+ * volume (Parallaction, Tinsel, Touche, ...). This is why
+ * this method is currently virtual. We really should figure
+ * which way to do it, and then make this the default, and make
+ * this method non-virtual again.
+ */
+ virtual void setVolume(int volume);
+
+ /**
+ * Update the volume according to the ConfMan's 'music_volume'
+ * setting. also respects the 'mute' setting.
+ */
void syncVolume();
+ // TODO: Document this
bool hasNativeMT32() const { return _nativeMT32; }
- // MidiDriver_BASE interface
+ // MidiDriver_BASE implementation
virtual void send(uint32 b);
virtual void metaEvent(byte type, byte *data, uint16 length);
+protected:
/**
- * This method is invoked by send() after suitably filtering
- * the message b.
+ * This method is invoked by the default send() implementation,
+ * after suitably filtering the message b.
*/
virtual void sendToChannel(byte ch, uint32 b);
@@ -96,28 +119,46 @@ public:
*/
virtual void endOfTrack();
-protected:
-
-#if 0
- // TODO: Start to make use of these, once we figured
- // out the right way :)
- static void onTimer(void *data);
+ // TODO: Document this
virtual void onTimer();
-#endif
+
+ static void timerCallback(void *data);
enum {
+ /**
+ * The number of MIDI channels supported.
+ */
kNumChannels = 16
};
Common::Mutex _mutex;
MidiDriver *_driver;
+
+ /**
+ * A MidiParser instances, to be created by methods of a MidiPlayer
+ * subclass.
+ * @note The stop() method (and hence the destructor) invoke the
+ * unloadMusic() method of _parser and then delete it.
+ */
MidiParser *_parser;
+ /**
+ * This is an (optional) pointer to a malloc'ed buffer containing
+ * MIDI data used by _parser. The stop() method (and hence the
+ * destructor) will free this if set.
+ * Subclasses of this class may use _midiData, but don't have to
+ */
+ byte *_midiData;
+
MidiChannel *_channelsTable[kNumChannels];
uint8 _channelsVolume[kNumChannels];
bool _isLooping;
bool _isPlaying;
+
+ /**
+ * The master volume, in the range 0-255.
+ */
int _masterVolume; // FIXME: byte or int ?
bool _nativeMT32;
diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp
index 2c6a189..ff23a70 100644
--- a/engines/agi/sound_midi.cpp
+++ b/engines/agi/sound_midi.cpp
@@ -90,24 +90,11 @@ SoundGenMIDI::SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, p
else
_driver->sendGMReset();
- _driver->setTimerCallback(this, &onTimer);
+ // FIXME: We need to cast "this" here due to the effects of
+ // multiple inheritance. This hack can go away once this
+ // setTimerCallback() has been moved inside Audio::MidiPlayer code.
+ _driver->setTimerCallback(static_cast<Audio::MidiPlayer *>(this), &timerCallback);
}
-
- _smfParser = MidiParser::createParser_SMF();
- _midiMusicData = NULL;
-}
-
-SoundGenMIDI::~SoundGenMIDI() {
- _driver->setTimerCallback(NULL, NULL);
- stop();
- if (_driver) {
- _driver->close();
- delete _driver;
- _driver = 0;
- }
- _smfParser->setMidiDriver(NULL);
- delete _smfParser;
- delete[] _midiMusicData;
}
void SoundGenMIDI::send(uint32 b) {
@@ -136,14 +123,6 @@ void SoundGenMIDI::endOfTrack() {
_vm->_sound->soundIsFinished();
}
-void SoundGenMIDI::onTimer(void *refCon) {
- SoundGenMIDI *music = (SoundGenMIDI *)refCon;
- Common::StackLock lock(music->_mutex);
-
- if (music->_parser)
- music->_parser->onTimer();
-}
-
void SoundGenMIDI::play(int resnum) {
MIDISound *track;
@@ -154,10 +133,10 @@ void SoundGenMIDI::play(int resnum) {
track = (MIDISound *)_vm->_game.sounds[resnum];
// Convert AGI Sound data to MIDI
- int midiMusicSize = convertSND2MIDI(track->_data, &_midiMusicData);
+ int midiMusicSize = convertSND2MIDI(track->_data, &_midiData);
- if (_smfParser->loadMusic(_midiMusicData, midiMusicSize)) {
- MidiParser *parser = _smfParser;
+ MidiParser *parser = MidiParser::createParser_SMF();
+ if (parser->loadMusic(_midiData, midiMusicSize)) {
parser->setTrack(0);
parser->setMidiDriver(this);
parser->setTimerRate(_driver->getBaseTempo());
@@ -168,6 +147,8 @@ void SoundGenMIDI::play(int resnum) {
syncVolume();
_isPlaying = true;
+ } else {
+ delete parser;
}
}
diff --git a/engines/agi/sound_midi.h b/engines/agi/sound_midi.h
index 9551673..5733358 100644
--- a/engines/agi/sound_midi.h
+++ b/engines/agi/sound_midi.h
@@ -28,6 +28,8 @@
#ifndef AGI_SOUND_MIDI_H
#define AGI_SOUND_MIDI_H
+#include "agi/sound.h"
+
#include "audio/midiplayer.h"
namespace Agi {
@@ -47,13 +49,12 @@ protected:
class SoundGenMIDI : public SoundGen, public Audio::MidiPlayer {
public:
SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer);
- ~SoundGenMIDI();
void play(int resnum);
+ // We must overload stop() here to implement the pure virtual
+ // stop() method of the SoundGen class.
void stop() { Audio::MidiPlayer::stop(); }
- void setGM(bool isGM) { _isGM = isGM; }
-
// MidiDriver_BASE interface implementation
virtual void send(uint32 b);
@@ -62,14 +63,8 @@ public:
virtual void endOfTrack();
private:
-
- static void onTimer(void *data);
-
- MidiParser *_smfParser;
bool _isGM;
- byte *_midiMusicData;
-
SoundMgr *_manager;
};
diff --git a/engines/draci/music.cpp b/engines/draci/music.cpp
index 77f5154..242e58e 100644
--- a/engines/draci/music.cpp
+++ b/engines/draci/music.cpp
@@ -47,9 +47,6 @@ MusicPlayer::MusicPlayer(const char *pathMask) : _pathMask(pathMask), _isGM(fals
if (_nativeMT32)
_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
- _smfParser = MidiParser::createParser_SMF();
- _midiMusicData = NULL;
-
int ret = _driver->open();
if (ret == 0) {
if (_nativeMT32)
@@ -61,21 +58,8 @@ MusicPlayer::MusicPlayer(const char *pathMask) : _pathMask(pathMask), _isGM(fals
// interface for such an operation is supported for AdLib. Maybe for
// this card, setting instruments is necessary.
- _driver->setTimerCallback(this, &onTimer);
- }
-}
-
-MusicPlayer::~MusicPlayer() {
- _driver->setTimerCallback(NULL, NULL);
- stop();
- if (_driver) {
- _driver->close();
- delete _driver;
- _driver = 0;
+ _driver->setTimerCallback(this, &timerCallback);
}
- _smfParser->setMidiDriver(NULL);
- delete _smfParser;
- delete[] _midiMusicData;
}
void MusicPlayer::sendToChannel(byte channel, uint32 b) {
@@ -91,15 +75,9 @@ void MusicPlayer::sendToChannel(byte channel, uint32 b) {
_channelsTable[channel]->send(b);
}
-void MusicPlayer::onTimer(void *refCon) {
- MusicPlayer *music = (MusicPlayer *)refCon;
- Common::StackLock lock(music->_mutex);
-
- if (music->_parser)
- music->_parser->onTimer();
-}
-
void MusicPlayer::playSMF(int track, bool loop) {
+ Common::StackLock lock(_mutex);
+
if (_isPlaying && track == _track) {
debugC(2, kDraciSoundDebugLevel, "Already plaing track %d", track);
return;
@@ -109,24 +87,23 @@ void MusicPlayer::playSMF(int track, bool loop) {
_isGM = true;
-
// Load MIDI resource data
Common::File musicFile;
char musicFileName[40];
- sprintf(musicFileName, _pathMask.c_str(), track);
+ snprintf(musicFileName, sizeof(musicFileName), _pathMask.c_str(), track);
musicFile.open(musicFileName);
if (!musicFile.isOpen()) {
debugC(2, kDraciSoundDebugLevel, "Cannot open track %d", track);
return;
}
int midiMusicSize = musicFile.size();
- delete[] _midiMusicData;
- _midiMusicData = new byte[midiMusicSize];
- musicFile.read(_midiMusicData, midiMusicSize);
+ free(_midiData);
+ _midiData = (byte *)malloc(midiMusicSize);
+ musicFile.read(_midiData, midiMusicSize);
musicFile.close();
- if (_smfParser->loadMusic(_midiMusicData, midiMusicSize)) {
- MidiParser *parser = _smfParser;
+ MidiParser *parser = MidiParser::createParser_SMF();
+ if (parser->loadMusic(_midiData, midiMusicSize)) {
parser->setTrack(0);
parser->setMidiDriver(this);
parser->setTimerRate(_driver->getBaseTempo());
@@ -142,6 +119,7 @@ void MusicPlayer::playSMF(int track, bool loop) {
debugC(2, kDraciSoundDebugLevel, "Playing track %d", track);
} else {
debugC(2, kDraciSoundDebugLevel, "Cannot play track %d", track);
+ delete parser;
}
}
diff --git a/engines/draci/music.h b/engines/draci/music.h
index a1d0aaa..c022807 100644
--- a/engines/draci/music.h
+++ b/engines/draci/music.h
@@ -37,27 +37,18 @@ namespace Draci {
class MusicPlayer : public Audio::MidiPlayer {
public:
MusicPlayer(const char *pathMask);
- ~MusicPlayer();
void playSMF(int track, bool loop);
void stop();
- void setGM(bool isGM) { _isGM = isGM; }
-
// Overload Audio::MidiPlayer method
virtual void sendToChannel(byte channel, uint32 b);
protected:
-
- static void onTimer(void *data);
-
- MidiParser *_smfParser;
Common::String _pathMask;
bool _isGM;
int _track;
-
- byte *_midiMusicData;
};
} // End of namespace Draci
diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp
index f0a0882..24359a2 100644
--- a/engines/hugo/sound.cpp
+++ b/engines/hugo/sound.cpp
@@ -47,61 +47,46 @@
namespace Hugo {
-MidiPlayer::MidiPlayer()
- : _midiData(0) {
-
+MidiPlayer::MidiPlayer() {
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
_driver = MidiDriver::createMidi(dev);
assert(_driver);
_paused = false;
-}
-MidiPlayer::~MidiPlayer() {
- stop();
- Common::StackLock lock(_mutex);
- _driver->setTimerCallback(0, 0);
- _driver->close();
- delete _driver;
- _driver = 0;
- if (_parser)
- _parser->setMidiDriver(0);
- delete _parser;
+ int ret = _driver->open();
+ if (ret == 0) {
+ _driver->sendGMReset();
+
+ _driver->setTimerCallback(this, &timerCallback);
+ }
}
void MidiPlayer::play(uint8 *stream, uint16 size) {
debugC(3, kDebugMusic, "MidiPlayer::play");
- if (!stream) {
- stop();
- return;
- }
+
+ Common::StackLock lock(_mutex);
stop();
+ if (!stream)
+ return;
+
_midiData = (uint8 *)malloc(size);
if (_midiData) {
memcpy(_midiData, stream, size);
- Common::StackLock lock(_mutex);
syncVolume(); // FIXME: syncVolume calls setVolume which in turn also locks the mutex! ugh
+
+ _parser = MidiParser::createParser_SMF();
_parser->loadMusic(_midiData, size);
_parser->setTrack(0);
+ _parser->setMidiDriver(this);
+ _parser->setTimerRate(_driver->getBaseTempo());
_isLooping = false;
_isPlaying = true;
}
}
-void MidiPlayer::stop() {
- debugC(3, kDebugMusic, "MidiPlayer::stop");
-
- Common::StackLock lock(_mutex);
- if (_isPlaying) {
- _isPlaying = false;
- _parser->unloadMusic();
- free(_midiData);
- _midiData = 0;
- }
-}
-
void MidiPlayer::pause(bool p) {
_paused = p;
@@ -112,34 +97,14 @@ void MidiPlayer::pause(bool p) {
}
}
-void MidiPlayer::updateTimer() {
- if (_paused) {
- return;
- }
-
+void MidiPlayer::onTimer() {
Common::StackLock lock(_mutex);
- if (_isPlaying) {
+
+ if (!_paused && _isPlaying && _parser) {
_parser->onTimer();
}
}
-int MidiPlayer::open() {
- if (!_driver)
- return 255;
- int ret = _driver->open();
- if (ret)
- return ret;
-
- _driver->sendGMReset();
-
- _parser = MidiParser::createParser_SMF();
- _parser->setMidiDriver(this);
- _parser->setTimerRate(_driver->getBaseTempo());
- _driver->setTimerCallback(this, &timerCallback);
-
- return 0;
-}
-
void MidiPlayer::sendToChannel(byte channel, uint32 b) {
if (!_channelsTable[channel]) {
_channelsTable[channel] = (channel == 9) ? _driver->getPercussionChannel() : _driver->allocateChannel();
@@ -154,12 +119,6 @@ void MidiPlayer::sendToChannel(byte channel, uint32 b) {
}
-void MidiPlayer::timerCallback(void *p) {
- MidiPlayer *player = (MidiPlayer *)p;
-
- player->updateTimer();
-}
-
SoundHandler::SoundHandler(HugoEngine *vm) : _vm(vm) {
_midiPlayer = new MidiPlayer();
_speakerStream = new Audio::PCSpeaker(_vm->_mixer->getOutputRate());
@@ -263,7 +222,7 @@ void SoundHandler::playSound(int16 sound, const byte priority) {
* Initialize for MCI sound and midi
*/
void SoundHandler::initSound() {
- _midiPlayer->open();
+ //_midiPlayer->open();
}
void SoundHandler::syncVolume() {
diff --git a/engines/hugo/sound.h b/engines/hugo/sound.h
index f3a141a..d5f5170 100644
--- a/engines/hugo/sound.h
+++ b/engines/hugo/sound.h
@@ -42,23 +42,17 @@ namespace Hugo {
class MidiPlayer : public Audio::MidiPlayer {
public:
MidiPlayer();
- ~MidiPlayer();
void pause(bool p);
void play(uint8 *stream, uint16 size);
- void stop();
- void updateTimer();
- int open();
uint32 getBaseTempo();
// Overload Audio::MidiPlayer method
virtual void sendToChannel(byte channel, uint32 b);
+ virtual void onTimer();
private:
- static void timerCallback(void *p);
-
- uint8 *_midiData;
bool _paused;
};
diff --git a/engines/m4/midi.cpp b/engines/m4/midi.cpp
index b982fc8..d58b92b 100644
--- a/engines/m4/midi.cpp
+++ b/engines/m4/midi.cpp
@@ -34,7 +34,7 @@
namespace M4 {
-MidiPlayer::MidiPlayer(MadsM4Engine *vm) : _vm(vm), _midiData(NULL), _isGM(false) {
+MidiPlayer::MidiPlayer(MadsM4Engine *vm) : _vm(vm), _isGM(false) {
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
_nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32"));
@@ -44,26 +44,10 @@ MidiPlayer::MidiPlayer(MadsM4Engine *vm) : _vm(vm), _midiData(NULL), _isGM(false
if (_nativeMT32)
_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
- _parser = MidiParser::createParser_SMF();
- _parser->setMidiDriver(this);
- _parser->setTimerRate(_driver->getBaseTempo());
-
int ret = _driver->open();
- if (ret == 0)
- _driver->setTimerCallback(this, &onTimer);
-}
-
-MidiPlayer::~MidiPlayer() {
- _driver->setTimerCallback(NULL, NULL);
- _parser->setMidiDriver(NULL);
- stop();
- if (_driver) {
- _driver->close();
- delete _driver;
+ if (ret == 0) {
+ _driver->setTimerCallback(this, &timerCallback);
}
- _driver = 0;
- delete _parser;
- free(_midiData);
}
void MidiPlayer::send(uint32 b) {
@@ -74,15 +58,9 @@ void MidiPlayer::send(uint32 b) {
Audio::MidiPlayer::send(b);
}
-void MidiPlayer::onTimer(void *refCon) {
- MidiPlayer *midi = (MidiPlayer *)refCon;
- Common::StackLock lock(midi->_mutex);
-
- if (midi->_isPlaying)
- midi->_parser->onTimer();
-}
-
void MidiPlayer::playMusic(const char *name, int32 vol, bool loop, int32 trigger, int32 scene) {
+ Common::StackLock lock(_mutex);
+
stop();
char fullname[144];
@@ -99,11 +77,10 @@ void MidiPlayer::playMusic(const char *name, int32 vol, bool loop, int32 trigger
_vm->res()->purge();
if (_midiData) {
- /*
- FILE *out = fopen("music.mid", "wb");
- fwrite(_midiData, smfSize, 1, out);
- fclose(out);
- */
+ _parser = MidiParser::createParser_SMF();
+ _parser->setMidiDriver(this);
+ _parser->setTimerRate(_driver->getBaseTempo());
+
_parser->loadMusic(_midiData, smfSize);
_parser->property(MidiParser::mpAutoLoop, loop);
}
@@ -113,20 +90,6 @@ void MidiPlayer::playMusic(const char *name, int32 vol, bool loop, int32 trigger
_isPlaying = true;
}
-void MidiPlayer::stop() {
- Common::StackLock lock(_mutex);
-
- _isPlaying = false;
- if (_parser) {
- _parser->unloadMusic();
- }
-
- if (_midiData) {
- free(_midiData);
- _midiData = NULL;
- }
-}
-
// This function will convert HMP music into type 1 SMF, which our SMF parser
// will be able to handle. It is based on Hans de Goede's HMP 2 MIDI file
// converter, which in turn is "based on the conversion algorithms found in
diff --git a/engines/m4/midi.h b/engines/m4/midi.h
index e1f92cd..a544fb7 100644
--- a/engines/m4/midi.h
+++ b/engines/m4/midi.h
@@ -35,10 +35,8 @@ namespace M4 {
class MidiPlayer : public Audio::MidiPlayer {
public:
MidiPlayer(MadsM4Engine *vm);
- ~MidiPlayer();
void playMusic(const char *name, int32 vol, bool loop, int32 trigger, int32 scene);
- virtual void stop();
void setGM(bool isGM) { _isGM = isGM; }
@@ -46,10 +44,7 @@ public:
virtual void send(uint32 b);
protected:
- static void onTimer(void *data);
-
MadsM4Engine *_vm;
- byte *_midiData;
bool _isGM;
diff --git a/engines/made/music.cpp b/engines/made/music.cpp
index 054f812..c8b13ba 100644
--- a/engines/made/music.cpp
+++ b/engines/made/music.cpp
@@ -47,9 +47,6 @@ MusicPlayer::MusicPlayer() : _isGM(false) {
if (_nativeMT32)
_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
- _xmidiParser = MidiParser::createParser_XMIDI();
- _smfParser = MidiParser::createParser_SMF();
-
int ret = _driver->open();
if (ret == 0) {
if (_nativeMT32)
@@ -57,22 +54,8 @@ MusicPlayer::MusicPlayer() : _isGM(false) {
else
_driver->sendGMReset();
- _driver->setTimerCallback(this, &onTimer);
- }
-}
-
-MusicPlayer::~MusicPlayer() {
- _driver->setTimerCallback(NULL, NULL);
- stop();
- if (_driver) {
- _driver->close();
- delete _driver;
- _driver = 0;
+ _driver->setTimerCallback(this, &timerCallback);
}
- _xmidiParser->setMidiDriver(NULL);
- _smfParser->setMidiDriver(NULL);
- delete _xmidiParser;
- delete _smfParser;
}
void MusicPlayer::send(uint32 b) {
@@ -83,15 +66,9 @@ void MusicPlayer::send(uint32 b) {
Audio::MidiPlayer::send(b);
}
-void MusicPlayer::onTimer(void *refCon) {
- MusicPlayer *music = (MusicPlayer *)refCon;
- Common::StackLock lock(music->_mutex);
-
- if (music->_isPlaying)
- music->_parser->onTimer();
-}
-
void MusicPlayer::playXMIDI(GenericResource *midiResource, MusicFlags flags) {
+ Common::StackLock lock(_mutex);
+
if (_isPlaying)
return;
@@ -101,8 +78,8 @@ void MusicPlayer::playXMIDI(GenericResource *midiResource, MusicFlags flags) {
_isGM = true;
- if (_xmidiParser->loadMusic(midiResource->getData(), midiResource->getSize())) {
- MidiParser *parser = _xmidiParser;
+ MidiParser *parser = MidiParser::createParser_XMIDI();
+ if (parser->loadMusic(midiResource->getData(), midiResource->getSize())) {
parser->setTrack(0);
parser->setMidiDriver(this);
parser->setTimerRate(_driver->getBaseTempo());
@@ -115,10 +92,14 @@ void MusicPlayer::playXMIDI(GenericResource *midiResource, MusicFlags flags) {
_isLooping = flags & MUSIC_LOOP;
_isPlaying = true;
+ } else {
+ delete parser;
}
}
void MusicPlayer::playSMF(GenericResource *midiResource, MusicFlags flags) {
+ Common::StackLock lock(_mutex);
+
if (_isPlaying)
return;
@@ -128,8 +109,8 @@ void MusicPlayer::playSMF(GenericResource *midiResource, MusicFlags flags) {
_isGM = true;
- if (_smfParser->loadMusic(midiResource->getData(), midiResource->getSize())) {
- MidiParser *parser = _smfParser;
+ MidiParser *parser = MidiParser::createParser_SMF();
+ if (parser->loadMusic(midiResource->getData(), midiResource->getSize())) {
parser->setTrack(0);
parser->setMidiDriver(this);
parser->setTimerRate(_driver->getBaseTempo());
@@ -141,6 +122,8 @@ void MusicPlayer::playSMF(GenericResource *midiResource, MusicFlags flags) {
_isLooping = flags & MUSIC_LOOP;
_isPlaying = true;
+ } else {
+ delete parser;
}
}
diff --git a/engines/made/music.h b/engines/made/music.h
index 8925440..f8f70cd 100644
--- a/engines/made/music.h
+++ b/engines/made/music.h
@@ -44,7 +44,6 @@ enum MusicFlags {
class MusicPlayer : public Audio::MidiPlayer {
public:
MusicPlayer();
- ~MusicPlayer();
void playXMIDI(GenericResource *midiResource, MusicFlags flags = MUSIC_NORMAL);
void playSMF(GenericResource *midiResource, MusicFlags flags = MUSIC_NORMAL);
@@ -52,16 +51,10 @@ public:
void pause();
void resume();
- void setGM(bool isGM) { _isGM = isGM; }
-
// MidiDriver_BASE interface implementation
virtual void send(uint32 b);
protected:
-
- static void onTimer(void *data);
-
- MidiParser *_xmidiParser, *_smfParser;
bool _isGM;
};
diff --git a/engines/parallaction/sound_br.cpp b/engines/parallaction/sound_br.cpp
index 9f807f5..ee53f96 100644
--- a/engines/parallaction/sound_br.cpp
+++ b/engines/parallaction/sound_br.cpp
@@ -205,30 +205,25 @@ class MidiPlayer_MSC : public Audio::MidiPlayer {
public:
MidiPlayer_MSC();
- ~MidiPlayer_MSC();
void play(Common::SeekableReadStream *stream);
- void stop();
- void pause(bool p);
- void updateTimer();
- void setVolume(int volume);
+ virtual void pause(bool p);
+ virtual void setVolume(int volume);
+ virtual void onTimer();
// MidiDriver_BASE interface
virtual void send(uint32 b);
-private:
- static void timerCallback(void *p);
+private:
void setVolumeInternal(int volume);
-
- uint8 *_midiData;
bool _paused;
};
MidiPlayer_MSC::MidiPlayer_MSC()
- : _midiData(0), _paused(false) {
+ : _paused(false) {
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
_driver = MidiDriver::createMidi(dev);
@@ -236,64 +231,42 @@ MidiPlayer_MSC::MidiPlayer_MSC()
int ret = _driver->open();
if (ret == 0) {
- _parser = createParser_MSC();
- _parser->setMidiDriver(this);
- _parser->setTimerRate(_driver->getBaseTempo());
_driver->setTimerCallback(this, &timerCallback);
}
}
-MidiPlayer_MSC::~MidiPlayer_MSC() {
- stop();
-
+void MidiPlayer_MSC::play(Common::SeekableReadStream *stream) {
Common::StackLock lock(_mutex);
- _driver->setTimerCallback(NULL, NULL);
- _driver->close();
- delete _driver;
- _driver = 0;
- _parser->setMidiDriver(NULL);
- delete _parser;
-}
-void MidiPlayer_MSC::play(Common::SeekableReadStream *stream) {
- if (!stream) {
- stop();
+ stop();
+ if (!stream)
return;
- }
- stop();
int size = stream->size();
_midiData = (uint8 *)malloc(size);
if (_midiData) {
stream->read(_midiData, size);
delete stream;
- Common::StackLock lock(_mutex);
+ _parser = createParser_MSC();
_parser->loadMusic(_midiData, size);
_parser->setTrack(0);
+ _parser->setMidiDriver(this);
+ _parser->setTimerRate(_driver->getBaseTempo());
_isLooping = true;
_isPlaying = true;
}
}
-void MidiPlayer_MSC::stop() {
- Audio::MidiPlayer::stop();
- free(_midiData);
- _midiData = 0;
-}
-
void MidiPlayer_MSC::pause(bool p) {
_paused = p;
setVolumeInternal(_paused ? 0 : _masterVolume);
}
-void MidiPlayer_MSC::updateTimer() {
- if (_paused) {
- return;
- }
-
+void MidiPlayer_MSC::onTimer() {
Common::StackLock lock(_mutex);
- if (_isPlaying) {
+
+ if (!_paused && _isPlaying && _parser) {
_parser->onTimer();
}
}
@@ -329,12 +302,6 @@ void MidiPlayer_MSC::send(uint32 b) {
sendToChannel(ch, b);
}
-void MidiPlayer_MSC::timerCallback(void *p) {
- MidiPlayer_MSC *player = (MidiPlayer_MSC *)p;
-
- player->updateTimer();
-}
-
DosSoundMan_br::DosSoundMan_br(Parallaction_br *vm) : SoundMan_br(vm) {
_midiPlayer = new MidiPlayer_MSC();
assert(_midiPlayer);
diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp
index 239abab..ba81314 100644
--- a/engines/parallaction/sound_ns.cpp
+++ b/engines/parallaction/sound_ns.cpp
@@ -43,22 +43,17 @@ class MidiPlayer : public Audio::MidiPlayer {
public:
MidiPlayer();
- ~MidiPlayer();
void play(Common::SeekableReadStream *stream);
- void stop();
void pause(bool p);
- void updateTimer();
+ virtual void onTimer();
private:
- static void timerCallback(void *p);
-
- uint8 *_midiData;
bool _paused;
};
MidiPlayer::MidiPlayer()
- : _midiData(0), _paused(false) {
+ : _paused(false) {
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
_driver = MidiDriver::createMidi(dev);
@@ -66,52 +61,33 @@ MidiPlayer::MidiPlayer()
int ret = _driver->open();
if (ret == 0) {
- _parser = MidiParser::createParser_SMF();
- _parser->setMidiDriver(this);
- _parser->setTimerRate(_driver->getBaseTempo());
_driver->setTimerCallback(this, &timerCallback);
}
}
-MidiPlayer::~MidiPlayer() {
- stop();
-
+void MidiPlayer::play(Common::SeekableReadStream *stream) {
Common::StackLock lock(_mutex);
- _driver->setTimerCallback(NULL, NULL);
- _driver->close();
- delete _driver;
- _driver = 0;
- _parser->setMidiDriver(NULL);
- delete _parser;
-}
-void MidiPlayer::play(Common::SeekableReadStream *stream) {
- if (!stream) {
- stop();
+ stop();
+ if (!stream)
return;
- }
int size = stream->size();
-
_midiData = (uint8 *)malloc(size);
if (_midiData) {
stream->read(_midiData, size);
delete stream;
- Common::StackLock lock(_mutex);
+ _parser = MidiParser::createParser_SMF();
_parser->loadMusic(_midiData, size);
_parser->setTrack(0);
+ _parser->setMidiDriver(this);
+ _parser->setTimerRate(_driver->getBaseTempo());
_isLooping = true;
_isPlaying = true;
}
}
-void MidiPlayer::stop() {
- Audio::MidiPlayer::stop();
- free(_midiData);
- _midiData = 0;
-}
-
void MidiPlayer::pause(bool p) {
_paused = p;
@@ -122,23 +98,14 @@ void MidiPlayer::pause(bool p) {
}
}
-void MidiPlayer::updateTimer() {
- if (_paused) {
- return;
- }
-
+void MidiPlayer::onTimer() {
Common::StackLock lock(_mutex);
- if (_isPlaying) {
+
+ if (!_paused && _isPlaying && _parser) {
_parser->onTimer();
}
}
-void MidiPlayer::timerCallback(void *p) {
- MidiPlayer *player = (MidiPlayer *)p;
-
- player->updateTimer();
-}
-
DosSoundMan_ns::DosSoundMan_ns(Parallaction_ns *vm) : SoundMan_ns(vm), _playing(false) {
_midiPlayer = new MidiPlayer();
}
diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp
index d53b985..3b9833b 100644
--- a/engines/tinsel/music.cpp
+++ b/engines/tinsel/music.cpp
@@ -388,22 +388,22 @@ void DeleteMidiBuffer() {
MidiMusicPlayer::MidiMusicPlayer() {
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
- bool native_mt32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32"));
+ _nativeMT32 = ((MidiDriver::getMusicType(dev) == MT_MT32) || ConfMan.getBool("native_mt32"));
//bool adlib = (MidiDriver::getMusicType(dev) == MT_ADLIB);
_driver = MidiDriver::createMidi(dev);
assert(_driver);
- if (native_mt32)
+ if (_nativeMT32)
_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
int ret = _driver->open();
if (ret == 0) {
- if (native_mt32)
+ if (_nativeMT32)
_driver->sendMT32Reset();
else
_driver->sendGMReset();
- _driver->setTimerCallback(this, &onTimer);
+ _driver->setTimerCallback(this, &timerCallback);
}
}
diff --git a/engines/touche/midi.cpp b/engines/touche/midi.cpp
index bdf5788..c89375d 100644
--- a/engines/touche/midi.cpp
+++ b/engines/touche/midi.cpp
@@ -44,8 +44,7 @@ static const uint8 _gmToRol[256] = {
};
-MidiPlayer::MidiPlayer()
- : _midiData(0) {
+MidiPlayer::MidiPlayer() {
// FIXME: Necessary?
memset(_channelsVolume, 0, sizeof(_channelsVolume));
@@ -55,9 +54,6 @@ MidiPlayer::MidiPlayer()
_driver = MidiDriver::createMidi(dev);
int ret = _driver->open();
if (ret == 0) {
- _parser = MidiParser::createParser_SMF();
- _parser->setMidiDriver(this);
- _parser->setTimerRate(_driver->getBaseTempo());
_driver->setTimerCallback(this, &timerCallback);
if (_nativeMT32)
@@ -67,25 +63,18 @@ MidiPlayer::MidiPlayer()
}
}
-MidiPlayer::~MidiPlayer() {
- stop();
-
+void MidiPlayer::play(Common::ReadStream &stream, int size, bool loop) {
Common::StackLock lock(_mutex);
- _driver->setTimerCallback(NULL, NULL);
- _driver->close();
- delete _driver;
- _driver = 0;
- _parser->setMidiDriver(NULL);
- delete _parser;
-}
-void MidiPlayer::play(Common::ReadStream &stream, int size, bool loop) {
stop();
- _midiData = (uint8 *)malloc(size);
+ _midiData = (byte *)malloc(size);
if (_midiData) {
stream.read(_midiData, size);
- Common::StackLock lock(_mutex);
+ _parser = MidiParser::createParser_SMF();
+ _parser->setMidiDriver(this);
+ _parser->setTimerRate(_driver->getBaseTempo());
+
_parser->loadMusic(_midiData, size);
_parser->setTrack(0);
_isLooping = loop;
@@ -93,19 +82,6 @@ void MidiPlayer::play(Common::ReadStream &stream, int size, bool loop) {
}
}
-void MidiPlayer::stop() {
- Audio::MidiPlayer::stop();
- free(_midiData);
- _midiData = 0;
-}
-
-void MidiPlayer::updateTimer() {
- Common::StackLock lock(_mutex);
- if (_isPlaying) {
- _parser->onTimer();
- }
-}
-
void MidiPlayer::adjustVolume(int diff) {
setVolume(_masterVolume + diff);
}
@@ -135,9 +111,4 @@ void MidiPlayer::send(uint32 b) {
Audio::MidiPlayer::send(b);
}
-void MidiPlayer::timerCallback(void *p) {
- MidiPlayer *player = (MidiPlayer *)p;
- player->updateTimer();
-}
-
} // Touche namespace
diff --git a/engines/touche/midi.h b/engines/touche/midi.h
index 8f2f850..f0f55e6 100644
--- a/engines/touche/midi.h
+++ b/engines/touche/midi.h
@@ -42,22 +42,13 @@ namespace Touche {
class MidiPlayer : public Audio::MidiPlayer {
public:
MidiPlayer();
- ~MidiPlayer();
void play(Common::ReadStream &stream, int size, bool loop = false);
- void stop();
- void updateTimer();
void adjustVolume(int diff);
void setVolume(int volume);
// MidiDriver_BASE interface
virtual void send(uint32 b);
-
-private:
-
- static void timerCallback(void *p);
-
- uint8 *_midiData;
};
} // namespace Touche
More information about the Scummvm-git-logs
mailing list