00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "fluid_mdriver.h"
00022 #include "fluid_settings.h"
00023
00024
00025
00026 #if ALSA_SUPPORT
00027 fluid_midi_driver_t* new_fluid_alsa_rawmidi_driver(fluid_settings_t* settings,
00028 handle_midi_event_func_t handler,
00029 void* event_handler_data);
00030 int delete_fluid_alsa_rawmidi_driver(fluid_midi_driver_t* p);
00031 void fluid_alsa_rawmidi_driver_settings(fluid_settings_t* settings);
00032
00033 fluid_midi_driver_t* new_fluid_alsa_seq_driver(fluid_settings_t* settings,
00034 handle_midi_event_func_t handler,
00035 void* event_handler_data);
00036 int delete_fluid_alsa_seq_driver(fluid_midi_driver_t* p);
00037 void fluid_alsa_seq_driver_settings(fluid_settings_t* settings);
00038 #endif
00039
00040
00041 #if JACK_SUPPORT
00042 void fluid_jack_midi_driver_settings (fluid_settings_t *settings);
00043 fluid_midi_driver_t *new_fluid_jack_midi_driver (fluid_settings_t *settings,
00044 handle_midi_event_func_t handler,
00045 void *data);
00046 int delete_fluid_jack_midi_driver(fluid_midi_driver_t *p);
00047 #endif
00048
00049
00050 #if OSS_SUPPORT
00051 fluid_midi_driver_t* new_fluid_oss_midi_driver(fluid_settings_t* settings,
00052 handle_midi_event_func_t handler,
00053 void* event_handler_data);
00054 int delete_fluid_oss_midi_driver(fluid_midi_driver_t* p);
00055 void fluid_oss_midi_driver_settings(fluid_settings_t* settings);
00056 #endif
00057
00058
00059 #if WINMIDI_SUPPORT
00060 fluid_midi_driver_t* new_fluid_winmidi_driver(fluid_settings_t* settings,
00061 handle_midi_event_func_t handler,
00062 void* event_handler_data);
00063 int delete_fluid_winmidi_driver(fluid_midi_driver_t* p);
00064 void fluid_winmidi_midi_driver_settings(fluid_settings_t* settings);
00065 #endif
00066
00067
00068 #if MIDISHARE_SUPPORT
00069 fluid_midi_driver_t* new_fluid_midishare_midi_driver(fluid_settings_t* settings,
00070 void* event_handler_data,
00071 handle_midi_event_func_t handler);
00072 int delete_fluid_midishare_midi_driver(fluid_midi_driver_t* p);
00073 #endif
00074
00075
00076 #if COREMIDI_SUPPORT
00077 fluid_midi_driver_t* new_fluid_coremidi_driver(fluid_settings_t* settings,
00078 void* event_handler_data,
00079 handle_midi_event_func_t handler);
00080 int delete_fluid_coremidi_driver(fluid_midi_driver_t* p);
00081 void fluid_coremidi_driver_settings(fluid_settings_t* settings);
00082 #endif
00083
00084
00085
00086
00087
00088 struct fluid_mdriver_definition_t {
00089 char* name;
00090 fluid_midi_driver_t* (*new)(fluid_settings_t* settings,
00091 handle_midi_event_func_t event_handler,
00092 void* event_handler_data);
00093 int (*free)(fluid_midi_driver_t* p);
00094 void (*settings)(fluid_settings_t* settings);
00095 };
00096
00097
00098 struct fluid_mdriver_definition_t fluid_midi_drivers[] = {
00099 #if JACK_SUPPORT
00100 { "jack",
00101 new_fluid_jack_midi_driver,
00102 delete_fluid_jack_midi_driver,
00103 fluid_jack_midi_driver_settings },
00104 #endif
00105 #if OSS_SUPPORT
00106 { "oss",
00107 new_fluid_oss_midi_driver,
00108 delete_fluid_oss_midi_driver,
00109 fluid_oss_midi_driver_settings },
00110 #endif
00111 #if ALSA_SUPPORT
00112 { "alsa_raw",
00113 new_fluid_alsa_rawmidi_driver,
00114 delete_fluid_alsa_rawmidi_driver,
00115 fluid_alsa_rawmidi_driver_settings },
00116 { "alsa_seq",
00117 new_fluid_alsa_seq_driver,
00118 delete_fluid_alsa_seq_driver,
00119 fluid_alsa_seq_driver_settings },
00120 #endif
00121 #if WINMIDI_SUPPORT
00122 { "winmidi",
00123 new_fluid_winmidi_driver,
00124 delete_fluid_winmidi_driver,
00125 fluid_winmidi_midi_driver_settings },
00126 #endif
00127 #if MIDISHARE_SUPPORT
00128 { "midishare",
00129 new_fluid_midishare_midi_driver,
00130 delete_fluid_midishare_midi_driver,
00131 NULL },
00132 #endif
00133 #if COREMIDI_SUPPORT
00134 { "coremidi",
00135 new_fluid_coremidi_driver,
00136 delete_fluid_coremidi_driver,
00137 fluid_coremidi_driver_settings },
00138 #endif
00139 { NULL, NULL, NULL, NULL }
00140 };
00141
00142
00143
00144 void fluid_midi_driver_settings(fluid_settings_t* settings)
00145 {
00146 int i;
00147
00148
00149 #if ALSA_SUPPORT
00150 fluid_settings_register_str(settings, "midi.driver", "alsa_seq", 0, NULL, NULL);
00151 #elif JACK_SUPPORT
00152 fluid_settings_register_str(settings, "midi.driver", "jack", 0, NULL, NULL);
00153 #elif OSS_SUPPORT
00154 fluid_settings_register_str(settings, "midi.driver", "oss", 0, NULL, NULL);
00155 #elif WINMIDI_SUPPORT
00156 fluid_settings_register_str(settings, "midi.driver", "winmidi", 0, NULL, NULL);
00157 #elif MIDISHARE_SUPPORT
00158 fluid_settings_register_str(settings, "midi.driver", "midishare", 0, NULL, NULL);
00159 #elif COREMIDI_SUPPORT
00160 fluid_settings_register_str(settings, "midi.driver", "coremidi", 0, NULL, NULL);
00161 #else
00162 fluid_settings_register_str(settings, "midi.driver", "", 0, NULL, NULL);
00163 #endif
00164
00165
00166 #if ALSA_SUPPORT
00167 fluid_settings_add_option(settings, "midi.driver", "alsa_seq");
00168 fluid_settings_add_option(settings, "midi.driver", "alsa_raw");
00169 #endif
00170 #if JACK_SUPPORT
00171 fluid_settings_add_option(settings, "midi.driver", "jack");
00172 #endif
00173 #if OSS_SUPPORT
00174 fluid_settings_add_option(settings, "midi.driver", "oss");
00175 #endif
00176 #if WINMIDI_SUPPORT
00177 fluid_settings_add_option(settings, "midi.driver", "winmidi");
00178 #endif
00179 #if MIDISHARE_SUPPORT
00180 fluid_settings_add_option(settings, "midi.driver", "midishare");
00181 #endif
00182 #if COREMIDI_SUPPORT
00183 fluid_settings_add_option(settings, "midi.driver", "coremidi");
00184 #endif
00185
00186 for (i = 0; fluid_midi_drivers[i].name != NULL; i++) {
00187 if (fluid_midi_drivers[i].settings != NULL) {
00188 fluid_midi_drivers[i].settings(settings);
00189 }
00190 }
00191 }
00192
00193
00202 fluid_midi_driver_t* new_fluid_midi_driver(fluid_settings_t* settings, handle_midi_event_func_t handler, void* event_handler_data)
00203 {
00204 int i;
00205 fluid_midi_driver_t* driver = NULL;
00206 for (i = 0; fluid_midi_drivers[i].name != NULL; i++) {
00207 if (fluid_settings_str_equal(settings, "midi.driver", fluid_midi_drivers[i].name)) {
00208 FLUID_LOG(FLUID_DBG, "Using '%s' midi driver", fluid_midi_drivers[i].name);
00209 driver = fluid_midi_drivers[i].new(settings, handler, event_handler_data);
00210 if (driver) {
00211 driver->name = fluid_midi_drivers[i].name;
00212 }
00213 return driver;
00214 }
00215 }
00216
00217 FLUID_LOG(FLUID_ERR, "Couldn't find the requested midi driver");
00218 return NULL;
00219 }
00220
00225 void delete_fluid_midi_driver(fluid_midi_driver_t* driver)
00226 {
00227 int i;
00228
00229 for (i = 0; fluid_midi_drivers[i].name != NULL; i++) {
00230 if (fluid_midi_drivers[i].name == driver->name) {
00231 fluid_midi_drivers[i].free(driver);
00232 return;
00233 }
00234 }
00235 }