mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2025-04-22 07:30:50 +00:00
Cleanup delete_* functions
This commit is contained in:
parent
7f09321714
commit
b6bdb6b059
1 changed files with 90 additions and 63 deletions
|
@ -258,6 +258,7 @@ static const unsigned short invalid_preset_gen[] = {
|
|||
delete1_fluid_list(_temp); \
|
||||
} while (0)
|
||||
|
||||
|
||||
static int load_body(SFData *sf, unsigned int size);
|
||||
static int process_info(SFData *sf, int size);
|
||||
static int process_sdta(SFData *sf, unsigned int size);
|
||||
|
@ -274,7 +275,6 @@ static int load_shdr(SFData *sf, unsigned int size);
|
|||
static int fixup_pgen(SFData *sf);
|
||||
static int fixup_igen(SFData *sf);
|
||||
static int fixup_sample(SFData *sf);
|
||||
static void free_zone(SFZone *zone);
|
||||
|
||||
static int chunkid(unsigned int id);
|
||||
static int read_listchunk(SFData *sf, SFChunk *chunk);
|
||||
|
@ -285,6 +285,11 @@ static int valid_inst_genid(unsigned short genid);
|
|||
static int valid_preset_genid(unsigned short genid);
|
||||
|
||||
|
||||
static void delete_preset(SFPreset *preset);
|
||||
static void delete_inst(SFInst *inst);
|
||||
static void delete_zone(SFZone *zone);
|
||||
|
||||
|
||||
/*
|
||||
* Open a SoundFont file and parse it's contents into a SFData structure.
|
||||
*
|
||||
|
@ -357,63 +362,50 @@ error_exit:
|
|||
*/
|
||||
void fluid_sf2_close(SFData *sf)
|
||||
{
|
||||
fluid_list_t *p, *p2;
|
||||
fluid_list_t *entry;
|
||||
SFPreset *preset;
|
||||
SFInst *inst;
|
||||
|
||||
if (sf->sffd)
|
||||
sf->fcbs->fclose(sf->sffd);
|
||||
|
||||
if (sf->fname)
|
||||
FLUID_FREE(sf->fname);
|
||||
|
||||
p = sf->info;
|
||||
while (p)
|
||||
{
|
||||
FLUID_FREE(p->data);
|
||||
p = fluid_list_next(p);
|
||||
sf->fcbs->fclose(sf->sffd);
|
||||
}
|
||||
|
||||
FLUID_FREE(sf->fname);
|
||||
|
||||
entry = sf->info;
|
||||
while(entry)
|
||||
{
|
||||
FLUID_FREE(fluid_list_get(entry));
|
||||
entry = fluid_list_next(entry);
|
||||
}
|
||||
delete_fluid_list(sf->info);
|
||||
sf->info = NULL;
|
||||
|
||||
p = sf->preset;
|
||||
while (p)
|
||||
{ /* loop over presets */
|
||||
p2 = ((SFPreset *)(p->data))->zone;
|
||||
while (p2)
|
||||
{ /* loop over preset's zones */
|
||||
free_zone(p2->data);
|
||||
p2 = fluid_list_next(p2);
|
||||
} /* free preset's zone list */
|
||||
delete_fluid_list(((SFPreset *)(p->data))->zone);
|
||||
FLUID_FREE(p->data); /* free preset chunk */
|
||||
p = fluid_list_next(p);
|
||||
entry = sf->preset;
|
||||
while(entry)
|
||||
{
|
||||
preset = (SFPreset *)fluid_list_get(entry);
|
||||
delete_preset(preset);
|
||||
entry = fluid_list_next(entry);
|
||||
}
|
||||
delete_fluid_list(sf->preset);
|
||||
sf->preset = NULL;
|
||||
|
||||
p = sf->inst;
|
||||
while (p)
|
||||
{ /* loop over instruments */
|
||||
p2 = ((SFInst *)(p->data))->zone;
|
||||
while (p2)
|
||||
{ /* loop over inst's zones */
|
||||
free_zone(p2->data);
|
||||
p2 = fluid_list_next(p2);
|
||||
} /* free inst's zone list */
|
||||
delete_fluid_list(((SFInst *)(p->data))->zone);
|
||||
FLUID_FREE(p->data);
|
||||
p = fluid_list_next(p);
|
||||
entry = sf->inst;
|
||||
while(entry)
|
||||
{
|
||||
inst = (SFInst *)fluid_list_get(entry);
|
||||
delete_inst(inst);
|
||||
entry = fluid_list_next(entry);
|
||||
}
|
||||
delete_fluid_list(sf->inst);
|
||||
sf->inst = NULL;
|
||||
|
||||
p = sf->sample;
|
||||
while (p)
|
||||
entry = sf->sample;
|
||||
while(entry)
|
||||
{
|
||||
FLUID_FREE(p->data);
|
||||
p = fluid_list_next(p);
|
||||
FLUID_FREE(fluid_list_get(entry));
|
||||
entry = fluid_list_next(entry);
|
||||
}
|
||||
delete_fluid_list(sf->sample);
|
||||
sf->sample = NULL;
|
||||
|
||||
FLUID_FREE(sf);
|
||||
}
|
||||
|
@ -1156,7 +1148,7 @@ static int load_pgen(SFData *sf, int size)
|
|||
FLUID_LOG(FLUID_WARN, _("Preset \"%s\": Discarding invalid global zone"),
|
||||
((SFPreset *)(p->data))->name);
|
||||
*hz = fluid_list_remove(*hz, p2->data);
|
||||
free_zone((SFZone *)fluid_list_get(p2));
|
||||
delete_zone((SFZone *)fluid_list_get(p2));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1537,7 +1529,7 @@ static int load_igen(SFData *sf, int size)
|
|||
FLUID_LOG(FLUID_WARN, _("Instrument \"%s\": Discarding invalid global zone"),
|
||||
((SFInst *)(p->data))->name);
|
||||
*hz = fluid_list_remove(*hz, p2->data);
|
||||
free_zone((SFZone *)fluid_list_get(p2));
|
||||
delete_zone((SFZone *)fluid_list_get(p2));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1805,33 +1797,68 @@ static int fixup_sample(SFData *sf)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* free all elements of a zone (Preset or Instrument) */
|
||||
static void free_zone(SFZone *zone)
|
||||
static void delete_preset(SFPreset *preset)
|
||||
{
|
||||
fluid_list_t *p;
|
||||
fluid_list_t *entry;
|
||||
SFZone *zone;
|
||||
|
||||
if (!preset)
|
||||
return;
|
||||
|
||||
entry = preset->zone;
|
||||
while(entry)
|
||||
{
|
||||
zone = (SFZone *)fluid_list_get(entry);
|
||||
delete_zone(zone);
|
||||
entry = fluid_list_next(entry);
|
||||
}
|
||||
delete_fluid_list(preset->zone);
|
||||
}
|
||||
|
||||
static void delete_inst(SFInst *inst)
|
||||
{
|
||||
fluid_list_t *entry;
|
||||
SFZone *zone;
|
||||
|
||||
if (!inst)
|
||||
return;
|
||||
|
||||
entry = inst->zone;
|
||||
while(entry)
|
||||
{
|
||||
zone = (SFZone *)fluid_list_get(entry);
|
||||
delete_zone(zone);
|
||||
entry = fluid_list_next(entry);
|
||||
}
|
||||
delete_fluid_list(inst->zone);
|
||||
}
|
||||
|
||||
|
||||
/* Free all elements of a zone (Preset or Instrument) */
|
||||
static void delete_zone(SFZone *zone)
|
||||
{
|
||||
fluid_list_t *entry;
|
||||
|
||||
if (!zone)
|
||||
return;
|
||||
|
||||
p = zone->gen;
|
||||
while (p)
|
||||
{ /* Free gen chunks for this zone */
|
||||
if (p->data)
|
||||
FLUID_FREE(p->data);
|
||||
p = fluid_list_next(p);
|
||||
entry = zone->gen;
|
||||
while(entry)
|
||||
{
|
||||
FLUID_FREE(fluid_list_get(entry));
|
||||
entry = fluid_list_next(entry);
|
||||
}
|
||||
delete_fluid_list(zone->gen); /* free genlist */
|
||||
delete_fluid_list(zone->gen);
|
||||
|
||||
p = zone->mod;
|
||||
while (p)
|
||||
{ /* Free mod chunks for this zone */
|
||||
if (p->data)
|
||||
FLUID_FREE(p->data);
|
||||
p = fluid_list_next(p);
|
||||
entry = zone->mod;
|
||||
while(entry)
|
||||
{
|
||||
FLUID_FREE(fluid_list_get(entry));
|
||||
entry = fluid_list_next(entry);
|
||||
}
|
||||
delete_fluid_list(zone->mod); /* free modlist */
|
||||
delete_fluid_list(zone->mod);
|
||||
|
||||
FLUID_FREE(zone); /* free zone chunk */
|
||||
FLUID_FREE(zone);
|
||||
}
|
||||
|
||||
/* preset sort function, first by bank, then by preset # */
|
||||
|
|
Loading…
Reference in a new issue