mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2025-04-08 16:51:16 +00:00
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:
parent
121ed7124e
commit
e298fefd7f
4 changed files with 24 additions and 39 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue