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
00041 #if ALSA_SUPPORT
00042 fluid_audio_driver_t* new_fluid_alsa_audio_driver(fluid_settings_t* settings,
00043 fluid_synth_t* synth);
00044 fluid_audio_driver_t* new_fluid_alsa_audio_driver2(fluid_settings_t* settings,
00045 fluid_audio_func_t func, void* data);
00046 int delete_fluid_alsa_audio_driver(fluid_audio_driver_t* p);
00047 void fluid_alsa_audio_driver_settings(fluid_settings_t* settings);
00048 #endif
00049
00050 #if OSS_SUPPORT
00051 fluid_audio_driver_t* new_fluid_oss_audio_driver(fluid_settings_t* settings,
00052 fluid_synth_t* synth);
00053 fluid_audio_driver_t* new_fluid_oss_audio_driver2(fluid_settings_t* settings,
00054 fluid_audio_func_t func, void* data);
00055 int delete_fluid_oss_audio_driver(fluid_audio_driver_t* p);
00056 void fluid_oss_audio_driver_settings(fluid_settings_t* settings);
00057 #endif
00058
00059 #if COREAUDIO_SUPPORT
00060 fluid_audio_driver_t* new_fluid_core_audio_driver(fluid_settings_t* settings,
00061 fluid_synth_t* synth);
00062 fluid_audio_driver_t* new_fluid_core_audio_driver2(fluid_settings_t* settings,
00063 fluid_audio_func_t func,
00064 void* data);
00065 int delete_fluid_core_audio_driver(fluid_audio_driver_t* p);
00066 void fluid_core_audio_driver_settings(fluid_settings_t* settings);
00067 #endif
00068
00069 #if DSOUND_SUPPORT
00070 fluid_audio_driver_t* new_fluid_dsound_audio_driver(fluid_settings_t* settings,
00071 fluid_synth_t* synth);
00072 int delete_fluid_dsound_audio_driver(fluid_audio_driver_t* p);
00073 void fluid_dsound_audio_driver_settings(fluid_settings_t* settings);
00074 #endif
00075
00076 #if PORTAUDIO_SUPPORT
00077 fluid_audio_driver_t* new_fluid_portaudio_driver(fluid_settings_t* settings,
00078 fluid_synth_t* synth);
00079 int delete_fluid_portaudio_driver(fluid_audio_driver_t* p);
00080 #endif
00081
00082 #if JACK_SUPPORT
00083 fluid_audio_driver_t* new_fluid_jack_audio_driver(fluid_settings_t* settings, fluid_synth_t* synth);
00084 fluid_audio_driver_t* new_fluid_jack_audio_driver2(fluid_settings_t* settings,
00085 fluid_audio_func_t func, void* data);
00086 int delete_fluid_jack_audio_driver(fluid_audio_driver_t* p);
00087 void fluid_jack_audio_driver_settings(fluid_settings_t* settings);
00088 #endif
00089
00090 #if SNDMAN_SUPPORT
00091 fluid_audio_driver_t* new_fluid_sndmgr_audio_driver(fluid_settings_t* settings,
00092 fluid_synth_t* synth);
00093 fluid_audio_driver_t* new_fluid_sndmgr_audio_driver2(fluid_settings_t* settings,
00094 fluid_audio_func_t func,
00095 void* data);
00096 int delete_fluid_sndmgr_audio_driver(fluid_audio_driver_t* p);
00097 #endif
00098
00099 #if DART_SUPPORT
00100 fluid_audio_driver_t* new_fluid_dart_audio_driver(fluid_settings_t* settings,
00101 fluid_synth_t* synth);
00102 int delete_fluid_dart_audio_driver(fluid_audio_driver_t* p);
00103 void fluid_dart_audio_driver_settings(fluid_settings_t* settings);
00104 #endif
00105
00106 #define AUFILE_SUPPORT 1
00107 #if AUFILE_SUPPORT
00108 fluid_audio_driver_t* new_fluid_file_audio_driver(fluid_settings_t* settings,
00109 fluid_synth_t* synth);
00110 int delete_fluid_file_audio_driver(fluid_audio_driver_t* p);
00111 void fluid_file_audio_driver_settings(fluid_settings_t* settings);
00112 #endif
00113
00114 fluid_audriver_definition_t fluid_audio_drivers[] = {
00115 #if OSS_SUPPORT
00116 { "oss",
00117 new_fluid_oss_audio_driver,
00118 new_fluid_oss_audio_driver2,
00119 delete_fluid_oss_audio_driver,
00120 fluid_oss_audio_driver_settings },
00121 #endif
00122 #if ALSA_SUPPORT
00123 { "alsa",
00124 new_fluid_alsa_audio_driver,
00125 new_fluid_alsa_audio_driver2,
00126 delete_fluid_alsa_audio_driver,
00127 fluid_alsa_audio_driver_settings },
00128 #endif
00129 #if COREAUDIO_SUPPORT
00130 { "coreaudio",
00131 new_fluid_core_audio_driver,
00132 new_fluid_core_audio_driver2,
00133 delete_fluid_core_audio_driver,
00134 fluid_core_audio_driver_settings },
00135 #endif
00136 #if DSOUND_SUPPORT
00137 { "dsound",
00138 new_fluid_dsound_audio_driver,
00139 NULL,
00140 delete_fluid_dsound_audio_driver,
00141 fluid_dsound_audio_driver_settings },
00142 #endif
00143 #if PORTAUDIO_SUPPORT
00144 { "portaudio",
00145 new_fluid_portaudio_driver,
00146 NULL,
00147 delete_fluid_portaudio_driver,
00148 NULL },
00149 #endif
00150 #if SNDMAN_SUPPORT
00151 { "sndman",
00152 new_fluid_sndmgr_audio_driver,
00153 new_fluid_sndmgr_audio_driver2,
00154 delete_fluid_sndmgr_audio_driver,
00155 NULL },
00156 #endif
00157 #if JACK_SUPPORT
00158 { "jack",
00159 new_fluid_jack_audio_driver,
00160 new_fluid_jack_audio_driver2,
00161 delete_fluid_jack_audio_driver,
00162 fluid_jack_audio_driver_settings },
00163 #endif
00164 #if DART_SUPPORT
00165 { "dart",
00166 new_fluid_dart_audio_driver,
00167 NULL,
00168 delete_fluid_dart_audio_driver,
00169 fluid_dart_audio_driver_settings },
00170 #endif
00171 #if AUFILE_SUPPORT
00172 { "file",
00173 new_fluid_file_audio_driver,
00174 NULL,
00175 delete_fluid_file_audio_driver,
00176 fluid_file_audio_driver_settings },
00177 #endif
00178 { NULL, NULL, NULL, NULL, NULL }
00179 };
00180
00181
00182
00183
00184 void fluid_audio_driver_settings(fluid_settings_t* settings)
00185 {
00186 int i;
00187
00188 fluid_settings_register_str(settings, "audio.sample-format", "16bits", 0, NULL, NULL);
00189 fluid_settings_add_option(settings, "audio.sample-format", "16bits");
00190 fluid_settings_add_option(settings, "audio.sample-format", "float");
00191
00192 fluid_settings_register_int(settings, "audio.output-channels", 2, 2, 32, 0, NULL, NULL);
00193 fluid_settings_register_int(settings, "audio.input-channels", 0, 0, 2, 0, NULL, NULL);
00194
00195
00196 #if defined(WIN32)
00197 fluid_settings_register_int(settings, "audio.period-size", 512, 64, 8192, 0, NULL, NULL);
00198 fluid_settings_register_int(settings, "audio.periods", 8, 2, 64, 0, NULL, NULL);
00199 #elif defined(MACOS9)
00200 fluid_settings_register_int(settings, "audio.period-size", 64, 64, 8192, 0, NULL, NULL);
00201 fluid_settings_register_int(settings, "audio.periods", 8, 2, 64, 0, NULL, NULL);
00202 #else
00203 fluid_settings_register_int(settings, "audio.period-size", 64, 64, 8192, 0, NULL, NULL);
00204 fluid_settings_register_int(settings, "audio.periods", 16, 2, 64, 0, NULL, NULL);
00205 #endif
00206
00207
00208 #if ALSA_SUPPORT
00209 fluid_settings_register_str(settings, "audio.driver", "alsa", 0, NULL, NULL);
00210 #elif OSS_SUPPORT
00211 fluid_settings_register_str(settings, "audio.driver", "oss", 0, NULL, NULL);
00212 #elif COREAUDIO_SUPPORT
00213 fluid_settings_register_str(settings, "audio.driver", "coreaudio", 0, NULL, NULL);
00214 #elif DSOUND_SUPPORT
00215 fluid_settings_register_str(settings, "audio.driver", "dsound", 0, NULL, NULL);
00216 #elif SNDMAN_SUPPORT
00217 fluid_settings_register_str(settings, "audio.driver", "sndman", 0, NULL, NULL);
00218 #elif PORTAUDIO_SUPPORT
00219 fluid_settings_register_str(settings, "audio.driver", "portaudio", 0, NULL, NULL);
00220 #elif JACK_SUPPORT
00221 fluid_settings_register_str(settings, "audio.driver", "jack", 0, NULL, NULL);
00222 #elif DART_SUPPORT
00223 fluid_settings_register_str(settings, "audio.driver", "dart", 0, NULL, NULL);
00224 #elif AUFILE_SUPPORT
00225 fluid_settings_register_str(settings, "audio.driver", "file", 0, NULL, NULL);
00226 #else
00227 fluid_settings_register_str(settings, "audio.driver", "", 0, NULL, NULL);
00228 #endif
00229
00230
00231 #if ALSA_SUPPORT
00232 fluid_settings_add_option(settings, "audio.driver", "alsa");
00233 #endif
00234 #if OSS_SUPPORT
00235 fluid_settings_add_option(settings, "audio.driver", "oss");
00236 #endif
00237 #if COREAUDIO_SUPPORT
00238 fluid_settings_add_option(settings, "audio.driver", "coreaudio");
00239 #endif
00240 #if DSOUND_SUPPORT
00241 fluid_settings_add_option(settings, "audio.driver", "dsound");
00242 #endif
00243 #if SNDMAN_SUPPORT
00244 fluid_settings_add_option(settings, "audio.driver", "sndman");
00245 #endif
00246 #if PORTAUDIO_SUPPORT
00247 fluid_settings_add_option(settings, "audio.driver", "portaudio");
00248 #endif
00249 #if JACK_SUPPORT
00250 fluid_settings_add_option(settings, "audio.driver", "jack");
00251 #endif
00252 #if DART_SUPPORT
00253 fluid_settings_add_option(settings, "audio.driver", "dart");
00254 #endif
00255 #if AUFILE_SUPPORT
00256 fluid_settings_add_option(settings, "audio.driver", "file");
00257 #endif
00258
00259 for (i = 0; fluid_audio_drivers[i].name != NULL; i++) {
00260 if (fluid_audio_drivers[i].settings != NULL) {
00261 fluid_audio_drivers[i].settings(settings);
00262 }
00263 }
00264 }
00265
00266
00277 fluid_audio_driver_t*
00278 new_fluid_audio_driver(fluid_settings_t* settings, fluid_synth_t* synth)
00279 {
00280 int i;
00281 fluid_audio_driver_t* driver = NULL;
00282 char* name;
00283
00284 fluid_settings_getstr(settings, "audio.driver", &name);
00285
00286 for (i = 0; fluid_audio_drivers[i].name != NULL; i++) {
00287 if (fluid_settings_str_equal(settings, "audio.driver", fluid_audio_drivers[i].name)) {
00288 FLUID_LOG(FLUID_DBG, "Using '%s' audio driver", fluid_audio_drivers[i].name);
00289 driver = (*fluid_audio_drivers[i].new)(settings, synth);
00290 if (driver) {
00291 driver->name = fluid_audio_drivers[i].name;
00292 }
00293 return driver;
00294 }
00295 }
00296
00297 FLUID_LOG(FLUID_ERR, "Couldn't find the requested audio driver: %s", name);
00298 return NULL;
00299 }
00300
00314 fluid_audio_driver_t*
00315 new_fluid_audio_driver2(fluid_settings_t* settings, fluid_audio_func_t func, void* data)
00316 {
00317 int i;
00318 fluid_audio_driver_t* driver = NULL;
00319 char* name;
00320
00321 fluid_settings_getstr(settings, "audio.driver", &name);
00322
00323 for (i = 0; fluid_audio_drivers[i].name != NULL; i++) {
00324 if (fluid_settings_str_equal(settings, "audio.driver", fluid_audio_drivers[i].name) &&
00325 (fluid_audio_drivers[i].new2 != NULL)) {
00326 FLUID_LOG(FLUID_DBG, "Using '%s' audio driver", fluid_audio_drivers[i].name);
00327 driver = (*fluid_audio_drivers[i].new2)(settings, func, data);
00328 if (driver) {
00329 driver->name = fluid_audio_drivers[i].name;
00330 }
00331 return driver;
00332 }
00333 }
00334
00335 FLUID_LOG(FLUID_ERR, "Couldn't find the requested audio driver: %s", name);
00336 return NULL;
00337 }
00338
00345 void
00346 delete_fluid_audio_driver(fluid_audio_driver_t* driver)
00347 {
00348 int i;
00349
00350 for (i = 0; fluid_audio_drivers[i].name != NULL; i++) {
00351 if (fluid_audio_drivers[i].name == driver->name) {
00352 fluid_audio_drivers[i].free(driver);
00353 return;
00354 }
00355 }
00356 }