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.
This commit is contained in:
carlo-bramini 2018-10-27 16:22:44 +02:00 committed by Tom M
parent 121ed7124e
commit e298fefd7f
4 changed files with 24 additions and 39 deletions

View file

@ -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);
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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;
};