AUDIO: Change several fake MidiDrivers to MidiDriver_BASE subclasses

Many engines follow the advice in audio/midiparser.h and create a
"pseudo-MidiDriver" subclass. But MidiParser really only needs a tiny
subset of the MidiDriver capabilities, namely those found in
MidiDriver_BASE. So we try to subclass from that whenever possible; this
allows us to remove many stub methods, and enables further future
simplifications.
This commit is contained in:
Max Horn 2011-03-23 15:23:26 +01:00
parent c70c8864f1
commit 29847ea42d
35 changed files with 45 additions and 255 deletions

View File

@ -72,7 +72,7 @@ MIDISound::MIDISound(uint8 *data, uint32 len, int resnum, SoundMgr &manager) : A
} }
SoundGenMIDI::SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer), _parser(0), _isPlaying(false), _passThrough(false), _isGM(false) { SoundGenMIDI::SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer) : SoundGen(vm, pMixer), _parser(0), _isPlaying(false), _passThrough(false), _isGM(false) {
DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB); MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB);
_driver = MidiDriver::createMidi(dev); _driver = MidiDriver::createMidi(dev);
if (ConfMan.getBool("native_mt32") || MidiDriver::getMusicType(dev) == MT_MT32) { if (ConfMan.getBool("native_mt32") || MidiDriver::getMusicType(dev) == MT_MT32) {
@ -138,10 +138,6 @@ int SoundGenMIDI::open() {
return 0; return 0;
} }
bool SoundGenMIDI::isOpen() const {
return _driver && _driver->isOpen();
}
void SoundGenMIDI::close() { void SoundGenMIDI::close() {
stop(); stop();
if (_driver) if (_driver)
@ -221,7 +217,7 @@ void SoundGenMIDI::play(int resnum) {
MidiParser *parser = _smfParser; MidiParser *parser = _smfParser;
parser->setTrack(0); parser->setTrack(0);
parser->setMidiDriver(this); parser->setMidiDriver(this);
parser->setTimerRate(getBaseTempo()); parser->setTimerRate(_driver->getBaseTempo());
parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1); parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1);
_parser = parser; _parser = parser;

View File

@ -46,7 +46,7 @@ protected:
uint16 _type; ///< Sound resource type uint16 _type; ///< Sound resource type
}; };
class SoundGenMIDI : public SoundGen, public MidiDriver { class SoundGenMIDI : public SoundGen, public MidiDriver_BASE {
public: public:
SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer); SoundGenMIDI(AgiEngine *vm, Audio::Mixer *pMixer);
~SoundGenMIDI(); ~SoundGenMIDI();
@ -72,27 +72,19 @@ public:
// MidiDriver interface implementation // MidiDriver interface implementation
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
// Channel allocation functions
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
MidiParser *_parser;
Common::Mutex _mutex;
private: private:
static void onTimer(void *data); static void onTimer(void *data);
void setChannelVolume(int channel); void setChannelVolume(int channel);
MidiParser *_parser;
Common::Mutex _mutex;
MidiChannel *_channel[16]; MidiChannel *_channel[16];
MidiDriver *_driver; MidiDriver *_driver;
MidiParser *_smfParser; MidiParser *_smfParser;

View File

@ -571,7 +571,7 @@ Common::Error AGOSEngine::init() {
int ret = _midi.open(); int ret = _midi.open();
if (ret) if (ret)
warning("MIDI Player init failed: \"%s\"", _midi.getErrorName (ret)); warning("MIDI Player init failed: \"%s\"", MidiDriver::getErrorName (ret));
_midi.setVolume(ConfMan.getInt("music_volume"), ConfMan.getInt("sfx_volume")); _midi.setVolume(ConfMan.getInt("music_volume"), ConfMan.getInt("sfx_volume"));

View File

@ -84,10 +84,6 @@ int MidiPlayer::open() {
return 0; return 0;
} }
bool MidiPlayer::isOpen() const {
return _driver && _driver->isOpen();
}
void MidiPlayer::close() { void MidiPlayer::close() {
stop(); stop();
// _system->lockMutex(_mutex); // _system->lockMutex(_mutex);

View File

@ -55,7 +55,7 @@ struct MusicInfo {
} }
}; };
class MidiPlayer : public MidiDriver { class MidiPlayer : public MidiDriver_BASE {
protected: protected:
Common::Mutex _mutex; Common::Mutex _mutex;
MidiDriver *_driver; MidiDriver *_driver;
@ -115,20 +115,11 @@ public:
public: public:
// MidiDriver interface implementation // MidiDriver interface implementation
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void setPassThrough(bool b) { _passThrough = b; } void setPassThrough(bool b) { _passThrough = b; }
// Timing functions - MidiDriver now operates timers
void setTimerCallback(void *timer_param, void (*timer_proc) (void *)) { }
uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
// Channel allocation functions
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
}; };
} // End of namespace AGOS } // End of namespace AGOS

