MidiDriver.cpp

Go to the documentation of this file.
00001 /*
00002 Copyright (C) 2005  The Pentagram Team
00003 
00004 This program is free software; you can redistribute it and/or
00005 modify it under the terms of the GNU General Public License
00006 as published by the Free Software Foundation; either version 2
00007 of the License, or (at your option) any later version.
00008 
00009 This program is distributed in the hope that it will be useful,
00010 but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 GNU General Public License for more details.
00013 
00014 You should have received a copy of the GNU General Public License
00015 along with this program; if not, write to the Free Software
00016 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
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 // Legacy Exult Midi Drivers
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 // Get the number of devices
00108 int MidiDriver::getDriverCount()
00109 {
00110         InitMidiDriverVector();
00111         return midi_drivers.size();
00112 }
00113 
00114 // Get the name of a driver
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 // Create an Instance of a MidiDriver
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         // Has the config file specified disabled midi?
00134         if ( Pentagram::strcasecmp(drv, "disabled"))
00135         {
00136                 std::vector<const MidiDriver::MidiDriverDesc*>::iterator it;
00137 
00138                 // Ok, it hasn't so search for the driver
00139                 for (it = midi_drivers.begin(); it < midi_drivers.end(); it++) {
00140 
00141                         // Found it (case insensitive)
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                 // Uh oh, we didn't manage to load a driver! 
00163                 // Search for the first working one
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                                 // Got it
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                                 // Oh well, try the next one
00181                                 delete new_driver;
00182                                 new_driver = 0; 
00183                         }
00184                 }
00185         }
00186         else
00187         {
00188                 new_driver = 0; // silence :-)
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

Generated on Fri Jul 27 22:27:25 2007 for pentagram by  doxygen 1.4.7