aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2013-12-29 05:58:40 -0800
committerChris Robinson <[email protected]>2013-12-29 05:58:40 -0800
commit396a2f1595b5296af9f23e115fa02090c0f43353 (patch)
treeac851b08e29e70c51b9be23b4b6574ecd6311a1d
parent7640c658ee7c5ed75a781da692189fb206f59d64 (diff)
Don't destroy the fluid_sfont_t if any of its samples are still playing
FluidSynth apparently doesn't check for this itself before calling the free callback.
-rw-r--r--Alc/midi/fluidsynth.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/Alc/midi/fluidsynth.c b/Alc/midi/fluidsynth.c
index 697a95c8..ec4a7345 100644
--- a/Alc/midi/fluidsynth.c
+++ b/Alc/midi/fluidsynth.c
@@ -129,6 +129,18 @@ static void FPreset_Destruct(FPreset *self)
self->NumSamples = 0;
}
+static ALboolean FPreset_canDelete(FPreset *self)
+{
+ ALsizei i;
+
+ for(i = 0;i < self->NumSamples;i++)
+ {
+ if(fluid_sample_refcount(STATIC_CAST(fluid_sample_t, &self->Samples[i])) != 0)
+ return AL_FALSE;
+ }
+ return AL_TRUE;
+}
+
static char* FPreset_getName(fluid_preset_t *preset)
{
return ((FPreset*)preset->data)->Name;
@@ -265,6 +277,14 @@ static void FSfont_Destruct(FSfont *self)
static int FSfont_free(fluid_sfont_t *sfont)
{
FSfont *self = STATIC_UPCAST(FSfont, fluid_sfont_t, sfont);
+ ALsizei i;
+
+ for(i = 0;i < self->NumPresets;i++)
+ {
+ if(!FPreset_canDelete(&self->Presets[i]))
+ return 1;
+ }
+
FSfont_Destruct(self);
free(self);
return 0;