summaryrefslogtreecommitdiff
path: root/libs/fluidsynth/src
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2019-02-23 17:58:05 +0100
committerRobin Gareus <robin@gareus.org>2019-02-23 18:41:05 +0100
commit75134e8ccf706208d4f4c1354444550ccf967408 (patch)
treed4d247654f58cd440d4e2aadc05715fde4f07bc7 /libs/fluidsynth/src
parent63fdfd9e8557f898e32612449c3ba77d79fde45c (diff)
Update Fluidsynth to v2.0.4
see https://github.com/FluidSynth/fluidsynth/releases/tag/v2.0.4
Diffstat (limited to 'libs/fluidsynth/src')
-rw-r--r--libs/fluidsynth/src/fluid_chan.c1
-rw-r--r--libs/fluidsynth/src/fluid_chan.h15
-rw-r--r--libs/fluidsynth/src/fluid_conv.c1
-rw-r--r--libs/fluidsynth/src/fluid_defsfont.c15
-rw-r--r--libs/fluidsynth/src/fluid_defsfont.h2
-rw-r--r--libs/fluidsynth/src/fluid_gen.c42
-rw-r--r--libs/fluidsynth/src/fluid_gen.h6
-rw-r--r--libs/fluidsynth/src/fluid_hash.c2
-rw-r--r--libs/fluidsynth/src/fluid_midi.c13
-rw-r--r--libs/fluidsynth/src/fluid_ringbuffer.c2
-rw-r--r--libs/fluidsynth/src/fluid_rvoice_dsp.c3
-rw-r--r--libs/fluidsynth/src/fluid_rvoice_mixer.c1
-rw-r--r--libs/fluidsynth/src/fluid_samplecache.c1
-rw-r--r--libs/fluidsynth/src/fluid_settings.c15
-rw-r--r--libs/fluidsynth/src/fluid_sffile.c12
-rw-r--r--libs/fluidsynth/src/fluid_sfont.c22
-rw-r--r--libs/fluidsynth/src/fluid_synth.c49
-rw-r--r--libs/fluidsynth/src/fluid_synth.h3
-rw-r--r--libs/fluidsynth/src/fluid_sys.c40
-rw-r--r--libs/fluidsynth/src/fluid_sys.h186
-rw-r--r--libs/fluidsynth/src/fluid_tuning.c1
-rw-r--r--libs/fluidsynth/src/fluid_voice.c20
-rw-r--r--libs/fluidsynth/src/fluid_voice.h3
-rw-r--r--libs/fluidsynth/src/fluidsynth_priv.h164
24 files changed, 277 insertions, 342 deletions
diff --git a/libs/fluidsynth/src/fluid_chan.c b/libs/fluidsynth/src/fluid_chan.c
index 49ef99ecbe..365c0fd2a1 100644
--- a/libs/fluidsynth/src/fluid_chan.c
+++ b/libs/fluidsynth/src/fluid_chan.c
@@ -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)
diff --git a/libs/fluidsynth/src/fluid_chan.h b/libs/fluidsynth/src/fluid_chan.h
index 42d73df7b5..a9ca1bcabb 100644
--- a/libs/fluidsynth/src/fluid_chan.h
+++ b/libs/fluidsynth/src/fluid_chan.h
@@ -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)
diff --git a/libs/fluidsynth/src/fluid_conv.c b/libs/fluidsynth/src/fluid_conv.c
index 483b371d5e..6e169b038f 100644
--- a/libs/fluidsynth/src/fluid_conv.c
+++ b/libs/fluidsynth/src/fluid_conv.c
@@ -19,6 +19,7 @@
*/
#include "fluid_conv.h"
+#include "fluid_sys.h"
#include "fluid_conv_tables.c"
/*
diff --git a/libs/fluidsynth/src/fluid_defsfont.c b/libs/fluidsynth/src/fluid_defsfont.c
index d7960cbb9c..ae8a9fb2da 100644
--- a/libs/fluidsynth/src/fluid_defsfont.c
+++ b/libs/fluidsynth/src/fluid_defsfont.c
@@ -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;
}
diff --git a/libs/fluidsynth/src/fluid_defsfont.h b/libs/fluidsynth/src/fluid_defsfont.h
index 8b24934d81..86f782f96a 100644
--- a/libs/fluidsynth/src/fluid_defsfont.h
+++ b/libs/fluidsynth/src/fluid_defsfont.h
@@ -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);
diff --git a/libs/fluidsynth/src/fluid_gen.c b/libs/fluidsynth/src/fluid_gen.c
index 0d07d786c6..cf3cc48b46 100644
--- a/libs/fluidsynth/src/fluid_gen.c
+++ b/libs/fluidsynth/src/fluid_gen.c
@@ -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)
diff --git a/libs/fluidsynth/src/fluid_gen.h b/libs/fluidsynth/src/fluid_gen.h
index d156b807b9..76d168c25f 100644
--- a/libs/fluidsynth/src/fluid_gen.h
+++ b/libs/fluidsynth/src/fluid_gen.h
@@ -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 */
diff --git a/libs/fluidsynth/src/fluid_hash.c b/libs/fluidsynth/src/fluid_hash.c
index b6586895b5..79f83a4583 100644
--- a/libs/fluidsynth/src/fluid_hash.c
+++ b/libs/fluidsynth/src/fluid_hash.c
@@ -31,7 +31,7 @@
* MT safe
*/
-#include "fluidsynth_priv.h"
+#include "fluid_sys.h"
#include "fluid_hash.h"
#include "fluid_list.h"
diff --git a/libs/fluidsynth/src/fluid_midi.c b/libs/fluidsynth/src/fluid_midi.c
index 8deb0b0d1b..73551a6d8c 100644
--- a/libs/fluidsynth/src/fluid_midi.c
+++ b/libs/fluidsynth/src/fluid_midi.c
@@ -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;
diff --git a/libs/fluidsynth/src/fluid_ringbuffer.c b/libs/fluidsynth/src/fluid_ringbuffer.c
index 71fd1e48a3..e67200111c 100644
--- a/libs/fluidsynth/src/fluid_ringbuffer.c
+++ b/libs/fluidsynth/src/fluid_ringbuffer.c
@@ -24,7 +24,7 @@
*/
#include "fluid_ringbuffer.h"
-#include "fluidsynth_priv.h"
+#include "fluid_sys.h"
/**
diff --git a/libs/fluidsynth/src/fluid_rvoice_dsp.c b/libs/fluidsynth/src/fluid_rvoice_dsp.c
index 25f4a4b8b9..aec79aab5e 100644
--- a/libs/fluidsynth/src/fluid_rvoice_dsp.c
+++ b/libs/fluidsynth/src/fluid_rvoice_dsp.c
@@ -18,10 +18,9 @@
* 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:
diff --git a/libs/fluidsynth/src/fluid_rvoice_mixer.c b/libs/fluidsynth/src/fluid_rvoice_mixer.c
index 9acc5f8309..5ea08ff6fa 100644
--- a/libs/fluidsynth/src/fluid_rvoice_mixer.c
+++ b/libs/fluidsynth/src/fluid_rvoice_mixer.c
@@ -23,7 +23,6 @@
#include "fluid_sys.h"
#include "fluid_rev.h"
#include "fluid_chorus.h"
-#include "fluidsynth_priv.h"
#include "fluid_synth.h"
diff --git a/libs/fluidsynth/src/fluid_samplecache.c b/libs/fluidsynth/src/fluid_samplecache.c
index 036964f584..f464f178b7 100644
--- a/libs/fluidsynth/src/fluid_samplecache.c
+++ b/libs/fluidsynth/src/fluid_samplecache.c
@@ -29,7 +29,6 @@
#include "fluid_samplecache.h"
#include "fluid_sys.h"
-#include "fluidsynth.h"
#include "fluid_list.h"
diff --git a/libs/fluidsynth/src/fluid_settings.c b/libs/fluidsynth/src/fluid_settings.c
index 9207ab063e..1811169846 100644
--- a/libs/fluidsynth/src/fluid_settings.c
+++ b/libs/fluidsynth/src/fluid_settings.c
@@ -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;
}
diff --git a/libs/fluidsynth/src/fluid_sffile.c b/libs/fluidsynth/src/fluid_sffile.c
index 302eea72a7..b5a641b63d 100644
--- a/libs/fluidsynth/src/fluid_sffile.c
+++ b/libs/fluidsynth/src/fluid_sffile.c
@@ -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;
diff --git a/libs/fluidsynth/src/fluid_sfont.c b/libs/fluidsynth/src/fluid_sfont.c
index 548a80abce..d0ce264d0c 100644
--- a/libs/fluidsynth/src/fluid_sfont.c
+++ b/libs/fluidsynth/src/fluid_sfont.c
@@ -24,7 +24,27 @@
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)
diff --git a/libs/fluidsynth/src/fluid_synth.c b/libs/fluidsynth/src/fluid_synth.c
index b4524a2acf..e267720733 100644
--- a/libs/fluidsynth/src/fluid_synth.c
+++ b/libs/fluidsynth/src/fluid_synth.c
@@ -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);
}
}
}
diff --git a/libs/fluidsynth/src/fluid_synth.h b/libs/fluidsynth/src/fluid_synth.h
index 58869730c6..9615cb1b53 100644
--- a/libs/fluidsynth/src/fluid_synth.h
+++ b/libs/fluidsynth/src/fluid_synth.h
@@ -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
*/
diff --git a/libs/fluidsynth/src/fluid_sys.c b/libs/fluidsynth/src/fluid_sys.c
index 28911ee7fc..bcb86bac21 100644
--- a/libs/fluidsynth/src/fluid_sys.c
+++ b/libs/fluidsynth/src/fluid_sys.c
@@ -30,6 +30,12 @@
#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;
diff --git a/libs/fluidsynth/src/fluid_sys.h b/libs/fluidsynth/src/fluid_sys.h
index 1229386550..e3a6967411 100644
--- a/libs/fluidsynth/src/fluid_sys.h
+++ b/libs/fluidsynth/src/fluid_sys.h
@@ -20,17 +20,20 @@
/**
-
- 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
@@ -38,6 +41,117 @@
#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
@@ -52,26 +166,12 @@
*/
#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)
@@ -85,17 +185,6 @@
(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
diff --git a/libs/fluidsynth/src/fluid_tuning.c b/libs/fluidsynth/src/fluid_tuning.c
index ee083116a2..0df248b7bf 100644
--- a/libs/fluidsynth/src/fluid_tuning.c
+++ b/libs/fluidsynth/src/fluid_tuning.c
@@ -20,7 +20,6 @@
#include "fluid_tuning.h"
-#include "fluidsynth_priv.h"
#include "fluid_sys.h"
diff --git a/libs/fluidsynth/src/fluid_voice.c b/libs/fluidsynth/src/fluid_voice.c
index 7c6265745b..5c5ad35598 100644
--- a/libs/fluidsynth/src/fluid_voice.c
+++ b/libs/fluidsynth/src/fluid_voice.c
@@ -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;
}
diff --git a/libs/fluidsynth/src/fluid_voice.h b/libs/fluidsynth/src/fluid_voice.h
index fb0b28239f..599a0e28a5 100644
--- a/libs/fluidsynth/src/fluid_voice.h
+++ b/libs/fluidsynth/src/fluid_voice.h
@@ -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. */
diff --git a/libs/fluidsynth/src/fluidsynth_priv.h b/libs/fluidsynth/src/fluidsynth_priv.h
index 384785fccd..7a3ce6d6d1 100644
--- a/libs/fluidsynth/src/fluidsynth_priv.h
+++ b/libs/fluidsynth/src/fluidsynth_priv.h
@@ -18,6 +18,13 @@
* 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
@@ -26,131 +33,16 @@
#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 */