Increase soundfont references only when assigning preset to channel

Previously, the refcount was increased when retrieving a preset from
a soundfont. That doesn't really make sense anymore.
This commit is contained in:
Marcus Weseloh 2018-04-08 22:56:02 +02:00
parent c6bdc4bc12
commit efa97718fa
2 changed files with 23 additions and 22 deletions

View file

@ -219,16 +219,27 @@ fluid_channel_reset(fluid_channel_t* chan)
int int
fluid_channel_set_preset(fluid_channel_t* chan, fluid_preset_t* preset) fluid_channel_set_preset(fluid_channel_t* chan, fluid_preset_t* preset)
{ {
fluid_preset_notify (chan->preset, FLUID_PRESET_UNSELECTED, chan->channum); fluid_sfont_t *sfont;
if (chan->preset == preset)
{
return FLUID_OK;
}
if (chan->preset) { if (chan->preset) {
fluid_sfont_t *sfont;
sfont = chan->preset->sfont; sfont = chan->preset->sfont;
fluid_synth_sfont_unref (chan->synth, sfont); /* -- unref preset's SoundFont */ sfont->refcount--;
} }
fluid_preset_notify (chan->preset, FLUID_PRESET_UNSELECTED, chan->channum);
chan->preset = preset; chan->preset = preset;
if (preset) {
sfont = preset->sfont;
sfont->refcount++;
}
fluid_preset_notify (preset, FLUID_PRESET_SELECTED, chan->channum); fluid_preset_notify (preset, FLUID_PRESET_SELECTED, chan->channum);
return FLUID_OK; return FLUID_OK;

View file

@ -2214,7 +2214,6 @@ static fluid_preset_t*
fluid_synth_get_preset(fluid_synth_t* synth, unsigned int sfontnum, fluid_synth_get_preset(fluid_synth_t* synth, unsigned int sfontnum,
unsigned int banknum, unsigned int prognum) unsigned int banknum, unsigned int prognum)
{ {
fluid_preset_t *preset = NULL;
fluid_sfont_t *sfont; fluid_sfont_t *sfont;
fluid_list_t *list; fluid_list_t *list;
@ -2226,14 +2225,11 @@ fluid_synth_get_preset(fluid_synth_t* synth, unsigned int sfontnum,
if (fluid_sfont_get_id (sfont) == sfontnum) if (fluid_sfont_get_id (sfont) == sfontnum)
{ {
preset = fluid_sfont_get_preset (sfont, return fluid_sfont_get_preset (sfont, banknum - sfont->bankofs, prognum);
banknum - sfont->bankofs, prognum);
if (preset) sfont->refcount++; /* Add reference to SoundFont */
break;
} }
} }
return preset; return NULL;
} }
/* Get a preset by SoundFont name, bank and program. /* Get a preset by SoundFont name, bank and program.
@ -2243,7 +2239,6 @@ static fluid_preset_t*
fluid_synth_get_preset_by_sfont_name(fluid_synth_t* synth, const char *sfontname, fluid_synth_get_preset_by_sfont_name(fluid_synth_t* synth, const char *sfontname,
unsigned int banknum, unsigned int prognum) unsigned int banknum, unsigned int prognum)
{ {
fluid_preset_t *preset = NULL;
fluid_sfont_t *sfont; fluid_sfont_t *sfont;
fluid_list_t *list; fluid_list_t *list;
@ -2252,14 +2247,11 @@ fluid_synth_get_preset_by_sfont_name(fluid_synth_t* synth, const char *sfontname
if (FLUID_STRCMP (fluid_sfont_get_name (sfont), sfontname) == 0) if (FLUID_STRCMP (fluid_sfont_get_name (sfont), sfontname) == 0)
{ {
preset = fluid_sfont_get_preset (sfont, return fluid_sfont_get_preset (sfont, banknum - sfont->bankofs, prognum);
banknum - sfont->bankofs, prognum);
if (preset) sfont->refcount++; /* Add reference to SoundFont */
break;
} }
} }
return preset; return NULL;
} }
/* Find a preset by bank and program numbers. /* Find a preset by bank and program numbers.
@ -2269,23 +2261,21 @@ fluid_preset_t*
fluid_synth_find_preset(fluid_synth_t* synth, unsigned int banknum, fluid_synth_find_preset(fluid_synth_t* synth, unsigned int banknum,
unsigned int prognum) unsigned int prognum)
{ {
fluid_preset_t *preset = NULL; fluid_preset_t *preset;
fluid_sfont_t *sfont; fluid_sfont_t *sfont;
fluid_list_t *list; fluid_list_t *list;
for (list = synth->sfont; list; list = fluid_list_next (list)) { for (list = synth->sfont; list; list = fluid_list_next (list)) {
sfont = fluid_list_get (list); sfont = fluid_list_get (list);
preset = fluid_sfont_get_preset (sfont, preset = fluid_sfont_get_preset (sfont, banknum - sfont->bankofs, prognum);
banknum - sfont->bankofs, prognum);
if (preset) if (preset)
{ {
sfont->refcount++; /* Add reference to SoundFont */ return preset;
break;
} }
} }
return preset; return NULL;
} }
/** /**