Update Fluidsynth to v2.0.7
authorRobin Gareus <robin@gareus.org>
Mon, 30 Sep 2019 21:10:33 +0000 (23:10 +0200)
committerRobin Gareus <robin@gareus.org>
Mon, 30 Sep 2019 21:12:32 +0000 (23:12 +0200)
libs/fluidsynth/README
libs/fluidsynth/fluidsynth/misc.h
libs/fluidsynth/src/fluid_defsfont.c
libs/fluidsynth/src/fluid_defsfont.h
libs/fluidsynth/src/fluid_settings.c
libs/fluidsynth/src/fluid_synth.c
libs/fluidsynth/src/fluid_sys.c
libs/fluidsynth/src/fluidsynth_priv.h
tools/fluid-patches/ardour_fluidsynth.diff

index 26640a473f79447adebe08e46ed5d47a4ebc38b3..376a96dfc92183b4c5657a94438c45d69644cc8f 100644 (file)
@@ -1,7 +1,7 @@
 This is a stripped down version of fluidsynth (library only)
 
 from git://github.com/FluidSynth/fluidsynth.git
-rev. v2.0.6-92-gc6030874
+rev. v2.0.7-98-g9ab3e3ab
 
 fluidsynth is licensed in terms of the  LGPL-2+, see individual source
 files for (C) holders.
