00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "fluid_adriver.h"
00022 #include "fluid_settings.h"
00023
00024
00025
00026
00027
00028 typedef struct _fluid_audriver_definition_t
00029 {
00030 char* name;
00031 fluid_audio_driver_t* (*new)(fluid_settings_t* settings, fluid_synth_t* synth);
00032 fluid_audio_driver_t* (*new2)(fluid_settings_t* settings,
00033 fluid_audio_func_t func,
00034 void* data);
00035 int (*free)(fluid_audio_driver_t* driver);
00036 void (*settings)(fluid_settings_t* settings);
00037 } fluid_audriver_definition_t;
00038
00039
00040 #if PULSE_SUPPORT
00041 fluid_audio_driver_t* new_fluid_pulse_audio_driver(fluid_settings_t* settings,
00042 fluid_synth_t* synth);
00043 fluid_audio_driver_t* new_fluid_pulse_audio_driver2(fluid_settings_t* settings,
00044 fluid_audio_func_t func, void* data);
00045 int delete_fluid_pulse_audio_driver(fluid_audio_driver_t* p);
00046 void fluid_pulse_audio_driver_settings(fluid_settings_t* settings);
00047 #endif
00048
00049 #if ALSA_SUPPORT
00050 fluid_audio_driver_t* new_fluid_alsa_audio_driver(fluid_settings_t* settings,
00051 fluid_synth_t* synth);
00052 fluid_audio_driver_t* new_fluid_alsa_audio_driver2(fluid_settings_t* settings,
00053 fluid_audio_func_t func, void* data);
00054 int delete_fluid_alsa_audio_driver(fluid_audio_driver_t* p);
00055 void fluid_alsa_audio_driver_settings(fluid_settings_t* settings);
00056 #endif
00057
00058 #if OSS_SUPPORT
00059 fluid_audio_driver_t* new_fluid_oss_audio_driver(fluid_settings_t* settings,
00060 fluid_synth_t* synth);
00061 fluid_audio_driver_t* new_fluid_oss_audio_driver2(fluid_settings_t* settings,
00062 fluid_audio_func_t func, void* data);
00063 int delete_fluid_oss_audio_driver(fluid_audio_driver_t* p);
00064 void fluid_oss_audio_driver_settings(fluid_settings_t* settings);
00065 #endif
00066
00067 #if COREAUDIO_SUPPORT
00068 fluid_audio_driver_t* new_fluid_core_audio_driver(fluid_settings_t* settings,
00069 fluid_synth_t* synth);
00070 fluid_audio_driver_t* new_fluid_core_audio_driver2(fluid_settings_t* settings,
00071 fluid_audio_func_t func,
00072 void* data);
00073 int delete_fluid_core_audio_driver(fluid_audio_driver_t* p);
00074 void fluid_core_audio_driver_settings(fluid_settings_t* settings);
00075 #endif
00076
00077 #if DSOUND_SUPPORT
00078 fluid_audio_driver_t* new_fluid_dsound_audio_driver(fluid_settings_t* settings,
00079 fluid_synth_t* synth);
00080 int delete_fluid_dsound_audio_driver(fluid_audio_driver_t* p);
00081 void fluid_dsound_audio_driver_settings(fluid_settings_t* settings);
00082 #endif
00083
00084 #if PORTAUDIO_SUPPORT
00085 void fluid_portaudio_driver_settings (fluid_settings_t *settings);
00086 fluid_audio_driver_t* new_fluid_portaudio_driver(fluid_settings_t* settings,
00087 fluid_synth_t* synth);
00088 int delete_fluid_portaudio_driver(fluid_audio_driver_t* p);
00089 #endif
00090
00091 #if JACK_SUPPORT
00092 fluid_audio_driver_t* new_fluid_jack_audio_driver(fluid_settings_t* settings, fluid_synth_t* synth);
00093 fluid_audio_driver_t* new_fluid_jack_audio_driver2(fluid_settings_t* settings,
00094 fluid_audio_func_t func, void* data);
00095 int delete_fluid_jack_audio_driver(fluid_audio_driver_t* p);
00096 void fluid_jack_audio_driver_settings(fluid_settings_t* settings);
00097 #endif
00098
00099 #if SNDMAN_SUPPORT
00100 fluid_audio_driver_t* new_fluid_sndmgr_audio_driver(fluid_settings_t* settings,
00101 fluid_synth_t* synth);
00102 fluid_audio_driver_t* new_fluid_sndmgr_audio_driver2(fluid_settings_t* settings,
00103 fluid_audio_func_t func,
00104 void* data);
00105 int delete_fluid_sndmgr_audio_driver(fluid_audio_driver_t* p);
00106 #endif
00107
00108 #if DART_SUPPORT
00109 fluid_audio_driver_t* new_fluid_dart_audio_driver(fluid_settings_t* settings,
00110 fluid_synth_t* synth);
00111 int delete_fluid_dart_audio_driver(fluid_audio_driver_t* p);
00112 void fluid_dart_audio_driver_settings(fluid_settings_t* settings);
00113 #endif
00114
00115 #define AUFILE_SUPPORT 1
00116 #if AUFILE_SUPPORT
00117 fluid_audio_driver_t* new_fluid_file_audio_driver(fluid_settings_t* settings,
00118 fluid_synth_t* synth);
00119 int delete_fluid_file_audio_driver(fluid_audio_driver_t* p);
00120 void fluid_file_audio_driver_settings(fluid_settings_t* settings);
00121 #endif
00122
00123
00124 fluid_audriver_definition_t fluid_audio_drivers[] = {
00125 #if JACK_SUPPORT
00126 { "jack",
00127 new_fluid_jack_audio_driver,
00128 new_fluid_jack_audio_driver2,
00129 delete_fluid_jack_audio_driver,
00130 fluid_jack_audio_driver_settings },
00131 #endif
00132 #if ALSA_SUPPORT
00133 { "alsa",
00134 new_fluid_alsa_audio_driver,
00135 new_fluid_alsa_audio_driver2,
00136 delete_fluid_alsa_audio_driver,
00137 fluid_alsa_audio_driver_settings },
00138 #endif
00139 #if OSS_SUPPORT
00140 { "oss",
00141 new_fluid_oss_audio_driver,
00142 new_fluid_oss_audio_driver2,
00143 delete_fluid_oss_audio_driver,
00144 fluid_oss_audio_driver_settings },
00145 #endif
00146 #if PULSE_SUPPORT
00147 { "pulseaudio",
00148 new_fluid_pulse_audio_driver,
00149 new_fluid_pulse_audio_driver2,
00150 delete_fluid_pulse_audio_driver,
00151 fluid_pulse_audio_driver_settings },
00152 #endif
00153 #if COREAUDIO_SUPPORT
00154 { "coreaudio",
00155 new_fluid_core_audio_driver,
00156 new_fluid_core_audio_driver2,
00157 delete_fluid_core_audio_driver,
00158 fluid_core_audio_driver_settings },
00159 #endif
00160 #if DSOUND_SUPPORT
00161 { "dsound",
00162 new_fluid_dsound_audio_driver,
00163 NULL,
00164 delete_fluid_dsound_audio_driver,
00165 fluid_dsound_audio_driver_settings },
00166 #endif
00167 #if PORTAUDIO_SUPPORT
00168 { "portaudio",
00169 new_fluid_portaudio_driver,
00170 NULL,
00171 delete_fluid_portaudio_driver,
00172 fluid_portaudio_driver_settings },
00173 #endif
00174 #if SNDMAN_SUPPORT
00175 { "sndman",
00176 new_fluid_sndmgr_audio_driver,
00177 new_fluid_sndmgr_audio_driver2,
00178 delete_fluid_sndmgr_audio_driver,
00179 NULL },
00180 #endif
00181 #if DART_SUPPORT
00182 { "dart",
00183 new_fluid_dart_audio_driver,
00184 NULL,
00185 delete_fluid_dart_audio_driver,
00186 fluid_dart_audio_driver_settings },
00187 #endif
00188 #if AUFILE_SUPPORT
00189 { "file",
00190 new_fluid_file_audio_driver,
00191 NULL,
00192 delete_fluid_file_audio_driver,
00193 fluid_file_audio_driver_settings },
00194 #endif
00195 { NULL, NULL, NULL, NULL, NULL }
00196 };
00197
00198
00199
00200
00201 void fluid_audio_driver_settings(fluid_settings_t* settings)
00202 {
00203 int i;
00204
00205 fluid_settings_register_str(settings, "audio.sample-format", "16bits", 0, NULL, NULL);
00206 fluid_settings_add_option(settings, "audio.sample-format", "16bits");
00207 fluid_settings_add_option(settings, "audio.sample-format", "float");
00208
00209 fluid_settings_register_int(settings, "audio.output-channels", 2, 2, 32, 0, NULL, NULL);
00210 fluid_settings_register_int(settings, "audio.input-channels", 0, 0, 2, 0, NULL, NULL);
00211
00212
00213 #if defined(WIN32)
00214 fluid_settings_register_int(settings, "audio.period-size", 512, 64, 8192, 0, NULL, NULL);
00215 fluid_settings_register_int(settings, "audio.periods", 8, 2, 64, 0, NULL, NULL);
00216 #elif defined(MACOS9)
00217 fluid_settings_register_int(settings, "audio.period-size", 64, 64, 8192, 0, NULL, NULL);
00218 fluid_settings_register_int(settings, "audio.periods", 8, 2, 64, 0, NULL, NULL);
00219 #else
00220 fluid_settings_register_int(settings, "audio.period-size", 64, 64, 8192, 0, NULL, NULL);
00221 fluid_settings_register_int(settings, "audio.periods", 16, 2, 64, 0, NULL, NULL);
00222 #endif
00223
00224
00225 #if JACK_SUPPORT
00226 fluid_settings_register_str(settings, "audio.driver", "jack", 0, NULL, NULL);
00227 #elif ALSA_SUPPORT
00228 fluid_settings_register_str(settings, "audio.driver", "alsa", 0, NULL, NULL);
00229 #elif PULSE_SUPPORT
00230 fluid_settings_register_str(settings, "audio.driver", "pulseaudio", 0, NULL, NULL);
00231 #elif OSS_SUPPORT
00232 fluid_settings_register_str(settings, "audio.driver", "oss", 0, NULL, NULL);
00233 #elif COREAUDIO_SUPPORT
00234 fluid_settings_register_str(settings, "audio.driver", "coreaudio", 0, NULL, NULL);
00235 #elif DSOUND_SUPPORT
00236 fluid_settings_register_str(settings, "audio.driver", "dsound", 0, NULL, NULL);
00237 #elif SNDMAN_SUPPORT
00238 fluid_settings_register_str(settings, "audio.driver", "sndman", 0, NULL, NULL);
00239 #elif PORTAUDIO_SUPPORT
00240 fluid_settings_register_str(settings, "audio.driver", "portaudio", 0, NULL, NULL);
00241 #elif DART_SUPPORT
00242 fluid_settings_register_str(settings, "audio.driver", "dart", 0, NULL, NULL);
00243 #elif AUFILE_SUPPORT
00244 fluid_settings_register_str(settings, "audio.driver", "file", 0, NULL, NULL);
00245 #else
00246 fluid_settings_register_str(settings, "audio.driver", "", 0, NULL, NULL);
00247 #endif
00248
00249
00250 #if PULSE_SUPPORT
00251 fluid_settings_add_option(settings, "audio.driver", "pulseaudio");
00252 #endif
00253 #if ALSA_SUPPORT
00254 fluid_settings_add_option(settings, "audio.driver", "alsa");
00255 #endif
00256 #if OSS_SUPPORT
00257 fluid_settings_add_option(settings, "audio.driver", "oss");
00258 #endif
00259 #if COREAUDIO_SUPPORT
00260 fluid_settings_add_option(settings, "audio.driver", "coreaudio");
00261 #endif
00262 #if DSOUND_SUPPORT
00263 fluid_settings_add_option(settings, "audio.driver", "dsound");
00264 #endif
00265 #if SNDMAN_SUPPORT
00266 fluid_settings_add_option(settings, "audio.driver", "sndman");
00267 #endif
00268 #if PORTAUDIO_SUPPORT
00269 fluid_settings_add_option(settings, "audio.driver", "portaudio");
00270 #endif
00271 #if JACK_SUPPORT
00272 fluid_settings_add_option(settings, "audio.driver", "jack");
00273 #endif
00274 #if DART_SUPPORT
00275 fluid_settings_add_option(settings, "audio.driver", "dart");
00276 #endif
00277 #if AUFILE_SUPPORT
00278 fluid_settings_add_option(settings, "audio.driver", "file");
00279 #endif
00280
00281 for (i = 0; fluid_audio_drivers[i].name != NULL; i++) {
00282 if (fluid_audio_drivers[i].settings != NULL) {
00283 fluid_audio_drivers[i].settings(settings);
00284 }
00285 }
00286 }
00287
00288
00299 fluid_audio_driver_t*
00300 new_fluid_audio_driver(fluid_settings_t* settings, fluid_synth_t* synth)
00301 {
00302 int i;
00303 fluid_audio_driver_t* driver = NULL;
00304 char* name;
00305
00306 fluid_settings_getstr(settings, "audio.driver", &name);
00307
00308 for (i = 0; fluid_audio_drivers[i].name != NULL; i++) {
00309 if (fluid_settings_str_equal(settings, "audio.driver", fluid_audio_drivers[i].name)) {
00310 FLUID_LOG(FLUID_DBG, "Using '%s' audio driver", fluid_audio_drivers[i].name);
00311 driver = (*fluid_audio_drivers[i].new)(settings, synth);
00312 if (driver) {
00313 driver->name = fluid_audio_drivers[i].name;
00314 }
00315 return driver;
00316 }
00317 }
00318
00319 FLUID_LOG(FLUID_ERR, "Couldn't find the requested audio driver: %s", name);
00320 return NULL;
00321 }
00322
00336 fluid_audio_driver_t*
00337 new_fluid_audio_driver2(fluid_settings_t* settings, fluid_audio_func_t func, void* data)
00338 {
00339 int i;
00340 fluid_audio_driver_t* driver = NULL;
00341 char* name;
00342
00343 fluid_settings_getstr(settings, "audio.driver", &name);
00344
00345 for (i = 0; fluid_audio_drivers[i].name != NULL; i++) {
00346 if (fluid_settings_str_equal(settings, "audio.driver", fluid_audio_drivers[i].name) &&
00347 (fluid_audio_drivers[i].new2 != NULL)) {
00348 FLUID_LOG(FLUID_DBG, "Using '%s' audio driver", fluid_audio_drivers[i].name);
00349 driver = (*fluid_audio_drivers[i].new2)(settings, func, data);
00350 if (driver) {
00351 driver->name = fluid_audio_drivers[i].name;
00352 }
00353 return driver;
00354 }
00355 }
00356
00357 FLUID_LOG(FLUID_ERR, "Couldn't find the requested audio driver: %s", name);
00358 return NULL;
00359 }
00360
00367 void
00368 delete_fluid_audio_driver(fluid_audio_driver_t* driver)
00369 {
00370 int i;
00371
00372 for (i = 0; fluid_audio_drivers[i].name != NULL; i++) {
00373 if (fluid_audio_drivers[i].name == driver->name) {
00374 fluid_audio_drivers[i].free(driver);
00375 return;
00376 }
00377 }
00378 }