Fix for bug with duplicate sample names in SoundFont files, reported on fluid-dev http://lists.nongnu.org/archive/html/fluid-dev/2011-02/msg00045.html

This commit is contained in:
Element Green 2011-02-27 20:35:24 +00:00
parent f164ef2dc4
commit 02690ada63
2 changed files with 7 additions and 28 deletions

View File

@ -317,6 +317,9 @@ int fluid_defsfont_load(fluid_defsfont_t* sfont, const char* file)
if (fluid_sample_import_sfont(sample, sfsample, sfont) != FLUID_OK)
goto err_exit;
/* Store reference to FluidSynth sample in SFSample for later IZone fixups */
sfsample->fluid_sample = sample;
fluid_defsfont_add_sample(sfont, sample);
fluid_voice_optimize_sample(sample);
p = fluid_list_next(p);
@ -445,26 +448,6 @@ fluid_defsfont_load_sampledata(fluid_defsfont_t* sfont)
return FLUID_OK;
}
/*
* fluid_defsfont_get_sample
*/
fluid_sample_t* fluid_defsfont_get_sample(fluid_defsfont_t* sfont, char *s)
{
fluid_list_t* list;
fluid_sample_t* sample;
for (list = sfont->sample; list; list = fluid_list_next(list)) {
sample = (fluid_sample_t*) fluid_list_get(list);
if (FLUID_STRCMP(sample->name, s) == 0) {
return sample;
}
}
return NULL;
}
/*
* fluid_defsfont_get_preset
*/
@ -1407,13 +1390,9 @@ fluid_inst_zone_import_sfont(fluid_inst_zone_t* zone, SFZone *sfzone, fluid_defs
/* FLUID_LOG(FLUID_DBG, "ExclusiveClass=%d\n", (int) zone->gen[GEN_EXCLUSIVECLASS].val); */
/* } */
if ((sfzone->instsamp != NULL) && (sfzone->instsamp->data != NULL)) {
zone->sample = fluid_defsfont_get_sample(sfont, ((SFSample *) sfzone->instsamp->data)->name);
if (zone->sample == NULL) {
FLUID_LOG(FLUID_ERR, "Couldn't find sample name");
return FLUID_FAILED;
}
}
/* fixup sample pointer */
if ((sfzone->instsamp != NULL) && (sfzone->instsamp->data != NULL))
zone->sample = ((SFSample *)(sfzone->instsamp->data))->fluid_sample;
/* Import the modulators (only SF2.1 and higher) */
for (count = 0, r = sfzone->mod; r != NULL; count++) {

View File

@ -113,6 +113,7 @@ typedef struct _SFSample
unsigned char origpitch; /* root midi key number */
signed char pitchadj; /* pitch correction in cents */
unsigned short sampletype; /* 1 mono,2 right,4 left,linked 8,0x8000=ROM */
fluid_sample_t *fluid_sample; /* Imported sample (fixed up in fluid_defsfont_load) */
}
SFSample;
@ -420,7 +421,6 @@ int fluid_defsfont_iteration_next(fluid_defsfont_t* sfont, fluid_preset_t* prese
int fluid_defsfont_load_sampledata(fluid_defsfont_t* sfont);
int fluid_defsfont_add_sample(fluid_defsfont_t* sfont, fluid_sample_t* sample);
int fluid_defsfont_add_preset(fluid_defsfont_t* sfont, fluid_defpreset_t* preset);
fluid_sample_t* fluid_defsfont_get_sample(fluid_defsfont_t* sfont, char *s);
/*