index 7a2b457b5aa0e97335cf14be1a4a63b109269ab0..e2f5d3f8bbc317a968e0b23d2a2aac233ac42dd6 100644 (file)
@@ -62,6 +62,7 @@ extern "C" {
 
 FLUIDSYNTH_API int fluid_is_soundfont(const char *filename);
 FLUIDSYNTH_API int fluid_is_midifile(const char *filename);
+FLUIDSYNTH_API void fluid_free(void* ptr);
 
 
 #ifdef __cplusplus
index 8defa705193cc0dfe86163fac28c8c83c0035754..4639574dd9e147c99a9fbd65e18aad06bbc663b7 100644 (file)
@@ -1151,7 +1151,7 @@ new_fluid_preset_zone(char *name)
 /*
  * delete list of modulators.
  */
-static void delete_fluid_list_mod(fluid_mod_t *mod)
+void delete_fluid_list_mod(fluid_mod_t *mod)
 {
     fluid_mod_t *tmp;
 
index 3d90e69b06773a4c52552af9b1aab23665bf51dc..7f50faa694693d92632d7ad3e7c2cd66c37cf78a 100644 (file)
@@ -178,6 +178,7 @@ struct _fluid_preset_zone_t
 };
 
 fluid_preset_zone_t *new_fluid_preset_zone(char *name);
+void delete_fluid_list_mod(fluid_mod_t *mod);
 void delete_fluid_preset_zone(fluid_preset_zone_t *zone);
 fluid_preset_zone_t *fluid_preset_zone_next(fluid_preset_zone_t *zone);
 int fluid_preset_zone_import_sfont(fluid_preset_zone_t *zone, SFZone *sfzone, fluid_defsfont_t *defssfont);
index 18111698461903f935b2c51532f8b33a570f6392..a825603a4425d27b297ec5e807815896a41be8ba 100644 (file)
@@ -1047,7 +1047,7 @@ fluid_settings_copystr(fluid_settings_t *settings, const char *name,
  * @since 1.1.0
  *
  * Like fluid_settings_copystr() but allocates a new copy of the string.  Caller
- * owns the string and should free it with free() when done using it.
+ * owns the string and should free it with fluid_free() when done using it.
  */
 int
 fluid_settings_dupstr(fluid_settings_t *settings, const char *name, char **str)
@@ -1116,7 +1116,7 @@ fluid_settings_dupstr(fluid_settings_t *settings, const char *name, char **str)
  * @param settings a settings object
  * @param name a setting's name
  * @param s a string to be tested
- * @return TRUE if the value exists and is equal to 's', FALSE otherwise
+ * @return TRUE if the value exists and is equal to \c s, FALSE otherwise
  */
 int
 fluid_settings_str_equal(fluid_settings_t *settings, const char *name, const char *s)
@@ -1644,7 +1644,7 @@ int fluid_settings_getint_default(fluid_settings_t *settings, const char *name,
  * @param data any user provided pointer
  * @param func callback function to be called on each iteration
  *
- * @note Starting with FluidSynth 1.1.0 the \a func callback is called for each
+ * @note Starting with FluidSynth 1.1.0 the \p func callback is called for each
  * option in alphabetical order.  Sort order was undefined in previous versions.
  */
 void
@@ -1727,7 +1727,7 @@ fluid_settings_option_count(fluid_settings_t *settings, const char *name)
  * @param name Settings name
  * @param separator String to use between options (NULL to use ", ")
  * @return Newly allocated string or NULL on error (out of memory, not a valid
- *   setting \a name or not a string setting).  Free the string when finished with it.
+ *   setting \p name or not a string setting). Free the string when finished with it by using fluid_free().
  * @since 1.1.0
  */
 char *
@@ -1869,7 +1869,7 @@ fluid_settings_foreach_iter(void *key, void *value, void *data)
  * @param data any user provided pointer
  * @param func callback function to be called on each iteration
  *
- * @note Starting with FluidSynth 1.1.0 the \a func callback is called for each
+ * @note Starting with FluidSynth 1.1.0 the \p func callback is called for each
  * setting in alphabetical order.  Sort order was undefined in previous versions.
  */
 void
index 42064f93d650c866de118278f70618028e20dfb6..570a2535cde0be0beed6c72c5152a44db3dd9abb 100644 (file)
@@ -131,11 +131,6 @@ static void fluid_synth_handle_reverb_chorus_int(void *data, const char *name, i
 static void fluid_synth_reset_basic_channel_LOCAL(fluid_synth_t *synth, int chan, int nbr_chan);
 static int fluid_synth_check_next_basic_channel(fluid_synth_t *synth, int basicchan, int mode, int val);
 static void fluid_synth_set_basic_channel_LOCAL(fluid_synth_t *synth, int basicchan, int mode, int val);
-static int fluid_synth_set_reverb_full_LOCAL(fluid_synth_t *synth, int set, double roomsize,
-        double damping, double width, double level);
-
-static int fluid_synth_set_chorus_full_LOCAL(fluid_synth_t *synth, int set, int nr, double level,
-        double speed, double depth_ms, int type);
 
 /***************************************************************
  *
@@ -915,7 +910,7 @@ new_fluid_synth(fluid_settings_t *settings)
         fluid_settings_getnum(settings, "synth.reverb.width", &width);
         fluid_settings_getnum(settings, "synth.reverb.level", &level);
 
-        fluid_synth_set_reverb_full_LOCAL(synth,
+        fluid_synth_set_reverb_full(synth,
                                           FLUID_REVMODEL_SET_ALL,
                                           room,
                                           damp,
@@ -931,7 +926,7 @@ new_fluid_synth(fluid_settings_t *settings)
         fluid_settings_getnum(settings, "synth.chorus.speed", &speed);
         fluid_settings_getnum(settings, "synth.chorus.depth", &depth);
 
-        fluid_synth_set_chorus_full_LOCAL(synth,
+        fluid_synth_set_chorus_full(synth,
                                           FLUID_CHORUS_SET_ALL,
                                           i,
                                           level,
@@ -987,8 +982,6 @@ delete_fluid_synth(fluid_synth_t *synth)
     fluid_list_t *list;
     fluid_sfont_t *sfont;
     fluid_sfloader_t *loader;
-    fluid_mod_t *default_mod;
-    fluid_mod_t *mod;
 
     fluid_return_if_fail(synth != NULL);
 
@@ -1107,14 +1100,7 @@ delete_fluid_synth(fluid_synth_t *synth)
 #endif
 
     /* delete all default modulators */
-    default_mod = synth->default_mod;
-
-    while(default_mod != NULL)
-    {
-        mod = default_mod;
-        default_mod = mod->next;
-        delete_fluid_mod(mod);
-    }
+    delete_fluid_list_mod(synth->default_mod);
 
     FLUID_FREE(synth->overflow.important_channels);
 
@@ -1354,6 +1340,7 @@ fluid_synth_add_default_mod(fluid_synth_t *synth, const fluid_mod_t *mod, int mo
 
     fluid_return_val_if_fail(synth != NULL, FLUID_FAILED);
     fluid_return_val_if_fail(mod != NULL, FLUID_FAILED);
+    fluid_return_val_if_fail((mode == FLUID_SYNTH_ADD) || (mode == FLUID_SYNTH_OVERWRITE) , FLUID_FAILED);
 
     /* Checks if modulators sources are valid */
     if(!fluid_mod_check_sources(mod, "api fluid_synth_add_default_mod mod"))
@@ -1373,14 +1360,10 @@ fluid_synth_add_default_mod(fluid_synth_t *synth, const fluid_mod_t *mod, int mo
             {
                 default_mod->amount += mod->amount;
             }
-            else if(mode == FLUID_SYNTH_OVERWRITE)
+            else // mode == FLUID_SYNTH_OVERWRITE
             {
                 default_mod->amount = mod->amount;
             }
-            else
-            {
-                FLUID_API_RETURN(FLUID_FAILED);
-            }
 
             FLUID_API_RETURN(FLUID_OK);
         }
@@ -1419,7 +1402,7 @@ fluid_synth_add_default_mod(fluid_synth_t *synth, const fluid_mod_t *mod, int mo
  * @param mod The modulator to remove
  * @return #FLUID_OK if a matching modulator was found and successfully removed, #FLUID_FAILED otherwise
  *
- * @note Not realtime safe (due to internal memory allocation) and therefore should not be called
+ * @note Not realtime safe (due to internal memory freeing) and therefore should not be called
  * from synthesis context at the risk of stalling audio output.
  */
 int
@@ -1440,7 +1423,7 @@ fluid_synth_remove_default_mod(fluid_synth_t *synth, const fluid_mod_t *mod)
         {
             if(synth->default_mod == default_mod)
             {
-                synth->default_mod = synth->default_mod->next;
+                synth->default_mod = default_mod->next;
             }
             else
             {
@@ -5072,6 +5055,7 @@ fluid_synth_set_reverb_full(fluid_synth_t *synth, int set, double roomsize,
                             double damping, double width, double level)
 {
     int ret;
+    fluid_rvoice_param_t param[MAX_EVENT_PARAMS];
 
     fluid_return_val_if_fail(synth != NULL, FLUID_FAILED);
     /* if non of the flags is set, fail */
@@ -5080,16 +5064,6 @@ fluid_synth_set_reverb_full(fluid_synth_t *synth, int set, double roomsize,
     /* Synth shadow values are set here so that they will be returned if querried */
 
     fluid_synth_api_enter(synth);
-    ret = fluid_synth_set_reverb_full_LOCAL(synth, set, roomsize, damping, width, level);
-    FLUID_API_RETURN(ret);
-}
-
-static int
-fluid_synth_set_reverb_full_LOCAL(fluid_synth_t *synth, int set, double roomsize,
-                                  double damping, double width, double level)
-{
-    int ret;
-    fluid_rvoice_param_t param[MAX_EVENT_PARAMS];
 
     if(set & FLUID_REVMODEL_SET_ROOMSIZE)
     {
@@ -5121,7 +5095,7 @@ fluid_synth_set_reverb_full_LOCAL(fluid_synth_t *synth, int set, double roomsize
                                          fluid_rvoice_mixer_set_reverb_params,
                                          synth->eventhandler->mixer,
                                          param);
-    return ret;
+    FLUID_API_RETURN(ret);
 }
 
 /**
@@ -5287,6 +5261,7 @@ fluid_synth_set_chorus_full(fluid_synth_t *synth, int set, int nr, double level,
                             double speed, double depth_ms, int type)
 {
     int ret;
+    fluid_rvoice_param_t param[MAX_EVENT_PARAMS];
 
     fluid_return_val_if_fail(synth != NULL, FLUID_FAILED);
     /* if non of the flags is set, fail */
@@ -5295,18 +5270,6 @@ fluid_synth_set_chorus_full(fluid_synth_t *synth, int set, int nr, double level,
     /* Synth shadow values are set here so that they will be returned if queried */
     fluid_synth_api_enter(synth);
 
-    ret = fluid_synth_set_chorus_full_LOCAL(synth, set, nr, level, speed, depth_ms, type);
-
-    FLUID_API_RETURN(ret);
-}
-
-static int
-fluid_synth_set_chorus_full_LOCAL(fluid_synth_t *synth, int set, int nr, double level,
-                                  double speed, double depth_ms, int type)
-{
-    int ret;
-    fluid_rvoice_param_t param[MAX_EVENT_PARAMS];
-
     if(set & FLUID_CHORUS_SET_NR)
     {
         synth->chorus_nr = nr;
@@ -5343,7 +5306,7 @@ fluid_synth_set_chorus_full_LOCAL(fluid_synth_t *synth, int set, int nr, double
                                          synth->eventhandler->mixer,
                                          param);
 
-    return (ret);
+    FLUID_API_RETURN(ret);
 }
 
 /**
index 938c05cf22782d321d8b8d8c705e0f0606d44c64..f6c56d39956f234b0814c0db3d7686115a7c7d82 100644 (file)
@@ -192,6 +192,17 @@ fluid_log(int level, const char *fmt, ...)
     return FLUID_FAILED;
 }
 
+/**
+ * Convenience wrapper for free() that satisfies at least C90 requirements.
+ * Especially useful when using fluidsynth with programming languages that do not provide malloc() and free().
+ * @note Only use this function when the API documentation explicitly says so. Otherwise use adequate \c delete_fluid_* functions.
+ * @since 2.0.7
+ */
+void fluid_free(void* ptr)
+{
+    free(ptr);
+}
+
 /**
  * An improved strtok, still trashes the input string, but is portable and
  * thread safe.  Also skips token chars at beginning of token string and never
index 659aa53a0a70560474a9d6dfa58fa3ad85933222..1567a10a8c70ab7e1c3bca7f28c7a795446f8c6e 100644 (file)
@@ -186,7 +186,7 @@ typedef void (*fluid_rvoice_function_t)(void *obj, const fluid_rvoice_param_t pa
 #define FLUID_NEW(_t)                (_t*)malloc(sizeof(_t))
 #define FLUID_ARRAY_ALIGNED(_t,_n,_a) (_t*)malloc((_n)*sizeof(_t) + ((unsigned int)_a - 1u))
 #define FLUID_ARRAY(_t,_n)           FLUID_ARRAY_ALIGNED(_t,_n,1u)
-#define FLUID_FREE(_p)               free(_p)
+#define FLUID_FREE(_p)               fluid_free(_p)
 
 /* File access */
 #define FLUID_FOPEN(_f,_m)           fopen(_f,_m)
index 70c2a2275a2e6caf8eaccb659190509a3b763654..68251eb522663ddf1dcce835860b9d0b7881b2e1 100644 (file)
@@ -163,7 +163,7 @@ index 4ee072e4b9..1b3fceb342 100644
  typedef struct _fluid_rvoice_mixer_t fluid_rvoice_mixer_t;
  
 diff --git b/libs/fluidsynth/src/fluid_settings.c a/libs/fluidsynth/src/fluid_settings.c
-index 5b2b08748f..1811169846 100644
+index 78532ad2a3..a825603a44 100644
 --- b/libs/fluidsynth/src/fluid_settings.c
 +++ a/libs/fluidsynth/src/fluid_settings.c
 @@ -21,9 +21,6 @@
@@ -191,7 +191,7 @@ index 5b2b08748f..1811169846 100644
  
  static int
 diff --git b/libs/fluidsynth/src/fluid_synth.c a/libs/fluidsynth/src/fluid_synth.c
-index 426d3c4fc0..42064f93d6 100644
+index 3f602b88d1..570a2535cd 100644
 --- b/libs/fluidsynth/src/fluid_synth.c
 +++ a/libs/fluidsynth/src/fluid_synth.c
 @@ -25,7 +25,6 @@
@@ -202,7 +202,7 @@ index 426d3c4fc0..42064f93d6 100644
  
  #ifdef TRAP_ON_FPE
  #define _GNU_SOURCE
-@@ -268,7 +267,7 @@ void fluid_version(int *major, int *minor, int *micro)
+@@ -263,7 +262,7 @@ void fluid_version(int *major, int *minor, int *micro)
   * @return FluidSynth version string, which is internal and should not be
   *   modified or freed.
   */
@@ -211,7 +211,7 @@ index 426d3c4fc0..42064f93d6 100644
  fluid_version_str(void)
  {
      return FLUIDSYNTH_VERSION;
-@@ -5509,7 +5508,7 @@ fluid_synth_set_interp_method(fluid_synth_t *synth, int chan, int interp_method)
+@@ -5472,7 +5471,7 @@ fluid_synth_set_interp_method(fluid_synth_t *synth, int chan, int interp_method)
      }
  
      FLUID_API_RETURN(FLUID_OK);
@@ -220,7 +220,7 @@ index 426d3c4fc0..42064f93d6 100644
  
  /**
   * Get the total count of MIDI channels.
-@@ -6447,6 +6446,7 @@ int fluid_synth_set_channel_type(fluid_synth_t *synth, int chan, int type)
+@@ -6410,6 +6409,7 @@ int fluid_synth_set_channel_type(fluid_synth_t *synth, int chan, int type)
      FLUID_API_RETURN(FLUID_OK);
  }
  
@@ -228,7 +228,7 @@ index 426d3c4fc0..42064f93d6 100644
  /**
   * Return the LADSPA effects instance used by FluidSynth
   *
-@@ -6459,6 +6459,7 @@ fluid_ladspa_fx_t *fluid_synth_get_ladspa_fx(fluid_synth_t *synth)
+@@ -6422,6 +6422,7 @@ fluid_ladspa_fx_t *fluid_synth_get_ladspa_fx(fluid_synth_t *synth)
  
      return synth->ladspa_fx;
  }
@@ -260,10 +260,10 @@ index 0b9758bad5..fe222f7b6f 100644
      enum fluid_iir_filter_flags custom_filter_flags; /**< filter type of the user-defined filter currently used for all voices */
  };
 diff --git b/libs/fluidsynth/src/fluid_sys.c a/libs/fluidsynth/src/fluid_sys.c
-index 5d123883b3..938c05cf22 100644
+index 8128fbba91..f6c56d3995 100644
 --- b/libs/fluidsynth/src/fluid_sys.c
 +++ a/libs/fluidsynth/src/fluid_sys.c
-@@ -205,9 +205,10 @@ fluid_log(int level, const char *fmt, ...)
+@@ -216,9 +216,10 @@ void fluid_free(void* ptr)
   * @param delim String of delimiter chars.
   * @return Pointer to the next token or NULL if no more tokens.
   */