diff --git a/src/drivers/fluid_adriver.c b/src/drivers/fluid_adriver.c index 7b7a28ce..f1ab772a 100644 --- a/src/drivers/fluid_adriver.c +++ b/src/drivers/fluid_adriver.c @@ -25,7 +25,7 @@ * fluid_adriver_definition_t */ -typedef struct _fluid_audriver_definition_t +struct _fluid_audriver_definition_t { const char *name; fluid_audio_driver_t *(*new)(fluid_settings_t *settings, fluid_synth_t *synth); @@ -34,7 +34,7 @@ typedef struct _fluid_audriver_definition_t void *data); void (*free)(fluid_audio_driver_t *driver); void (*settings)(fluid_settings_t *settings); -} fluid_audriver_definition_t; +}; /* Available audio drivers, listed in order of preference */ static const fluid_audriver_definition_t fluid_audio_drivers[] = @@ -236,10 +236,11 @@ find_fluid_audio_driver(fluid_settings_t *settings) { FLUID_LOG(FLUID_INFO, "No audio drivers available."); } + + FLUID_FREE(allnames); } FLUID_FREE(name); - FLUID_FREE(allnames); return NULL; } @@ -265,7 +266,7 @@ new_fluid_audio_driver(fluid_settings_t *settings, fluid_synth_t *synth) if(driver) { - driver->name = def->name; + driver->define = def; } return driver; @@ -307,7 +308,7 @@ new_fluid_audio_driver2(fluid_settings_t *settings, fluid_audio_func_t func, voi if(driver) { - driver->name = def->name; + driver->define = def; } } @@ -326,18 +327,8 @@ new_fluid_audio_driver2(fluid_settings_t *settings, fluid_audio_func_t func, voi void delete_fluid_audio_driver(fluid_audio_driver_t *driver) { - unsigned int i; fluid_return_if_fail(driver != NULL); - - /* iterate over fluid_audio_drivers_template to ensure deleting even drivers currently not registered */ - for(i = 0; i < FLUID_N_ELEMENTS(fluid_audio_drivers) - 1; i++) - { - if(fluid_audio_drivers[i].name == driver->name) - { - fluid_audio_drivers[i].free(driver); - return; - } - } + driver->define->free(driver); } diff --git a/src/drivers/fluid_adriver.h b/src/drivers/fluid_adriver.h index 430c4748..1564168f 100644 --- a/src/drivers/fluid_adriver.h +++ b/src/drivers/fluid_adriver.h @@ -27,9 +27,11 @@ * fluid_audio_driver_t */ +typedef struct _fluid_audriver_definition_t fluid_audriver_definition_t; + struct _fluid_audio_driver_t { - const char *name; + const fluid_audriver_definition_t *define; }; void fluid_audio_driver_settings(fluid_settings_t *settings); diff --git a/src/drivers/fluid_mdriver.c b/src/drivers/fluid_mdriver.c index 6c23ab93..79b20970 100644 --- a/src/drivers/fluid_mdriver.c +++ b/src/drivers/fluid_mdriver.c @@ -25,7 +25,7 @@ /* * fluid_mdriver_definition */ -struct fluid_mdriver_definition_t +struct _fluid_mdriver_definition_t { const char *name; fluid_midi_driver_t *(*new)(fluid_settings_t *settings, @@ -36,7 +36,7 @@ struct fluid_mdriver_definition_t }; -static const struct fluid_mdriver_definition_t fluid_midi_drivers[] = +static const fluid_mdriver_definition_t fluid_midi_drivers[] = { #if ALSA_SUPPORT { @@ -145,19 +145,18 @@ fluid_midi_driver_t *new_fluid_midi_driver(fluid_settings_t *settings, handle_mi { fluid_midi_driver_t *driver = NULL; char *allnames; - unsigned int i; + const fluid_mdriver_definition_t *def; - for(i = 0; i < FLUID_N_ELEMENTS(fluid_midi_drivers) - 1; i++) + for(def = fluid_midi_drivers; def->name != NULL; def++) { - const char* name = fluid_midi_drivers[i].name; - if(fluid_settings_str_equal(settings, "midi.driver", name)) + if(fluid_settings_str_equal(settings, "midi.driver", def->name)) { - FLUID_LOG(FLUID_DBG, "Using '%s' midi driver", name); - driver = fluid_midi_drivers[i].new(settings, handler, event_handler_data); + FLUID_LOG(FLUID_DBG, "Using '%s' midi driver", def->name); + driver = def->new(settings, handler, event_handler_data); if(driver) { - driver->name = name; + driver->define = def; } return driver; @@ -176,9 +175,9 @@ fluid_midi_driver_t *new_fluid_midi_driver(fluid_settings_t *settings, handle_mi { FLUID_LOG(FLUID_INFO, "No MIDI drivers available."); } - } - FLUID_FREE(allnames); + FLUID_FREE(allnames); + } return NULL; } @@ -189,15 +188,6 @@ fluid_midi_driver_t *new_fluid_midi_driver(fluid_settings_t *settings, handle_mi */ void delete_fluid_midi_driver(fluid_midi_driver_t *driver) { - unsigned int i; fluid_return_if_fail(driver != NULL); - - for(i = 0; i < FLUID_N_ELEMENTS(fluid_midi_drivers) - 1; i++) - { - if(fluid_midi_drivers[i].name == driver->name) - { - fluid_midi_drivers[i].free(driver); - return; - } - } + driver->define->free(driver); } diff --git a/src/drivers/fluid_mdriver.h b/src/drivers/fluid_mdriver.h index eb212ccb..76b8b7b0 100644 --- a/src/drivers/fluid_mdriver.h +++ b/src/drivers/fluid_mdriver.h @@ -27,9 +27,11 @@ * fluid_midi_driver_t */ +typedef struct _fluid_mdriver_definition_t fluid_mdriver_definition_t; + struct _fluid_midi_driver_t { - const char *name; + const fluid_mdriver_definition_t *define; handle_midi_event_func_t handler; void *data; };