View File

@ -97,10 +97,6 @@ int MusicPlayer::open() {
return 0; return 0;
} }
bool MusicPlayer::isOpen() const {
return _driver && _driver->isOpen();
}
void MusicPlayer::close() { void MusicPlayer::close() {
stop(); stop();
if (_driver) { if (_driver) {
@ -198,7 +194,7 @@ void MusicPlayer::playSMF(int track, bool loop) {
MidiParser *parser = _smfParser; MidiParser *parser = _smfParser;
parser->setTrack(0); parser->setTrack(0);
parser->setMidiDriver(this); parser->setMidiDriver(this);
parser->setTimerRate(getBaseTempo()); parser->setTimerRate(_driver->getBaseTempo());
parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1); parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1);
_parser = parser; _parser = parser;

View File

@ -36,7 +36,7 @@ namespace Draci {
// Taken from MADE, which took it from SAGA. // Taken from MADE, which took it from SAGA.
class MusicPlayer : public MidiDriver { class MusicPlayer : public MidiDriver_BASE {
public: public:
MusicPlayer(MidiDriver *driver, const char *pathMask); MusicPlayer(MidiDriver *driver, const char *pathMask);
~MusicPlayer(); ~MusicPlayer();
@ -61,19 +61,11 @@ public:
// MidiDriver interface implementation // MidiDriver interface implementation
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
//Channel allocation functions
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
MidiParser *_parser; MidiParser *_parser;
Common::Mutex _mutex; Common::Mutex _mutex;

View File

@ -264,12 +264,6 @@ int MusicPlayerMidi::open() {
return 0; return 0;
} }
bool MusicPlayerMidi::isOpen() const {
return _driver && _driver->isOpen();
}
void MusicPlayerMidi::close() {}
void MusicPlayerMidi::send(uint32 b) { void MusicPlayerMidi::send(uint32 b) {
if ((b & 0xFFF0) == 0x07B0) { // Volume change if ((b & 0xFFF0) == 0x07B0) { // Volume change
// Save the specific channel volume // Save the specific channel volume
@ -298,32 +292,6 @@ void MusicPlayerMidi::metaEvent(byte type, byte *data, uint16 length) {
} }
} }
void MusicPlayerMidi::setTimerCallback(void *timer_param, Common::TimerManager::TimerProc timer_proc) {
if (_driver)
_driver->setTimerCallback(timer_param, timer_proc);
}
uint32 MusicPlayerMidi::getBaseTempo() {
if (_driver)
return _driver->getBaseTempo();
else
return 0;
}
MidiChannel *MusicPlayerMidi::allocateChannel() {
if (_driver)
return _driver->allocateChannel();
else
return 0;
}
MidiChannel *MusicPlayerMidi::getPercussionChannel() {
if (_driver)
return _driver->getPercussionChannel();
else
return 0;
}
void MusicPlayerMidi::updateChanVolume(byte channel) { void MusicPlayerMidi::updateChanVolume(byte channel) {
// Generate a MIDI Control change message for the volume // Generate a MIDI Control change message for the volume
uint32 b = 0x7B0; uint32 b = 0x7B0;
@ -406,7 +374,7 @@ MusicPlayerXMI::MusicPlayerXMI(GroovieEngine *vm, const Common::String &gtlName)
// Create the driver // Create the driver
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
_driver = createMidi(dev); _driver = MidiDriver::createMidi(dev);
this->open(); this->open();
// Set the parser's driver // Set the parser's driver
@ -706,7 +674,7 @@ MusicPlayerMac::MusicPlayerMac(GroovieEngine *vm) : MusicPlayerMidi(vm) {
// Create the driver // Create the driver
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM);
_driver = createMidi(dev); _driver = MidiDriver::createMidi(dev);
this->open(); this->open();
// Set the parser's driver // Set the parser's driver

View File

@ -88,21 +88,15 @@ protected:
virtual void unload(); virtual void unload();
}; };
class MusicPlayerMidi : public MusicPlayer, public MidiDriver { class MusicPlayerMidi : public MusicPlayer, public MidiDriver_BASE {
public: public:
MusicPlayerMidi(GroovieEngine *vm); MusicPlayerMidi(GroovieEngine *vm);
~MusicPlayerMidi(); ~MusicPlayerMidi();
// MidiDriver interface // MidiDriver interface
virtual int open(); virtual int open();
virtual bool isOpen() const;
virtual void close();
virtual void send(uint32 b); virtual void send(uint32 b);
virtual void metaEvent(byte type, byte *data, uint16 length); virtual void metaEvent(byte type, byte *data, uint16 length);
virtual void setTimerCallback(void *timer_param, Common::TimerManager::TimerProc timer_proc);
virtual uint32 getBaseTempo();
virtual MidiChannel *allocateChannel();
virtual MidiChannel *getPercussionChannel();
private: private:
// Channel volumes // Channel volumes

View File

@ -75,18 +75,6 @@ void MidiPlayer::setLooping(bool loop) {
_isLooping = loop; _isLooping = loop;
} }
MidiChannel *MidiPlayer::allocateChannel() {
return 0;
}
MidiChannel *MidiPlayer::getPercussionChannel() {
return 0;
}
uint32 MidiPlayer::getBaseTempo() {
return _driver ? _driver->getBaseTempo() : 0;
}
void MidiPlayer::play(uint8 *stream, uint16 size) { void MidiPlayer::play(uint8 *stream, uint16 size) {
debugC(3, kDebugMusic, "MidiPlayer::play"); debugC(3, kDebugMusic, "MidiPlayer::play");
if (!stream) { if (!stream) {
@ -191,10 +179,6 @@ int MidiPlayer::open() {
return 0; return 0;
} }
bool MidiPlayer::isOpen() const {
return _driver && _driver->isOpen();
}
void MidiPlayer::close() { void MidiPlayer::close() {
stop(); stop();

View File

@ -40,7 +40,7 @@
namespace Hugo { namespace Hugo {
class MidiPlayer : public MidiDriver { class MidiPlayer : public MidiDriver_BASE {
public: public:
MidiPlayer(MidiDriver *driver); MidiPlayer(MidiDriver *driver);
~MidiPlayer(); ~MidiPlayer();
@ -60,15 +60,9 @@ public:
// MidiDriver interface // MidiDriver interface
int open(); int open();
bool isOpen() const;
MidiChannel *allocateChannel();
MidiChannel *getPercussionChannel();
void close(); void close();
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void send(uint32 b); void send(uint32 b);
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
uint32 getBaseTempo(); uint32 getBaseTempo();

View File

@ -219,12 +219,12 @@ public:
~MidiDriver_PCSpeaker(); ~MidiDriver_PCSpeaker();
// MidiDriver interface // MidiDriver interface
void close() {} virtual void close() {}
void send(uint32 data); virtual void send(uint32 data);
MidiChannel *allocateChannel() { return 0; } virtual MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; } virtual MidiChannel *getPercussionChannel() { return 0; }
// MidiDriver_Emulated interface // MidiDriver_Emulated interface
void generateSamples(int16 *buffer, int numSamples); void generateSamples(int16 *buffer, int numSamples);

View File

@ -33,7 +33,7 @@
namespace Kyra { namespace Kyra {
class MidiOutput : public MidiDriver { class MidiOutput : public MidiDriver_BASE {
public: public:
MidiOutput(OSystem *system, MidiDriver *output, bool isMT32, bool defaultMT32); MidiOutput(OSystem *system, MidiDriver *output, bool isMT32, bool defaultMT32);
~MidiOutput(); ~MidiOutput();
@ -46,20 +46,16 @@ public:
void setSoundSource(int source) { _curSource = source; } void setSoundSource(int source) { _curSource = source; }
void send(uint32 b); // MidiDriver_BASE interface
void sysEx(const byte *msg, uint16 length); virtual void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); virtual void sysEx(const byte *msg, uint16 length);
virtual void metaEvent(byte type, byte *data, uint16 length);
// TODO: Get rid of the following two methods
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { _output->setTimerCallback(timerParam, timerProc); } void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { _output->setTimerCallback(timerParam, timerProc); }
uint32 getBaseTempo() { return _output->getBaseTempo(); } uint32 getBaseTempo() { return _output->getBaseTempo(); }
// DUMMY
int open() { return 0; }
bool isOpen() const { return true; }
void close() {}
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
private: private:
void sendIntern(const byte event, const byte channel, byte param1, const byte param2); void sendIntern(const byte event, const byte channel, byte param1, const byte param2);
void sendSysEx(const byte p1, const byte p2, const byte p3, const byte *buffer, const int size); void sendSysEx(const byte p1, const byte p2, const byte p3, const byte *buffer, const int size);
@ -266,7 +262,7 @@ void MidiOutput::sendIntern(const byte event, const byte channel, byte param1, c
if (event == 0xC0) { if (event == 0xC0) {
// MT32 -> GM conversion // MT32 -> GM conversion
if (!_isMT32 && _defaultMT32) if (!_isMT32 && _defaultMT32)
param1 = _mt32ToGm[param1]; param1 = MidiDriver::_mt32ToGm[param1];
} }
_output->send(event | channel, param1, param2); _output->send(event | channel, param1, param2);

View File

@ -694,10 +694,6 @@ int MidiMusic::open() {
return 0; return 0;
} }
bool MidiMusic::isOpen() const {
return _driver != 0;
}
void MidiMusic::close() { void MidiMusic::close() {
} }

View File

@ -46,7 +46,7 @@ struct ChannelEntry {
uint8 volume; uint8 volume;
}; };
class MidiMusic: public MidiDriver { class MidiMusic: public MidiDriver_BASE {
private: private:
uint8 _soundNumber; uint8 _soundNumber;
uint8 _channelNumber; uint8 _channelNumber;
@ -86,20 +86,12 @@ public:
//MidiDriver interface implementation //MidiDriver interface implementation
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void onTimer(); void onTimer();
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
//Channel allocation functions
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
uint8 channelNumber() { return _channelNumber; } uint8 channelNumber() { return _channelNumber; }
uint8 soundNumber() { return _soundNumber; } uint8 soundNumber() { return _soundNumber; }
bool isPlaying() { return _isPlaying; } bool isPlaying() { return _isPlaying; }

View File

@ -33,11 +33,12 @@
namespace M4 { namespace M4 {
MidiPlayer::MidiPlayer(MadsM4Engine *vm, MidiDriver *driver) : _vm(vm), _midiData(NULL), _driver(driver), _isPlaying(false), _passThrough(false), _isGM(false) { MidiPlayer::MidiPlayer(MadsM4Engine *vm, MidiDriver *driver) : _vm(vm), _midiData(NULL), _driver(driver), _isPlaying(false), _passThrough(false), _isGM(false) {
assert(_driver);
memset(_channel, 0, sizeof(_channel)); memset(_channel, 0, sizeof(_channel));
_masterVolume = 0; _masterVolume = 0;
_parser = MidiParser::createParser_SMF(); _parser = MidiParser::createParser_SMF();
_parser->setMidiDriver(this); _parser->setMidiDriver(this);
_parser->setTimerRate(getBaseTempo()); _parser->setTimerRate(_driver->getBaseTempo());
open(); open();
} }
@ -83,10 +84,6 @@ int MidiPlayer::open() {
return 0; return 0;
} }
bool MidiPlayer::isOpen() const {
return _driver && _driver->isOpen();
}
void MidiPlayer::close() { void MidiPlayer::close() {
stopMusic(); stopMusic();
if (_driver) { if (_driver) {

View File

@ -34,7 +34,7 @@
namespace M4 { namespace M4 {
class MidiPlayer : public MidiDriver { class MidiPlayer : public MidiDriver_BASE {
public: public:
MidiPlayer(MadsM4Engine *vm, MidiDriver *driver); MidiPlayer(MadsM4Engine *vm, MidiDriver *driver);
~MidiPlayer(); ~MidiPlayer();
@ -54,19 +54,11 @@ public:
//MidiDriver interface implementation //MidiDriver interface implementation
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
//Channel allocation functions
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
protected: protected:
static void onTimer(void *data); static void onTimer(void *data);

View File

@ -89,10 +89,6 @@ int MusicPlayer::open() {
return 0; return 0;
} }
bool MusicPlayer::isOpen() const {
return _driver && _driver->isOpen();
}
void MusicPlayer::close() { void MusicPlayer::close() {
stop(); stop();
if (_driver) { if (_driver) {
@ -169,7 +165,7 @@ void MusicPlayer::playXMIDI(GenericResource *midiResource, MusicFlags flags) {
MidiParser *parser = _xmidiParser; MidiParser *parser = _xmidiParser;
parser->setTrack(0); parser->setTrack(0);
parser->setMidiDriver(this); parser->setMidiDriver(this);
parser->setTimerRate(getBaseTempo()); parser->setTimerRate(_driver->getBaseTempo());
parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1); parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1);
parser->property(MidiParser::mpSendSustainOffOnNotesOff, 1); parser->property(MidiParser::mpSendSustainOffOnNotesOff, 1);
@ -196,7 +192,7 @@ void MusicPlayer::playSMF(GenericResource *midiResource, MusicFlags flags) {
MidiParser *parser = _smfParser; MidiParser *parser = _smfParser;
parser->setTrack(0); parser->setTrack(0);
parser->setMidiDriver(this); parser->setMidiDriver(this);
parser->setTimerRate(getBaseTempo()); parser->setTimerRate(_driver->getBaseTempo());
parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1); parser->property(MidiParser::mpCenterPitchWheelOnUnload, 1);
_parser = parser; _parser = parser;

View File

@ -41,7 +41,7 @@ enum MusicFlags {
MUSIC_LOOP = 1 MUSIC_LOOP = 1
}; };
class MusicPlayer : public MidiDriver { class MusicPlayer : public MidiDriver_BASE {
public: public:
MusicPlayer(MidiDriver *driver); MusicPlayer(MidiDriver *driver);
~MusicPlayer(); ~MusicPlayer();
@ -66,19 +66,11 @@ public:
//MidiDriver interface implementation //MidiDriver interface implementation
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
//Channel allocation functions
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
MidiParser *_parser; MidiParser *_parser;
Common::Mutex _mutex; Common::Mutex _mutex;

View File

@ -201,7 +201,7 @@ MidiParser *createParser_MSC() {
} }
class MidiPlayer_MSC : public MidiDriver { class MidiPlayer_MSC : public MidiDriver_BASE {
public: public:
enum { enum {
@ -222,14 +222,9 @@ public:
// MidiDriver interface // MidiDriver interface
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); 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: private:
@ -342,10 +337,6 @@ int MidiPlayer_MSC::open() {
return ret; return ret;
} }
bool MidiPlayer_MSC::isOpen() const {
return _driver && _driver->isOpen();
}
void MidiPlayer_MSC::close() { void MidiPlayer_MSC::close() {
stop(); stop();

View File

@ -38,7 +38,7 @@
namespace Parallaction { namespace Parallaction {
class MidiPlayer : public MidiDriver { class MidiPlayer : public MidiDriver_BASE {
public: public:
enum { enum {
@ -59,14 +59,9 @@ public:
// MidiDriver interface // MidiDriver interface
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); 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: private:
@ -177,10 +172,6 @@ int MidiPlayer::open() {
return ret; return ret;
} }
bool MidiPlayer::isOpen() const {
return _driver && _driver->isOpen();
}
void MidiPlayer::close() { void MidiPlayer::close() {
stop(); stop();

View File

@ -39,7 +39,7 @@ struct TuneData;
class QueenEngine; class QueenEngine;
class MidiMusic : public MidiDriver { class MidiMusic : public MidiDriver_BASE {
public: public:
MidiMusic(QueenEngine *vm); MidiMusic(QueenEngine *vm);
~MidiMusic(); ~MidiMusic();
@ -57,20 +57,9 @@ public:
void toggleVChange(); void toggleVChange();
//MidiDriver interface implementation //MidiDriver interface implementation
int open() { return 0; }
bool isOpen() const { return true; }
void close() {}
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
uint32 getBaseTempo() { return _driver ? _driver->getBaseTempo() : 0; }
//Channel allocation functions
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
protected: protected:
enum { enum {

View File

@ -76,10 +76,6 @@ int MusicDriver::open() {
return 0; return 0;
} }
bool MusicDriver::isOpen() const {
return _driver->isOpen();
}
void MusicDriver::setVolume(int volume) { void MusicDriver::setVolume(int volume) {
volume = CLIP(volume, 0, 255); volume = CLIP(volume, 0, 255);

View File

@ -44,7 +44,7 @@ enum MusicFlags {
MUSIC_DEFAULT = 0xffff MUSIC_DEFAULT = 0xffff
}; };
class MusicDriver : public MidiDriver { class MusicDriver : public MidiDriver_BASE {
public: public:
MusicDriver(); MusicDriver();
~MusicDriver(); ~MusicDriver();
@ -67,16 +67,10 @@ public:
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { _driver->setTimerCallback(timerParam, timerProc); } void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { _driver->setTimerCallback(timerParam, timerProc); }
uint32 getBaseTempo() { return _driver->getBaseTempo(); } uint32 getBaseTempo() { return _driver->getBaseTempo(); }
//Channel allocation functions
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
Common::Mutex _mutex; Common::Mutex _mutex;
protected: protected:
static void onTimer(void *data);
MidiChannel *_channel[16]; MidiChannel *_channel[16];
MidiDriver *_driver; MidiDriver *_driver;
MusicType _driverType; MusicType _driverType;

View File

@ -785,7 +785,7 @@ public:
int open(ResourceManager *resMan) { int open(ResourceManager *resMan) {
if (_driver) if (_driver)
return MERR_ALREADY_OPEN; return MidiDriver::MERR_ALREADY_OPEN;
_driver = new MidiDriver_CMS(g_system->getMixer(), resMan); _driver = new MidiDriver_CMS(g_system->getMixer(), resMan);
int driverRetVal = _driver->open(); int driverRetVal = _driver->open();

View File

@ -129,7 +129,7 @@ private:
MidiPlayer_Fb01::MidiPlayer_Fb01(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _timerParam(NULL), _timerProc(NULL) { MidiPlayer_Fb01::MidiPlayer_Fb01(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _timerParam(NULL), _timerProc(NULL) {
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI); MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI);
_driver = createMidi(dev); _driver = MidiDriver::createMidi(dev);
_sysExBuf[0] = 0x43; _sysExBuf[0] = 0x43;
_sysExBuf[1] = 0x75; _sysExBuf[1] = 0x75;

View File

@ -132,7 +132,7 @@ private:
MidiPlayer_Midi::MidiPlayer_Midi(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _isMt32(false), _hasReverb(false), _useMT32Track(true) { MidiPlayer_Midi::MidiPlayer_Midi(SciVersion version) : MidiPlayer(version), _playSwitch(true), _masterVolume(15), _isMt32(false), _hasReverb(false), _useMT32Track(true) {
MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI); MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI);
_driver = createMidi(dev); _driver = MidiDriver::createMidi(dev);
if (MidiDriver::getMusicType(dev) == MT_MT32 || ConfMan.getBool("native_mt32")) if (MidiDriver::getMusicType(dev) == MT_MT32 || ConfMan.getBool("native_mt32"))
_isMt32 = true; _isMt32 = true;

View File

@ -76,7 +76,7 @@ enum {
#define SCI_MIDI_CONTROLLER(status) ((status & 0xF0) == 0xB0) #define SCI_MIDI_CONTROLLER(status) ((status & 0xF0) == 0xB0)
class MidiPlayer : public MidiDriver { class MidiPlayer : public MidiDriver_BASE {
protected: protected:
MidiDriver *_driver; MidiDriver *_driver;
int8 _reverb; int8 _reverb;
@ -89,13 +89,10 @@ public:
return open(resMan); return open(resMan);
} }
virtual int open(ResourceManager *resMan) { return _driver->open(); } virtual int open(ResourceManager *resMan) { return _driver->open(); }
bool isOpen() const { return _driver->isOpen(); }
virtual void close() { _driver->close(); } virtual void close() { _driver->close(); }
virtual void send(uint32 b) { _driver->send(b); } virtual void send(uint32 b) { _driver->send(b); }
uint32 getBaseTempo() { return _driver->getBaseTempo(); } virtual uint32 getBaseTempo() { return _driver->getBaseTempo(); }
virtual bool hasRhythmChannel() const = 0; virtual bool hasRhythmChannel() const = 0;
MidiChannel *allocateChannel() { return _driver->allocateChannel(); }
MidiChannel *getPercussionChannel() { return _driver->getPercussionChannel(); }
virtual void setTimerCallback(void *timer_param, Common::TimerManager::TimerProc timer_proc) { _driver->setTimerCallback(timer_param, timer_proc); } virtual void setTimerCallback(void *timer_param, Common::TimerManager::TimerProc timer_proc) { _driver->setTimerCallback(timer_param, timer_proc); }
virtual byte getPlayId() const = 0; virtual byte getPlayId() const = 0;

View File

@ -155,7 +155,7 @@ struct CommandQueue {
// //
////////////////////////////////////////////////// //////////////////////////////////////////////////
class Player : public MidiDriver { class Player : public MidiDriver_BASE {
/* /*
* External SysEx handler functions shall each be defined in * External SysEx handler functions shall each be defined in
* a separate file. This header file shall be included at the * a separate file. This header file shall be included at the
@ -282,17 +282,9 @@ public:
public: public:
// MidiDriver interface // MidiDriver interface
int open() { return 0; }
bool isOpen() const { return true; }
void close() { }
void send(uint32 b); void send(uint32 b);
const char *getErrorName(int error_code) { return "Unknown"; }
void sysEx(const byte *msg, uint16 length); void sysEx(const byte *msg, uint16 length);
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void setTimerCallback(void *timer_param, void(*timer_proc)(void *)) { }
uint32 getBaseTempo();
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
}; };

View File

@ -986,10 +986,6 @@ void Player::fixAfterLoad() {
} }
} }
uint32 Player::getBaseTempo() {
return (_midi ? _midi->getBaseTempo() : 0);
}
void Player::metaEvent(byte type, byte *msg, uint16 len) { void Player::metaEvent(byte type, byte *msg, uint16 len) {
if (type == 0x2F) if (type == 0x2F)
clear(); clear();

View File

@ -96,7 +96,7 @@ TestExitStatus MidiTests::playMidiMusic() {
int errCode = driver->open(); int errCode = driver->open();
if (errCode) { if (errCode) {
Common::String errMsg = driver->getErrorName(errCode); Common::String errMsg = MidiDriver::getErrorName(errCode);
Testsuite::writeOnScreen(errMsg, Common::Point(0, 100)); Testsuite::writeOnScreen(errMsg, Common::Point(0, 100));
Testsuite::logPrintf("Error! %s", errMsg.c_str()); Testsuite::logPrintf("Error! %s", errMsg.c_str());
return kTestFailed; return kTestFailed;

View File

@ -432,10 +432,6 @@ int MidiMusicPlayer::open() {
return 0; return 0;
} }
bool MidiMusicPlayer::isOpen() const {
return _driver && _driver->isOpen();
}
void MidiMusicPlayer::close() { void MidiMusicPlayer::close() {
stop(); stop();
if (_driver) { if (_driver) {

View File

@ -60,7 +60,7 @@ SCNHANDLE GetTrackOffset(int trackNumber);
void dumpMusic(); void dumpMusic();
class MidiMusicPlayer : public MidiDriver { class MidiMusicPlayer : public MidiDriver_BASE {
public: public:
MidiMusicPlayer(MidiDriver *driver); MidiMusicPlayer(MidiDriver *driver);
~MidiMusicPlayer(); ~MidiMusicPlayer();
@ -80,23 +80,16 @@ public:
//MidiDriver interface implementation //MidiDriver interface implementation
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); void metaEvent(byte type, byte *data, uint16 length);
void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
// The original sets the "sequence timing" to 109 Hz, whatever that // The original sets the "sequence timing" to 109 Hz, whatever that
// means. The default is 120. // means. The default is 120.
uint32 getBaseTempo() { return _driver ? (109 * _driver->getBaseTempo()) / 120 : 0; } uint32 getBaseTempo() { return _driver ? (109 * _driver->getBaseTempo()) / 120 : 0; }
//Channel allocation functions
MidiChannel *allocateChannel() { return 0; }
MidiChannel *getPercussionChannel() { return 0; }
protected: protected:
static void onTimer(void *data); static void onTimer(void *data);

View File

@ -107,10 +107,6 @@ int MidiPlayer::open() {
return ret; return ret;
} }
bool MidiPlayer::isOpen() const {
return _driver && _driver->isOpen();
}
void MidiPlayer::close() { void MidiPlayer::close() {
stop(); stop();

View File

@ -39,7 +39,7 @@ namespace Common {
namespace Touche { namespace Touche {
class MidiPlayer : public MidiDriver { class MidiPlayer : public MidiDriver_BASE {
public: public:
enum { enum {
@ -59,14 +59,9 @@ public:
// MidiDriver interface // MidiDriver interface
int open(); int open();
bool isOpen() const;
void close(); void close();
void send(uint32 b); void send(uint32 b);
void metaEvent(byte type, byte *data, uint16 length); 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: private: