00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "pent_include.h"
00020 #include "MidiDriver.h"
00021 #include <vector>
00022
00023 #include "MidiDriver.h"
00024 #include "WindowsMidiDriver.h"
00025 #include "CoreAudioMidiDriver.h"
00026 #include "FMOplMidiDriver.h"
00027 #include "TimidityMidiDriver.h"
00028 #include "ALSAMidiDriver.h"
00029 #include "UnixSeqMidiDriver.h"
00030 #include "FluidSynthMidiDriver.h"
00031
00032
00033 #ifdef PENTAGRAM_IN_EXULT
00034 #include "MT32EmuMidiDriver.h"
00035 #include "mixer_midiout.h"
00036 #include "amiga_midi.h"
00037 #include "be_midi.h"
00038 #include "forked_player.h"
00039 #include "KMIDI.h"
00040 #endif
00041
00042
00043 #ifdef PENTAGRAM_IN_EXULT
00044 #include "Configuration.h"
00045 #else
00046 #include "SettingManager.h"
00047 #endif
00048
00049 static MidiDriver *Disabled_CreateInstance() { return 0; }
00050
00051 static const MidiDriver::MidiDriverDesc Disabled_desc =
00052 MidiDriver::MidiDriverDesc ("Disabled", Disabled_CreateInstance);
00053
00054 static std::vector<const MidiDriver::MidiDriverDesc*> midi_drivers;
00055
00056 static void InitMidiDriverVector()
00057 {
00058 if (midi_drivers.size()) return;
00059
00060 #ifdef USE_CORE_AUDIO_MIDI
00061 midi_drivers.push_back(CoreAudioMidiDriver::getDesc());
00062 #endif
00063 #ifdef USE_WINDOWS_MIDI
00064 midi_drivers.push_back(WindowsMidiDriver::getDesc());
00065 #endif
00066 #ifdef USE_TIMIDITY_MIDI
00067 midi_drivers.push_back(TimidityMidiDriver::getDesc());
00068 #endif
00069 #ifdef USE_MT32EMU_MIDI
00070 midi_drivers.push_back(MT32EmuMidiDriver::getDesc());
00071 #endif
00072 #ifdef USE_ALSA_MIDI
00073 midi_drivers.push_back(ALSAMidiDriver::getDesc());
00074 #endif
00075 #ifdef USE_UNIX_SEQ_MIDI
00076 midi_drivers.push_back(UnixSeqMidiDriver::getDesc());
00077 #endif
00078 #ifdef USE_FLUIDSYNTH_MIDI
00079 midi_drivers.push_back(FluidSynthMidiDriver::getDesc());
00080 #endif
00081 #ifdef USE_LIBK_MIDI
00082 midi_drivers.push_back(Mixer_MidiOut::getDesc());
00083 #endif
00084 #ifdef USE_LIBK_MIDI
00085 midi_drivers.push_back(KMIDI::getDesc());
00086 #endif
00087 #ifdef USE_FORKED_PLAYER_MIDI
00088 midi_drivers.push_back(forked_player::getDesc());
00089 #endif
00090 #ifdef USE_BEOS_MIDI
00091 midi_drivers.push_back(Be_midi::getDesc());
00092 #endif
00093 #ifdef USE_AMIGA_MIDI
00094 midi_drivers.push_back(AmigaMIDI::getDesc());
00095 #endif
00096 #ifdef USE_MIXER_MIDI
00097 midi_drivers.push_back(Mixer_MidiOut::getDesc());
00098 #endif
00099 #ifdef USE_FMOPL_MIDI
00100 midi_drivers.push_back(FMOplMidiDriver::getDesc());
00101 #endif
00102
00103 midi_drivers.push_back(&Disabled_desc);
00104 }
00105
00106
00107
00108 int MidiDriver::getDriverCount()
00109 {
00110 InitMidiDriverVector();
00111 return midi_drivers.size();
00112 }
00113
00114
00115 std::string MidiDriver::getDriverName(uint32 index)
00116 {
00117 InitMidiDriverVector();
00118
00119 if (index >= midi_drivers.size()) return "";
00120
00121 return midi_drivers[index]->name;
00122 }
00123
00124
00125 MidiDriver *MidiDriver::createInstance(std::string desired_driver,uint32 sample_rate,bool stereo)
00126 {
00127 InitMidiDriverVector();
00128
00129 MidiDriver *new_driver = 0;
00130
00131 const char * drv = desired_driver.c_str();
00132
00133
00134 if ( Pentagram::strcasecmp(drv, "disabled"))
00135 {
00136 std::vector<const MidiDriver::MidiDriverDesc*>::iterator it;
00137
00138
00139 for (it = midi_drivers.begin(); it < midi_drivers.end(); it++) {
00140
00141
00142 if (!Pentagram::strcasecmp(drv, (*it)->name)) {
00143
00144 pout << "Trying config specified Midi driver: `" << (*it)->name << "'" << std::endl;
00145
00146 new_driver = (*it)->createInstance();
00147 if (new_driver) {
00148
00149 if (new_driver->initMidiDriver(sample_rate,stereo)) {
00150 pout << "Failed!" << std::endl;
00151 delete new_driver;
00152 new_driver = 0;
00153 }
00154 else
00155 {
00156 pout << "Success!" << std::endl;
00157 }
00158 }
00159 }
00160 }
00161
00162
00163
00164 if (!new_driver) for (it = midi_drivers.begin(); it < midi_drivers.end(); it++) {
00165
00166 pout << "Trying: `" << (*it)->name << "'" << std::endl;
00167
00168 new_driver = (*it)->createInstance();
00169 if (new_driver) {
00170
00171
00172 if (!new_driver->initMidiDriver(sample_rate,stereo))
00173 {
00174 pout << "Success!" << std::endl;
00175 break;
00176 }
00177
00178 pout << "Failed!" << std::endl;
00179
00180
00181 delete new_driver;
00182 new_driver = 0;
00183 }
00184 }
00185 }
00186 else
00187 {
00188 new_driver = 0;
00189 }
00190
00191 pout << "Midi Output: " << (new_driver!=0?"Enabled":"Disabled") << std::endl;
00192
00193 return new_driver;
00194 }
00195
00196
00197 #ifdef PENTAGRAM_IN_EXULT
00198
00199 std::string MidiDriver::getConfigSetting(std::string name,
00200 std::string defaultval)
00201 {
00202 std::string key = "config/audio/midi/";
00203 key += name;
00204 std::string val;
00205 config->value(key, val, defaultval.c_str());
00206
00207 return val;
00208 }
00209
00210 #else
00211
00212 std::string MidiDriver::getConfigSetting(std::string name,
00213 std::string defaultval)
00214 {
00215 std::string val;
00216 if (!SettingManager::get_instance()->get(name,val))
00217 val = defaultval;
00218
00219 return val;
00220 }
00221
00222 #endif