mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2025-04-22 07:30:50 +00:00
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:
parent
f164ef2dc4
commit
02690ada63
2 changed files with 7 additions and 28 deletions
|
@ -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++) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue