Update Fluidsynth to v2.0.4
authorRobin Gareus <robin@gareus.org>
Sat, 23 Feb 2019 16:58:05 +0000 (17:58 +0100)
committerRobin Gareus <robin@gareus.org>
Sat, 23 Feb 2019 17:41:05 +0000 (18:41 +0100)
see https://github.com/FluidSynth/fluidsynth/releases/tag/v2.0.4

27 files changed:
libs/fluidsynth/README
libs/fluidsynth/config.h
libs/fluidsynth/src/fluid_chan.c
libs/fluidsynth/src/fluid_chan.h
libs/fluidsynth/src/fluid_conv.c
libs/fluidsynth/src/fluid_defsfont.c
libs/fluidsynth/src/fluid_defsfont.h
libs/fluidsynth/src/fluid_gen.c
libs/fluidsynth/src/fluid_gen.h
libs/fluidsynth/src/fluid_hash.c
libs/fluidsynth/src/fluid_midi.c
libs/fluidsynth/src/fluid_ringbuffer.c
libs/fluidsynth/src/fluid_rvoice_dsp.c
libs/fluidsynth/src/fluid_rvoice_mixer.c
libs/fluidsynth/src/fluid_samplecache.c
libs/fluidsynth/src/fluid_settings.c
libs/fluidsynth/src/fluid_sffile.c
libs/fluidsynth/src/fluid_sfont.c
libs/fluidsynth/src/fluid_synth.c
libs/fluidsynth/src/fluid_synth.h
libs/fluidsynth/src/fluid_sys.c
libs/fluidsynth/src/fluid_sys.h
libs/fluidsynth/src/fluid_tuning.c
libs/fluidsynth/src/fluid_voice.c
libs/fluidsynth/src/fluid_voice.h
libs/fluidsynth/src/fluidsynth_priv.h
tools/fluid-patches/ardour_fluidsynth.diff

index 3fcf3159f092bb37d11dc5ebc844a94cb885b064..754d0e9117951940affcb0a101adf95fa7978060 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.3-16-g8b18205
+rev. v2.0.4-32-g5f8fa6f5
 
 fluidsynth is licensed in terms of the  LGPL-2+, see individual source
 files for (C) holders.
index 47c5c27b48cd14e228a8a69f9d72ce744d9be596..7478013c3fb1520c035be76643b3659428d2e649 100644 (file)
@@ -3,8 +3,8 @@
 
 #define FLUIDSYNTH_VERSION_MAJOR 2
 #define FLUIDSYNTH_VERSION_MINOR 0
-#define FLUIDSYNTH_VERSION_MICRO 2
-#define FLUIDSYNTH_VERSION "2.0.2"
+#define FLUIDSYNTH_VERSION_MICRO 4
+#define FLUIDSYNTH_VERSION "2.0.4"
 
 /* Define to enable ALSA driver */
 /* #undef ALSA_SUPPORT */
 /* #undef TRAP_ON_FPE */
 
 /* Version number of package */
-#define VERSION "1.1.6"
+#define VERSION "2.0.4"
 
 /* Define to do all DSP in single floating point precision */
 /* #undef WITH_FLOAT */
index 49ef99ecbef9e59db56c90eabc8a063cecad1f87..365c0fd2a14b11afa513914fffa12e54f9808d27 100644 (file)
@@ -128,7 +128,6 @@ fluid_channel_init_ctrl(fluid_channel_t *chan, int is_all_ctrl_off)
     for(i = 0; i < GEN_LAST; i++)
     {
         chan->gen[i] = 0.0f;
-        chan->gen_abs[i] = 0;
     }
 
     if(is_all_ctrl_off)
index 42d73df7b53fd88502d9f7536f3a164465f5d7ac..a9ca1bcabbec688575243a7b3bd1b6a5e9dad63f 100644 (file)
@@ -129,18 +129,6 @@ struct _fluid_channel_t
      * applied to future notes. They are copied to a voice's generators
      * in fluid_voice_init(), which calls fluid_gen_init().  */
     fluid_real_t gen[GEN_LAST];
-
-    /* By default, the NRPN values are relative to the values of the
-     * generators set in the SoundFont. For example, if the NRPN
-     * specifies an attack of 100 msec then 100 msec will be added to the
-     * combined attack time of the sound font and the modulators.
-     *
-     * However, it is useful to be able to specify the generator value
-     * absolutely, completely ignoring the generators of the SoundFont
-     * and the values of modulators. The gen_abs field, is a boolean
-     * flag indicating whether the NRPN value is absolute or not.
-     */
-    char gen_abs[GEN_LAST];
 };
 
 fluid_channel_t *new_fluid_channel(fluid_synth_t *synth, int num);
@@ -200,9 +188,8 @@ void fluid_channel_get_sfont_bank_prog(fluid_channel_t *chan, int *sfont,
 #define fluid_channel_legato(_c)                           ((_c)->cc[LEGATO_SWITCH] >= 64)
 #define fluid_channel_sustained(_c)             ((_c)->cc[SUSTAIN_SWITCH] >= 64)
 #define fluid_channel_sostenuto(_c)             ((_c)->cc[SOSTENUTO_SWITCH] >= 64)
-#define fluid_channel_set_gen(_c, _n, _v, _a)   { (_c)->gen[_n] = _v; (_c)->gen_abs[_n] = _a; }
+#define fluid_channel_set_gen(_c, _n, _v)   { (_c)->gen[_n] = _v; }
 #define fluid_channel_get_gen(_c, _n)           ((_c)->gen[_n])
-#define fluid_channel_get_gen_abs(_c, _n)       ((_c)->gen_abs[_n])
 #define fluid_channel_get_min_note_length_ticks(chan) \
   ((chan)->synth->min_note_length_ticks)
 
index 483b371d5e9aa43fbe1696b0f232095abc74472d..6e169b038f7b5aab508b56461ff1389be459d10b 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 #include "fluid_conv.h"
+#include "fluid_sys.h"
 #include "fluid_conv_tables.c"
 
 /*
index d7960cbb9c5458ab490d9776db8ade58e7e62964..ae8a9fb2da970644b6c00b7310ae6269845536ec 100644 (file)
@@ -1015,7 +1015,7 @@ fluid_defpreset_import_sfont(fluid_defpreset_t *defpreset,
     while(p != NULL)
     {
         sfzone = (SFZone *)fluid_list_get(p);
-        FLUID_SNPRINTF(zone_name, sizeof(zone_name), "%s/%d", defpreset->name, count);
+        FLUID_SNPRINTF(zone_name, sizeof(zone_name), "pz:%s/%d", defpreset->name, count);
         zone = new_fluid_preset_zone(zone_name);
 
         if(zone == NULL)
@@ -1133,7 +1133,7 @@ new_fluid_preset_zone(char *name)
     /* Flag all generators as unused (default, they will be set when they are found
      * in the sound font).
      * This also sets the generator values to default, but that is of no concern here.*/
-    fluid_gen_set_default_values(&zone->gen[0]);
+    fluid_gen_init(&zone->gen[0], NULL);
     zone->mod = NULL; /* list of modulators */
     return zone;
 }
@@ -1605,7 +1605,7 @@ fluid_preset_zone_import_sfont(fluid_preset_zone_t *zone, SFZone *sfzone, fluid_
 
         if(zone->inst == NULL)
         {
-            zone->inst = fluid_inst_import_sfont(zone, sfinst, defsfont);
+            zone->inst = fluid_inst_import_sfont(sfinst, defsfont);
         }
 
         if(zone->inst == NULL)
@@ -1697,7 +1697,7 @@ fluid_inst_set_global_zone(fluid_inst_t *inst, fluid_inst_zone_t *zone)
  * fluid_inst_import_sfont
  */
 fluid_inst_t *
-fluid_inst_import_sfont(fluid_preset_zone_t *preset_zone, SFInst *sfinst, fluid_defsfont_t *defsfont)
+fluid_inst_import_sfont(SFInst *sfinst, fluid_defsfont_t *defsfont)
 {
     fluid_list_t *p;
     fluid_inst_t *inst;
@@ -1733,9 +1733,8 @@ fluid_inst_import_sfont(fluid_preset_zone_t *preset_zone, SFInst *sfinst, fluid_
     {
 
         sfzone = (SFZone *)fluid_list_get(p);
-        /* integrates preset zone name in instrument zone name */
-        FLUID_SNPRINTF(zone_name, sizeof(zone_name), "%s/%s/%d", preset_zone->name,
-                       inst->name, count);
+        /* instrument zone name */
+        FLUID_SNPRINTF(zone_name, sizeof(zone_name), "iz:%s/%d", inst->name, count);
 
         inst_zone = new_fluid_inst_zone(zone_name);
 
@@ -1844,7 +1843,7 @@ new_fluid_inst_zone(char *name)
     zone->range.ignore = FALSE;
     /* Flag the generators as unused.
      * This also sets the generator values to default, but they will be overwritten anyway, if used.*/
-    fluid_gen_set_default_values(&zone->gen[0]);
+    fluid_gen_init(&zone->gen[0], NULL);
     zone->mod = NULL; /* list of modulators */
     return zone;
 }
index 8b24934d816f5e36209bee4b012723fea335a972..86f782f96aa22d12a938bcae4157649e96410daf 100644 (file)
@@ -196,7 +196,7 @@ struct _fluid_inst_t
 };
 
 fluid_inst_t *new_fluid_inst(void);
-fluid_inst_t *fluid_inst_import_sfont(fluid_preset_zone_t *preset_zone, SFInst *sfinst, fluid_defsfont_t *defsfont);
+fluid_inst_t *fluid_inst_import_sfont(SFInst *sfinst, fluid_defsfont_t *defsfont);
 void delete_fluid_inst(fluid_inst_t *inst);
 int fluid_inst_set_global_zone(fluid_inst_t *inst, fluid_inst_zone_t *zone);
 int fluid_inst_add_zone(fluid_inst_t *inst, fluid_inst_zone_t *zone);
index 0d07d786c6d0cd456d8e5e57507ae106f782fdc6..cf3cc48b469b647237f7be33396dabc2998ffcf6 100644 (file)
@@ -92,54 +92,22 @@ static const fluid_gen_info_t fluid_gen_info[] =
     { GEN_CUSTOM_FILTERQ,         1,     1,       0.0f,    960.0f,       0.0f }
 };
 
-
-/**
- * Set an array of generators to their default values.
- * @param gen Array of generators (should be #GEN_LAST in size).
- * @return Always returns #FLUID_OK
- */
-int
-fluid_gen_set_default_values(fluid_gen_t *gen)
-{
-    int i;
-
-    for(i = 0; i < GEN_LAST; i++)
-    {
-        gen[i].flags = GEN_UNUSED;
-        gen[i].mod = 0.0;
-        gen[i].nrpn = 0.0;
-        gen[i].val = fluid_gen_info[i].def;
-    }
-
-    return FLUID_OK;
-}
-
-
 /* fluid_gen_init
  *
  * Set an array of generators to their initial value
  */
-int
+void
 fluid_gen_init(fluid_gen_t *gen, fluid_channel_t *channel)
 {
     int i;
 
-    fluid_gen_set_default_values(gen);
-
     for(i = 0; i < GEN_LAST; i++)
     {
-        gen[i].nrpn = fluid_channel_get_gen(channel, i);
-
-        /* This is an extension to the SoundFont standard. More
-         * documentation is available at the fluid_synth_set_gen2()
-         * function. */
-        if(fluid_channel_get_gen_abs(channel, i))
-        {
-            gen[i].flags = GEN_ABS_NRPN;
-        }
+        gen[i].flags = GEN_UNUSED;
+        gen[i].mod = 0.0;
+        gen[i].nrpn = (channel == NULL) ? 0.0 : fluid_channel_get_gen(channel, i);
+        gen[i].val = fluid_gen_info[i].def;
     }
-
-    return FLUID_OK;
 }
 
 fluid_real_t fluid_gen_scale(int gen, float value)
index d156b807b9ee7d3dd557c87adb915f67b4dd9350..76d168c25fe64137f99dd5e1cacb934245e92d13 100644 (file)
@@ -31,7 +31,7 @@ typedef struct _fluid_gen_info_t
     char nrpn_scale;   /* The scale to convert from NRPN (cfr. fluid_gen_map_nrpn()) */
     float min;         /* The minimum value */
     float max;         /* The maximum value */
-    float def;         /* The default value (cfr. fluid_gen_set_default_values()) */
+    float def;         /* The default value (cfr. fluid_gen_init()) */
 } fluid_gen_info_t;
 
 /*
@@ -52,7 +52,6 @@ enum fluid_gen_flags
 {
     GEN_UNUSED,                /**< Generator value is not set */
     GEN_SET,           /**< Generator value is set */
-    GEN_ABS_NRPN               /**< Generator is an absolute value */
 };
 
 #define fluid_gen_set_mod(_gen, _val)  { (_gen)->mod = (double) (_val); }
@@ -60,8 +59,7 @@ enum fluid_gen_flags
 
 fluid_real_t fluid_gen_scale(int gen, float value);
 fluid_real_t fluid_gen_scale_nrpn(int gen, int nrpn);
-int fluid_gen_init(fluid_gen_t *gen, fluid_channel_t *channel);
-int fluid_gen_set_default_values(fluid_gen_t *gen);
+void fluid_gen_init(fluid_gen_t *gen, fluid_channel_t *channel);
 
 
 #endif /* _FLUID_GEN_H */
index b6586895b50e4a28a70ea565af788264f0bf9ae2..79f83a4583e92e5640c8aa1847e20d6e4fb68cff 100644 (file)
@@ -31,7 +31,7 @@
  * MT safe
  */
 
-#include "fluidsynth_priv.h"
+#include "fluid_sys.h"
 #include "fluid_hash.h"
 #include "fluid_list.h"
 
index 8deb0b0d1bd463423270b1b11f8e88125b0ad8eb..73551a6d8c9c671273d897bc3d926f2c9e4c3842 100644 (file)
@@ -34,6 +34,7 @@ static long fluid_getlength(unsigned char *s);
  * Note: This rewinds the file to the start before reading.
  * Returns NULL if there was an error reading or allocating memory.
  */
+typedef FILE  *fluid_file;
 static char *fluid_file_read_full(fluid_file fp, size_t *length);
 static void fluid_midi_event_set_sysex_LOCAL(fluid_midi_event_t *evt, int type, void *data, int size, int dynamic);
 static void fluid_midi_event_get_sysex_LOCAL(fluid_midi_event_t *evt, void **data, int *size);
@@ -92,17 +93,23 @@ static int fluid_midi_file_get_division(fluid_midi_file *midifile);
  */
 int fluid_is_midifile(const char *filename)
 {
-    FILE    *fp = FLUID_FOPEN(filename, "rb");
+    FILE    *fp;
     uint32_t id;
     int      retcode = FALSE;
 
     do
     {
-        if(fp == NULL)
+        if(!fluid_file_test(filename, G_FILE_TEST_IS_REGULAR))
         {
             return retcode;
         }
-
+        
+        // file seems to exist and is a regular file or a symlink to such
+        if((fp = FLUID_FOPEN(filename, "rb")) == NULL)
+        {
+            return retcode;
+        }
+        
         if(FLUID_FREAD(&id, sizeof(id), 1, fp) != 1)
         {
             break;
index 71fd1e48a3b6aa170811d3c92d6c62e7b198ac99..e67200111cd2754d2bfd2d017a78e7437ca0fd65 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 #include "fluid_ringbuffer.h"
-#include "fluidsynth_priv.h"
+#include "fluid_sys.h"
 
 
 /**
index 25f4a4b8b95a0a3276768ced70b775c7bbadb0e5..aec79aab5e72639c8d181bda6ecaf596dc2c9e32 100644 (file)
  * 02110-1301, USA
  */
 
-#include "fluidsynth_priv.h"
+#include "fluid_sys.h"
 #include "fluid_phase.h"
 #include "fluid_rvoice.h"
-#include "fluid_sys.h"
 #include "fluid_rvoice_dsp_tables.c"
 
 /* Purpose:
index 9acc5f83094db6c6e5acc210c1ab8e7c8732d674..5ea08ff6fad2e844407713be31bcc8b82cde76dc 100644 (file)
@@ -23,7 +23,6 @@
 #include "fluid_sys.h"
 #include "fluid_rev.h"
 #include "fluid_chorus.h"
-#include "fluidsynth_priv.h"
 #include "fluid_synth.h"
 
 
index 036964f5843594d8d498231e8bad944bf6e1c648..f464f178b7640df0e753ad232d89fecb45e1a82b 100644 (file)
@@ -29,7 +29,6 @@
 
 #include "fluid_samplecache.h"
 #include "fluid_sys.h"
-#include "fluidsynth.h"
 #include "fluid_list.h"
 
 
index 9207ab063e7acdb62d42e00d54a2cc29805d8208..18111698461903f935b2c51532f8b33a570f6392 100644 (file)
@@ -456,7 +456,7 @@ fluid_settings_set(fluid_settings_t *settings, const char *name, fluid_setting_n
             else
             {
                 /* path ends prematurely */
-                FLUID_LOG(FLUID_WARN, "'%s' is not a node. Name of the setting was '%s'", tokens[n], name);
+                FLUID_LOG(FLUID_ERR, "'%s' is not a node. Name of the setting was '%s'", tokens[n], name);
                 return FLUID_FAILED;
             }
 
@@ -549,7 +549,7 @@ fluid_settings_register_str(fluid_settings_t *settings, const char *name, const
         }
         else
         {
-            FLUID_LOG(FLUID_WARN, "Type mismatch on setting '%s'", name);
+            FLUID_LOG(FLUID_ERR, "Failed to register string setting '%s' as it already exists with a different type", name);
         }
     }
 
@@ -611,7 +611,7 @@ fluid_settings_register_num(fluid_settings_t *settings, const char *name, double
         else
         {
             /* type mismatch */
-            FLUID_LOG(FLUID_WARN, "Type mismatch on setting '%s'", name);
+            FLUID_LOG(FLUID_ERR, "Failed to register numeric setting '%s' as it already exists with a different type", name);
         }
     }
 
@@ -673,7 +673,7 @@ fluid_settings_register_int(fluid_settings_t *settings, const char *name, int de
         else
         {
             /* type mismatch */
-            FLUID_LOG(FLUID_WARN, "Type mismatch on setting '%s'", name);
+            FLUID_LOG(FLUID_ERR, "Failed to register int setting '%s' as it already exists with a different type", name);
         }
     }
 
@@ -935,6 +935,7 @@ fluid_settings_setstr(fluid_settings_t *settings, const char *name, const char *
     if((fluid_settings_get(settings, name, &node) != FLUID_OK)
             || (node->type != FLUID_STR_TYPE))
     {
+        FLUID_LOG(FLUID_ERR, "Unknown string setting '%s'", name);
         goto error_recovery;
     }
 
@@ -1312,6 +1313,7 @@ fluid_settings_setnum(fluid_settings_t *settings, const char *name, double val)
     if((fluid_settings_get(settings, name, &node) != FLUID_OK)
             || (node->type != FLUID_NUM_TYPE))
     {
+        FLUID_LOG(FLUID_ERR, "Unknown numeric setting '%s'", name);
         goto error_recovery;
     }
 
@@ -1319,7 +1321,7 @@ fluid_settings_setnum(fluid_settings_t *settings, const char *name, double val)
 
     if(val < setting->min || val > setting->max)
     {
-        FLUID_LOG(FLUID_DBG, "requested set value for %s out of range", name);
+        FLUID_LOG(FLUID_ERR, "requested set value for '%s' out of range", name);
         goto error_recovery;
     }
 
@@ -1496,6 +1498,7 @@ fluid_settings_setint(fluid_settings_t *settings, const char *name, int val)
     if((fluid_settings_get(settings, name, &node) != FLUID_OK)
             || (node->type != FLUID_INT_TYPE))
     {
+        FLUID_LOG(FLUID_ERR, "Unknown integer parameter '%s'", name);
         goto error_recovery;
     }
 
@@ -1503,7 +1506,7 @@ fluid_settings_setint(fluid_settings_t *settings, const char *name, int val)
 
     if(val < setting->min || val > setting->max)
     {
-        FLUID_LOG(FLUID_DBG, "requested set value for %s out of range", name);
+        FLUID_LOG(FLUID_ERR, "requested set value for setting '%s' out of range", name);
         goto error_recovery;
     }
 
index 302eea72a743b82729e30b93e9b84bec62a28097..b5a641b63d2a82b9a8931d5444abe5dc4089a2e6 100644 (file)
@@ -334,17 +334,23 @@ static int fluid_sffile_read_wav(SFData *sf, unsigned int start, unsigned int en
  */
 int fluid_is_soundfont(const char *filename)
 {
-    FILE    *fp = FLUID_FOPEN(filename, "rb");
+    FILE    *fp;
     uint32_t fcc;
     int      retcode = FALSE;
 
     do
     {
-        if(fp == NULL)
+        if(!fluid_file_test(filename, G_FILE_TEST_IS_REGULAR))
         {
             return retcode;
         }
-
+        
+        // file seems to exist and is a regular file or a symlink to such
+        if((fp = FLUID_FOPEN(filename, "rb")) == NULL)
+        {
+            return retcode;
+        }
+        
         if(FLUID_FREAD(&fcc, sizeof(fcc), 1, fp) != 1)
         {
             break;
index 548a80abce68b89ac30dc2233cc536df406399e8..d0ce264d0c3d14486557bce5b93a95bb8c9e931a 100644 (file)
 
 void *default_fopen(const char *path)
 {
-    return FLUID_FOPEN(path, "rb");
+    FILE* handle;
+    
+    if(!fluid_file_test(path, G_FILE_TEST_EXISTS))
+    {
+        FLUID_LOG(FLUID_ERR, "fluid_sfloader_load(): Unable to load non-existent file. ('%s')", path);
+        return NULL;
+    }
+    
+    if(!fluid_file_test(path, G_FILE_TEST_IS_REGULAR))
+    {
+        FLUID_LOG(FLUID_ERR, "fluid_sfloader_load(): Refusing to load non-regular file! ('%s')", path);
+        return NULL;
+    }
+    
+    if((handle = FLUID_FOPEN(path, "rb")) == NULL)
+    {
+        FLUID_LOG(FLUID_ERR, "fluid_sfloader_load(): Specified file does not exists or insufficient permissions to open it! ('%s')", path);
+        return NULL;
+    }
+    
+    return handle;
 }
 
 int default_fclose(void *handle)
index b4524a2acff5a03c299fef47c8ff6f385e9a76e5..e2677207339704b696f4423cf9a883a46be5d99f 100644 (file)
@@ -109,7 +109,7 @@ static void fluid_synth_update_voice_tuning_LOCAL(fluid_synth_t *synth,
 static int fluid_synth_set_tuning_LOCAL(fluid_synth_t *synth, int chan,
                                         fluid_tuning_t *tuning, int apply);
 static void fluid_synth_set_gen_LOCAL(fluid_synth_t *synth, int chan,
-                                      int param, float value, int absolute);
+                                      int param, float value);
 static void fluid_synth_stop_LOCAL(fluid_synth_t *synth, unsigned int id);
 
 
@@ -1107,12 +1107,10 @@ delete_fluid_synth(fluid_synth_t *synth)
  * @deprecated This function is not thread-safe and does not work with multiple synths.
  * It has been deprecated. It may return "" in a future release and will eventually be removed.
  */
-/* FIXME - The error messages are not thread-safe, yet. They are still stored
- * in a global message buffer (see fluid_sys.c). */
 const char *
 fluid_synth_error(fluid_synth_t *synth)
 {
-    return fluid_error();
+    return "";
 }
 
 /**
@@ -1696,7 +1694,7 @@ fluid_synth_cc_LOCAL(fluid_synth_t *synth, int channum, int num)
                 if(nrpn_select < GEN_LAST)
                 {
                     float val = fluid_gen_scale_nrpn(nrpn_select, data);
-                    fluid_synth_set_gen_LOCAL(synth, channum, nrpn_select, val, FALSE);
+                    fluid_synth_set_gen_LOCAL(synth, channum, nrpn_select, val);
                 }
 
                 chan->nrpn_select = 0;  /* Reset to 0 */
@@ -1714,12 +1712,12 @@ fluid_synth_cc_LOCAL(fluid_synth_t *synth, int channum, int num)
 
             case RPN_CHANNEL_FINE_TUNE:   /* Fine tune is 14 bit over +/-1 semitone (+/- 100 cents, 8192 = center) */
                 fluid_synth_set_gen_LOCAL(synth, channum, GEN_FINETUNE,
-                                          (data - 8192) / 8192.0 * 100.0, FALSE);
+                                          (data - 8192) / 8192.0 * 100.0);
                 break;
 
             case RPN_CHANNEL_COARSE_TUNE: /* Coarse tune is 7 bit and in semitones (64 is center) */
                 fluid_synth_set_gen_LOCAL(synth, channum, GEN_COARSETUNE,
-                                          value - 64, FALSE);
+                                          value - 64);
                 break;
 
             case RPN_TUNING_PROGRAM_CHANGE:
@@ -6119,51 +6117,22 @@ fluid_synth_get_settings(fluid_synth_t *synth)
  */
 int fluid_synth_set_gen(fluid_synth_t *synth, int chan, int param, float value)
 {
-    return fluid_synth_set_gen2(synth, chan, param, value, FALSE, FALSE);
-}
-
-/**
- * Set a SoundFont generator (effect) value on a MIDI channel in real-time.
- * @param synth FluidSynth instance
- * @param chan MIDI channel number (0 to MIDI channel count - 1)
- * @param param SoundFont generator ID (#fluid_gen_type)
- * @param value Offset or absolute generator value to assign to the MIDI channel
- * @param absolute FALSE to assign a relative value, TRUE to assign an absolute value
- * @param normalized FALSE if value is specified in the native units of the generator,
- *   TRUE to take the value as a 0.0-1.0 range and apply it to the valid
- *   generator effect range (scaled and shifted as necessary).
- * @return #FLUID_OK on success, #FLUID_FAILED otherwise
- *
- * This function allows for setting all effect parameters in real time on a
- * MIDI channel. Setting absolute to non-zero will cause the value to override
- * any generator values set in the instruments played on the MIDI channel.
- * See SoundFont 2.01 spec, paragraph 8.1.3, page 48 for details on SoundFont
- * generator parameters and valid ranges.
- */
-int
-fluid_synth_set_gen2(fluid_synth_t *synth, int chan, int param,
-                     float value, int absolute, int normalized)
-{
-    float v;
     fluid_return_val_if_fail(param >= 0 && param < GEN_LAST, FLUID_FAILED);
     FLUID_API_ENTRY_CHAN(FLUID_FAILED);
 
-    v = normalized ? fluid_gen_scale(param, value) : value;
-
-    fluid_synth_set_gen_LOCAL(synth, chan, param, v, absolute);
+    fluid_synth_set_gen_LOCAL(synth, chan, param, value);
 
     FLUID_API_RETURN(FLUID_OK);
 }
 
 /* Synthesis thread local set gen function */
 static void
-fluid_synth_set_gen_LOCAL(fluid_synth_t *synth, int chan, int param, float value,
-                          int absolute)
+fluid_synth_set_gen_LOCAL(fluid_synth_t *synth, int chan, int param, float value)
 {
     fluid_voice_t *voice;
     int i;
 
-    fluid_channel_set_gen(synth->channel[chan], param, value, absolute);
+    fluid_channel_set_gen(synth->channel[chan], param, value);
 
     for(i = 0; i < synth->polyphony; i++)
     {
@@ -6171,7 +6140,7 @@ fluid_synth_set_gen_LOCAL(fluid_synth_t *synth, int chan, int param, float value
 
         if(fluid_voice_get_channel(voice) == chan)
         {
-            fluid_voice_set_param(voice, param, value, absolute);
+            fluid_voice_set_param(voice, param, value);
         }
     }
 }
index 58869730c61cb509c7d17fce42a9681ca5b48f2b..9615cb1b5331bdc5bc4b0dd10a5ccfb260fd6b65 100644 (file)
@@ -209,9 +209,6 @@ void delete_fluid_sample_timer(fluid_synth_t *synth, fluid_sample_timer_t *timer
 
 void fluid_synth_process_event_queue(fluid_synth_t *synth);
 
-int fluid_synth_set_gen2(fluid_synth_t *synth, int chan,
-                         int param, float value,
-                         int absolute, int normalized);
 /*
  * misc
  */
index 28911ee7fca14a7494bb8750edb70a4dec82a632..bcb86bac217c0960f2aedb765a501c5e4ede5adc 100644 (file)
 #include "fluid_rtkit.h"
 #endif
 
+#if HAVE_PTHREAD_H && !defined(WIN32)
+// Do not include pthread on windows. It includes winsock.h, which collides with ws2tcpip.h from fluid_sys.h
+// It isn't need on Windows anyway.
+#include <pthread.h>
+#endif
+
 /* WIN32 HACK - Flag used to differentiate between a file descriptor and a socket.
  * Should work, so long as no SOCKET or file descriptor ends up with this bit set. - JG */
 #ifdef _WIN32
@@ -73,9 +79,6 @@ struct _fluid_server_socket_t
 
 static int fluid_istream_gets(fluid_istream_t in, char *buf, int len);
 
-
-static char fluid_errbuf[512];  /* buffer for error message */
-
 static fluid_log_function_t fluid_log_function[LAST_LOG_LEVEL] =
 {
     fluid_default_log_function,
@@ -169,20 +172,20 @@ fluid_default_log_function(int level, const char *message, void *data)
 int
 fluid_log(int level, const char *fmt, ...)
 {
-    fluid_log_function_t fun = NULL;
-
-    va_list args;
-    va_start(args, fmt);
-    FLUID_VSNPRINTF(fluid_errbuf, sizeof(fluid_errbuf), fmt, args);
-    va_end(args);
-
     if((level >= 0) && (level < LAST_LOG_LEVEL))
     {
-        fun = fluid_log_function[level];
+        fluid_log_function_t fun = fluid_log_function[level];
 
         if(fun != NULL)
         {
-            (*fun)(level, fluid_errbuf, fluid_log_user_data[level]);
+            char errbuf[1024];
+            
+            va_list args;
+            va_start(args, fmt);
+            FLUID_VSNPRINTF(errbuf, sizeof(errbuf), fmt, args);
+            va_end(args);
+        
+            (*fun)(level, errbuf, fluid_log_user_data[level]);
         }
     }
 
@@ -266,15 +269,6 @@ char *fluid_strtok(char **str, const char *delim)
     return token;
 }
 
-/*
- * fluid_error
- */
-char *
-fluid_error()
-{
-    return fluid_errbuf;
-}
-
 /**
  * Suspend the execution of the current thread for the specified amount of time.
  * @param milliseconds to wait.
@@ -1344,12 +1338,12 @@ fluid_ostream_printf(fluid_ostream_t out, const char *format, ...)
         /* Handle write differently depending on if its a socket or file descriptor */
         if(!(out & FLUID_SOCKET_FLAG))
         {
-            return write(out, buf, FLUID_STRLEN(buf));
+            return write(out, buf, (unsigned int)FLUID_STRLEN(buf));
         }
 
 #ifdef NETWORK_SUPPORT
         /* Socket */
-        retval = send(out & ~FLUID_SOCKET_FLAG, buf, FLUID_STRLEN(buf), 0);
+        retval = send(out & ~FLUID_SOCKET_FLAG, buf, (int)FLUID_STRLEN(buf), 0);
         return retval != SOCKET_ERROR ? retval : -1;
 #else
         return -1;
index 1229386550cf2a512f0002f86c61ce6e8756c5e8..e3a6967411760172fcb845eba6f476cf2ba110dd 100644 (file)
 
 
 /**
-
-   This header contains a bunch of (mostly) system and machine
-   dependent functions:
-
-   - timers
-   - current time in milliseconds and microseconds
-   - debug logging
-   - profiling
-   - memory locking
-   - checking for floating point exceptions
-
+ * @file fluid_sys.h
+ *
+ * This header contains a bunch of (mostly) system and machine
+ * dependent functions:
+ *
+ * - timers
+ * - current time in milliseconds and microseconds
+ * - debug logging
+ * - profiling
+ * - memory locking
+ * - checking for floating point exceptions
+ *
+ * fluidsynth's wrapper OSAL so to say; include it in .c files, be careful to include
+ * it in fluidsynth's private header files (see comment in fluid_coreaudio.c)
  */
 
 #ifndef _FLUID_SYS_H
 
 #include "fluidsynth_priv.h"
 
+#if HAVE_MATH_H
+#include <math.h>
+#endif
+
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#if HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#if HAVE_SYS_MMAN_H
+#include <sys/mman.h>
+#endif
+
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
+#if HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+#if HAVE_NETINET_TCP_H
+#include <netinet/tcp.h>
+#endif
+
+#if HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+#if HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#if HAVE_OPENMP
+#include <omp.h>
+#endif
+
+#if HAVE_IO_H
+#include <io.h> // _open(), _close(), read(), write() on windows
+#endif
+
+#if HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+/** Integer types  */
+#if HAVE_STDINT_H
+#include <stdint.h>
+
+#else
+
+/* Assume GLIB types */
+typedef gint8    int8_t;
+typedef guint8   uint8_t;
+typedef gint16   int16_t;
+typedef guint16  uint16_t;
+typedef gint32   int32_t;
+typedef guint32  uint32_t;
+typedef gint64   int64_t;
+typedef guint64  uint64_t;
+
+#endif
+
+#if defined(WIN32) &&  HAVE_WINDOWS_H
+//#include <winsock2.h>
+//#include <ws2tcpip.h>        /* Provides also socklen_t */
+#include <windows.h>
+
+/* WIN32 special defines */
+#define STDIN_FILENO 0
+#define STDOUT_FILENO 1
+#define STDERR_FILENO 2
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4244)
+#pragma warning(disable : 4101)
+#pragma warning(disable : 4305)
+#pragma warning(disable : 4996)
+#endif
+
+#endif
+
+/* Darwin special defines (taken from config_macosx.h) */
+#ifdef DARWIN
+# define MACINTOSH
+# define __Types__
+#endif
+
 #ifdef LADSPA
 #include <gmodule.h>
 #endif
  */
 #define fluid_gerror_message(err)  ((err) ? err->message : "No error details")
 
-/* Misc */
-#if defined(__INTEL_COMPILER)
-#define FLUID_RESTRICT restrict
-#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
-#define FLUID_RESTRICT __restrict__
-#elif defined(_MSC_VER) && _MSC_VER >= 1400
-#define FLUID_RESTRICT __restrict
-#else
-#warning "Dont know how this compiler handles restrict pointers, refuse to use them."
-#define FLUID_RESTRICT
-#endif
 
 #define FLUID_INLINE              inline
 #define FLUID_POINTER_TO_UINT     GPOINTER_TO_UINT
 #define FLUID_UINT_TO_POINTER     GUINT_TO_POINTER
 #define FLUID_POINTER_TO_INT      GPOINTER_TO_INT
 #define FLUID_INT_TO_POINTER      GINT_TO_POINTER
-#define FLUID_N_ELEMENTS(struct)  (sizeof (struct) / sizeof (struct[0]))
-#define FLUID_MEMBER_SIZE(struct, member)  ( sizeof (((struct *)0)->member) )
-
 #define FLUID_IS_BIG_ENDIAN       (G_BYTE_ORDER == G_BIG_ENDIAN)
 
 #define FLUID_LE32TOH(x)          GINT32_FROM_LE(x)
     (uint32_t)(((uint32_t)(_d) << 24) | ((uint32_t)(_c) << 16) | ((uint32_t)(_b) << 8) | (uint32_t)(_a)) 
 #endif
 
-
-#define fluid_return_if_fail(cond) \
-if(cond) \
-    ; \
-else \
-    return
-
-#define fluid_return_val_if_fail(cond, val) \
- fluid_return_if_fail(cond) (val)
-
-
 /*
  * Utility functions
  */
@@ -356,11 +445,15 @@ typedef GModule fluid_module_t;
 
 /* Sockets and I/O */
 
-fluid_istream_t fluid_get_stdin(void);
-fluid_ostream_t fluid_get_stdout(void);
 int fluid_istream_readline(fluid_istream_t in, fluid_ostream_t out, char *prompt, char *buf, int len);
 int fluid_ostream_printf(fluid_ostream_t out, const char *format, ...);
 
+#if defined(WIN32)
+typedef SOCKET fluid_socket_t;
+#else
+typedef int fluid_socket_t;
+#endif
+
 /* The function should return 0 if no error occured, non-zero
    otherwise. If the function return non-zero, the socket will be
    closed by the server. */
@@ -374,25 +467,26 @@ fluid_istream_t fluid_socket_get_istream(fluid_socket_t sock);
 fluid_ostream_t fluid_socket_get_ostream(fluid_socket_t sock);
 
 /* File access */
+#define fluid_stat(_filename, _statbuf)   g_stat((_filename), (_statbuf))
 #if !GLIB_CHECK_VERSION(2, 26, 0)
     /* GStatBuf has not been introduced yet, manually typedef to what they had at that time:
      * https://github.com/GNOME/glib/blob/e7763678b56e3be073cc55d707a6e92fc2055ee0/glib/gstdio.h#L98-L115
      */
     #if defined(WIN32) || HAVE_WINDOWS_H // somehow reliably mock G_OS_WIN32??
-        #if defined (_MSC_VER) && !defined(_WIN64)
-        typedef struct _stat32 fluid_stat_buf_t;
-        #else
-        typedef struct _stat fluid_stat_buf_t;
-        #endif
+        // Any effort from our side to reliably mock GStatBuf on Windows is in vain. E.g. glib-2.16 is broken as it uses struct stat rather than struct _stat32 on Win x86.
+        // Disable it (the user has been warned by cmake).
+        #undef fluid_stat
+        #define fluid_stat(_filename, _statbuf)  (-1)
+        typedef struct _fluid_stat_buf_t{int st_mtime;} fluid_stat_buf_t;
     #else
-    /* posix, OS/2, etc. */
-    typedef struct stat fluid_stat_buf_t;
+        /* posix, OS/2, etc. */
+        typedef struct stat fluid_stat_buf_t;
     #endif
 #else
 typedef GStatBuf fluid_stat_buf_t;
 #endif
-#define fluid_stat(_filename, _statbuf)   g_stat((_filename), (_statbuf))
 
+#define fluid_file_test g_file_test
 
 /* Profiling */
 #if WITH_PROFILING
index ee083116a2aadd6efae3ddd12dfd0ba3d9b80507..0df248b7bfb3a56f78a7a645fc5e860eba1234b0 100644 (file)
@@ -20,7 +20,6 @@
 
 
 #include "fluid_tuning.h"
-#include "fluidsynth_priv.h"
 #include "fluid_sys.h"
 
 
index 7c6265745b188fdb881a156f2824a4c4cba440ef..5c5ad355987d7aeaf8bebf6948ae6ea3c7db1a07 100644 (file)
@@ -18,7 +18,7 @@
  * 02110-1301, USA
  */
 
-#include "fluidsynth_priv.h"
+#include "fluid_sys.h"
 #include "fluid_voice.h"
 #include "fluid_mod.h"
 #include "fluid_chan.h"
@@ -428,17 +428,7 @@ fluid_voice_gen_get(fluid_voice_t *voice, int gen)
 
 fluid_real_t fluid_voice_gen_value(const fluid_voice_t *voice, int num)
 {
-    /* This is an extension to the SoundFont standard. More
-     * documentation is available at the fluid_synth_set_gen2()
-     * function. */
-    if(voice->gen[num].flags == GEN_ABS_NRPN)
-    {
-        return (fluid_real_t) voice->gen[num].nrpn;
-    }
-    else
-    {
-        return (fluid_real_t)(voice->gen[num].val + voice->gen[num].mod + voice->gen[num].nrpn);
-    }
+    return (fluid_real_t)(voice->gen[num].val + voice->gen[num].mod + voice->gen[num].nrpn);
 }
 
 /*
@@ -605,7 +595,7 @@ fluid_voice_calculate_runtime_synthesis_parameters(fluid_voice_t *voice)
      *  - Add the output value to the modulation value of the generator.
      *
      * Note: The generators have been initialized with
-     * fluid_gen_set_default_values.
+     * fluid_gen_init().
      */
 
     for(i = 0; i < voice->mod_count; i++)
@@ -1789,10 +1779,10 @@ fluid_voice_get_lower_boundary_for_attenuation(fluid_voice_t *voice)
 
 
 
-int fluid_voice_set_param(fluid_voice_t *voice, int gen, fluid_real_t nrpn_value, int abs)
+int fluid_voice_set_param(fluid_voice_t *voice, int gen, fluid_real_t nrpn_value)
 {
     voice->gen[gen].nrpn = nrpn_value;
-    voice->gen[gen].flags = (abs) ? GEN_ABS_NRPN : GEN_SET;
+    voice->gen[gen].flags = GEN_SET;
     fluid_voice_update_param(voice, gen);
     return FLUID_OK;
 }
index fb0b28239f3a7c74fb83b8b0087c8b586a7d838f..599a0e28a57cb8a31324c09d1cfaba73acfd0098 100644 (file)
@@ -30,7 +30,6 @@
 #include "fluid_lfo.h"
 #include "fluid_rvoice.h"
 #include "fluid_rvoice_event.h"
-#include "fluid_sys.h"
 
 #define NO_CHANNEL             0xff
 
@@ -131,7 +130,7 @@ int fluid_voice_modulate(fluid_voice_t *voice, int cc, int ctrl);
 int fluid_voice_modulate_all(fluid_voice_t *voice);
 
 /** Set the NRPN value of a generator. */
-int fluid_voice_set_param(fluid_voice_t *voice, int gen, fluid_real_t value, int abs);
+int fluid_voice_set_param(fluid_voice_t *voice, int gen, fluid_real_t value);
 
 
 /** Set the gain. */
index 384785fccd9d4a0a429df89c8dae650de425a58e..7a3ce6d6d1ae1c1c683c687cbd366c7c844da1e8 100644 (file)
  * 02110-1301, USA
  */
 
+/**
+ * @file fluidsynth_priv.h
+ * 
+ * lightweight part of fluid_sys.h, containing forward declarations of fluidsynth's private types and private macros
+ *
+ * include this one file in fluidsynth's private header files
+ */
 
 #ifndef _FLUIDSYNTH_PRIV_H
 #define _FLUIDSYNTH_PRIV_H
 
 #include "config.h"
 
-#if HAVE_STRING_H
-#include <string.h>
-#endif
-
 #if HAVE_STDLIB_H
-#include <stdlib.h>
+#include <stdlib.h> // malloc, free
 #endif
 
 #if HAVE_STDIO_H
-#include <stdio.h>
-#endif
-
-#if HAVE_MATH_H
-#include <math.h>
+#include <stdio.h> // printf
 #endif
 
-#if HAVE_ERRNO_H
-#include <errno.h>
-#endif
-
-#if HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#if HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
-
-#if HAVE_SYS_MMAN_H
-#include <sys/mman.h>
-#endif
-
-#if HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-
-#if HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#if HAVE_SYS_TIME_H
-#include <sys/time.h>
-#endif
-
-#if HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
-#endif
-
-#if HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-
-#if HAVE_NETINET_TCP_H
-#include <netinet/tcp.h>
-#endif
-
-#if HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-
-#if HAVE_LIMITS_H
-#include <limits.h>
-#endif
-
-#if HAVE_PTHREAD_H
-#include <pthread.h>
-#endif
-
-#if HAVE_OPENMP
-#include <omp.h>
-#endif
-
-#if HAVE_IO_H
-#include <io.h> // _open(), _close(), read(), write() on windows
-#endif
-
-#if HAVE_SIGNAL_H
-#include <signal.h>
-#endif
-
-/** Integer types  */
-#if HAVE_STDINT_H
-#include <stdint.h>
-
-#else
-
-/* Assume GLIB types */
-typedef gint8    int8_t;
-typedef guint8   uint8_t;
-typedef gint16   int16_t;
-typedef guint16  uint16_t;
-typedef gint32   int32_t;
-typedef guint32  uint32_t;
-typedef gint64   int64_t;
-typedef guint64  uint64_t;
-
-#endif
-
-#if defined(WIN32) &&  HAVE_WINDOWS_H
-//#include <winsock2.h>
-//#include <ws2tcpip.h>        /* Provides also socklen_t */
-#include <windows.h>
-
-/* WIN32 special defines */
-#define STDIN_FILENO 0
-#define STDOUT_FILENO 1
-#define STDERR_FILENO 2
-
-#ifdef _MSC_VER
-#pragma warning(disable : 4244)
-#pragma warning(disable : 4101)
-#pragma warning(disable : 4305)
-#pragma warning(disable : 4996)
-#endif
-
-#endif
-
-/* Darwin special defines (taken from config_macosx.h) */
-#ifdef DARWIN
-# define MACINTOSH
-# define __Types__
+#if HAVE_STRING_H
+#include <string.h>
 #endif
 
 
@@ -168,13 +60,6 @@ typedef float fluid_real_t;
 typedef double fluid_real_t;
 #endif
 
-
-#if defined(WIN32)
-typedef SOCKET fluid_socket_t;
-#else
-typedef int fluid_socket_t;
-#endif
-
 #if defined(SUPPORTS_VLA)
 #  define FLUID_DECLARE_VLA(_type, _name, _len) \
      _type _name[_len]
@@ -240,7 +125,6 @@ typedef void (*fluid_rvoice_function_t)(void *obj, const fluid_rvoice_param_t pa
  *
  *                      SYSTEM INTERFACE
  */
-typedef FILE  *fluid_file;
 
 #define FLUID_MALLOC(_n)             malloc(_n)
 #define FLUID_REALLOC(_p,_n)         realloc(_p,_n)
@@ -349,6 +233,30 @@ do { strncpy(_dst,_src,_n); \
 #define FLUID_LIKELY G_LIKELY
 #define FLUID_UNLIKELY G_UNLIKELY
 
-char *fluid_error(void);
+/* Misc */
+#if defined(__INTEL_COMPILER)
+#define FLUID_RESTRICT restrict
+#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
+#define FLUID_RESTRICT __restrict__
+#elif defined(_MSC_VER) && _MSC_VER >= 1400
+#define FLUID_RESTRICT __restrict
+#else
+#warning "Dont know how this compiler handles restrict pointers, refuse to use them."
+#define FLUID_RESTRICT
+#endif
+
+#define FLUID_N_ELEMENTS(struct)  (sizeof (struct) / sizeof (struct[0]))
+#define FLUID_MEMBER_SIZE(struct, member)  ( sizeof (((struct *)0)->member) )
+
+
+#define fluid_return_if_fail(cond) \
+if(cond) \
+    ; \
+else \
+    return
+
+#define fluid_return_val_if_fail(cond, val) \
+ fluid_return_if_fail(cond) (val)
+
 
 #endif /* _FLUIDSYNTH_PRIV_H */
index a397680563bde1c3ebbfa0c2b612c961d3104988..9ed5f38733888d4801cc0c8270fee7b98b0afc3a 100644 (file)
@@ -58,7 +58,7 @@ index 60f441c49..e6455186e 100644
  fluid_real_t fluid_ct2hz_real(fluid_real_t cents);
  fluid_real_t fluid_ct2hz(fluid_real_t cents);
 diff --git b/libs/fluidsynth/src/fluid_hash.c a/libs/fluidsynth/src/fluid_hash.c
-index 37b0a06a4..b6586895b 100644
+index 946a873bb..79f83a458 100644
 --- b/libs/fluidsynth/src/fluid_hash.c
 +++ a/libs/fluidsynth/src/fluid_hash.c
 @@ -991,6 +991,7 @@ fluid_hashtable_remove_all(fluid_hashtable_t *hashtable)
@@ -78,10 +78,10 @@ index 37b0a06a4..b6586895b 100644
  /*
   * fluid_hashtable_foreach_remove_or_steal:
 diff --git b/libs/fluidsynth/src/fluid_midi.c a/libs/fluidsynth/src/fluid_midi.c
-index 1a394f811..8deb0b0d1 100644
+index 38c2bf6ef..73551a6d8 100644
 --- b/libs/fluidsynth/src/fluid_midi.c
 +++ a/libs/fluidsynth/src/fluid_midi.c
-@@ -76,7 +76,7 @@ static int fluid_midi_file_read_tracklen(fluid_midi_file *mf);
+@@ -77,7 +77,7 @@ static int fluid_midi_file_read_tracklen(fluid_midi_file *mf);
  static int fluid_midi_file_eot(fluid_midi_file *mf);
  static int fluid_midi_file_get_division(fluid_midi_file *midifile);
  
@@ -90,7 +90,7 @@ index 1a394f811..8deb0b0d1 100644
  /***************************************************************
   *
   *                      MIDIFILE
-@@ -1047,6 +1047,7 @@ fluid_midi_file_get_division(fluid_midi_file *midifile)
+@@ -1054,6 +1054,7 @@ fluid_midi_file_get_division(fluid_midi_file *midifile)
  {
      return midifile->division;
  }
@@ -98,7 +98,7 @@ index 1a394f811..8deb0b0d1 100644
  
  /******************************************************
   *
-@@ -1413,7 +1414,7 @@ static void fluid_midi_event_get_sysex_LOCAL(fluid_midi_event_t *evt, void **dat
+@@ -1420,7 +1421,7 @@ static void fluid_midi_event_get_sysex_LOCAL(fluid_midi_event_t *evt, void **dat
   *
   *     fluid_track_t
   */
@@ -107,7 +107,7 @@ index 1a394f811..8deb0b0d1 100644
  /*
   * new_fluid_track
   */
-@@ -2517,3 +2518,4 @@ fluid_midi_event_length(unsigned char event)
+@@ -2524,3 +2525,4 @@ fluid_midi_event_length(unsigned char event)
  
      return 1;
  }
@@ -139,13 +139,13 @@ index 3e7661741..ec8e967a3 100644
  #ifdef DEBUG
  void fluid_dump_modulator(fluid_mod_t *mod);
 diff --git b/libs/fluidsynth/src/fluid_rvoice_mixer.c a/libs/fluidsynth/src/fluid_rvoice_mixer.c
-index af0ef75d1..9acc5f830 100644
+index 85c3fb914..5ea08ff6f 100644
 --- b/libs/fluidsynth/src/fluid_rvoice_mixer.c
 +++ a/libs/fluidsynth/src/fluid_rvoice_mixer.c
-@@ -24,7 +24,6 @@
+@@ -23,7 +23,6 @@
+ #include "fluid_sys.h"
  #include "fluid_rev.h"
  #include "fluid_chorus.h"
- #include "fluidsynth_priv.h"
 -#include "fluid_ladspa.h"
  #include "fluid_synth.h"
  
@@ -163,7 +163,7 @@ index 4ee072e4b..1b3fceb34 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 02be9a033..9207ab063 100644
+index 5b2b08748..181116984 100644
 --- b/libs/fluidsynth/src/fluid_settings.c
 +++ a/libs/fluidsynth/src/fluid_settings.c
 @@ -21,9 +21,6 @@
@@ -191,7 +191,7 @@ index 02be9a033..9207ab063 100644
  
  static int
 diff --git b/libs/fluidsynth/src/fluid_synth.c a/libs/fluidsynth/src/fluid_synth.c
-index 07bfc0427..b4524a2ac 100644
+index 1c7a1f272..e26772073 100644
 --- b/libs/fluidsynth/src/fluid_synth.c
 +++ a/libs/fluidsynth/src/fluid_synth.c
 @@ -267,7 +267,7 @@ void fluid_version(int *major, int *minor, int *micro)
@@ -203,7 +203,7 @@ index 07bfc0427..b4524a2ac 100644
  fluid_version_str(void)
  {
      return FLUIDSYNTH_VERSION;
-@@ -6442,6 +6442,7 @@ int fluid_synth_set_channel_type(fluid_synth_t *synth, int chan, int type)
+@@ -6411,6 +6411,7 @@ int fluid_synth_set_channel_type(fluid_synth_t *synth, int chan, int type)
      FLUID_API_RETURN(FLUID_OK);
  }
  
@@ -211,7 +211,7 @@ index 07bfc0427..b4524a2ac 100644
  /**
   * Return the LADSPA effects instance used by FluidSynth
   *
-@@ -6454,6 +6455,7 @@ fluid_ladspa_fx_t *fluid_synth_get_ladspa_fx(fluid_synth_t *synth)
+@@ -6423,6 +6424,7 @@ fluid_ladspa_fx_t *fluid_synth_get_ladspa_fx(fluid_synth_t *synth)
  
      return synth->ladspa_fx;
  }
@@ -220,7 +220,7 @@ index 07bfc0427..b4524a2ac 100644
  /**
   * Configure a general-purpose IIR biquad filter.
 diff --git b/libs/fluidsynth/src/fluid_synth.h a/libs/fluidsynth/src/fluid_synth.h
-index 156424af1..58869730c 100644
+index 46c92ccf6..9615cb1b5 100644
 --- b/libs/fluidsynth/src/fluid_synth.h
 +++ a/libs/fluidsynth/src/fluid_synth.h
 @@ -33,8 +33,6 @@
@@ -243,10 +243,10 @@ index 156424af1..58869730c 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 d686737f6..28911ee7f 100644
+index b85fa3fbf..bcb86bac2 100644
 --- b/libs/fluidsynth/src/fluid_sys.c
 +++ a/libs/fluidsynth/src/fluid_sys.c
-@@ -202,9 +202,10 @@ fluid_log(int level, const char *fmt, ...)
+@@ -205,9 +205,10 @@ fluid_log(int level, const char *fmt, ...)
   * @param delim String of delimiter chars.
   * @return Pointer to the next token or NULL if no more tokens.
   */
@@ -260,34 +260,10 @@ index d686737f6..28911ee7f 100644
  
      if(str == NULL || delim == NULL || !*delim)
 diff --git b/libs/fluidsynth/src/fluid_sys.h a/libs/fluidsynth/src/fluid_sys.h
-index 72b323029..122938655 100644
+index 9f2d6f6c7..e3a696741 100644
 --- b/libs/fluidsynth/src/fluid_sys.h
 +++ a/libs/fluidsynth/src/fluid_sys.h
-@@ -99,7 +99,7 @@ else \
- /*
-  * Utility functions
-  */
--char *fluid_strtok(char **str, char *delim);
-+char *fluid_strtok(char **str, const char *delim);
- #if defined(__OS2__)
-diff --git b/libs/fluidsynth/src/fluidsynth_priv.h a/libs/fluidsynth/src/fluidsynth_priv.h
-index 4df590e21..384785fcc 100644
---- b/libs/fluidsynth/src/fluidsynth_priv.h
-+++ a/libs/fluidsynth/src/fluidsynth_priv.h
-@@ -26,10 +26,6 @@
- #include "config.h"
--#if defined(__POWERPC__) && !(defined(__APPLE__) && defined(__MACH__))
--#include "config_maxmsp43.h"
--#endif
--
- #if HAVE_STRING_H
- #include <string.h>
- #endif
-@@ -133,8 +129,9 @@ typedef guint64  uint64_t;
+@@ -128,8 +128,9 @@ typedef guint64  uint64_t;
  #endif
  
  #if defined(WIN32) &&  HAVE_WINDOWS_H
@@ -299,3 +275,12 @@ index 4df590e21..384785fcc 100644
  
  /* WIN32 special defines */
  #define STDIN_FILENO 0
+@@ -187,7 +188,7 @@ typedef guint64  uint64_t;
+ /*
+  * Utility functions
+  */
+-char *fluid_strtok(char **str, char *delim);
++char *fluid_strtok(char **str, const char *delim);
+ #if defined(__OS2__)