From e298fefd7fde2311acc10037331ee15a496ea842 Mon Sep 17 00:00:00 2001 From: carlo-bramini <30959007+carlo-bramini@users.noreply.github.com> Date: Sat, 27 Oct 2018 16:22:44 +0200 Subject: [PATCH] cleanup audio and midi driver instantiation (#448) Instead of saving the name of the driver, it would be worth to save to pointer to the selected definition instead. In this way, the function for deleting the driver does not need to search its name by parsing all the list, but it just needs to call the pointer into the saved definition (less code). This fix can be applied to MIDI drivers too. I also moved the FLUID_FREE(allnames) inside the "if(allnames != NULL)" block, nothing bad should happen even by keeping that instruction outside, but actually there is no need to call the free if allnames is NULL. --- src/drivers/fluid_adriver.c | 23 +++++++---------------- src/drivers/fluid_adriver.h | 4 +++- src/drivers/fluid_mdriver.c | 32 +++++++++++--------------------- src/drivers/fluid_mdriver.h | 4 +++- 4 files changed, 24 insertions(+), 39 deletions(-) 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; };