diff --git a/fluidsynth/ChangeLog b/fluidsynth/ChangeLog index 953e5755..421a38bd 100644 --- a/fluidsynth/ChangeLog +++ b/fluidsynth/ChangeLog @@ -1,3 +1,28 @@ +2007-11-11 Josh Green + + * configure.ac: Added --enable-trap-on-fpe and --enable-fpe-check to + assist with Floating Point Exception debugging. + * src/fluid_chorus.c: Reverted the rest of the chorus "Effect level clip" + patch, until something better is devised. + * src/fluid_synth.c: Added support for trapping on Floating Point + Exceptions on GLIBC systems, to aid developers in tracking down FPEs + with gdb, removed buffer alignment hacks since they are no longer + needed (not using SSE currently). + * src/fluid_sys.c (fluid_time_config): Added check for a CPU freq + calculation of 0.0, since this test is inadequate to begin with and + was coming up as 0.0 on my laptop, causing a FPE. Will replace with + real timer functions, in the future. + * src/fluid_voice.c: Removed zap_almost_zero macro as it was buggy and + had issues which went away when gcc optimization was turned off and in + the case of !WITH_FLOAT was using abs() which is integer based and + would cause FPEs. + (fluid_voice_write): Removed a memory alignment hack and moved a call + to fluid_fpe_check() to a better location. + (fluid_voice_effects): Replaced zap_almost_zero with a call to fabs(), + added fluid_fpe_check() call. + * src/fluidsynth_priv.h: Removed FLUID_ALIGN16BYTE hack, as it is no + longer needed. + 2007-11-10 Josh Green * doc/fluidsynth.1: Updated man page with current command line options and other changes (minor). diff --git a/fluidsynth/configure.ac b/fluidsynth/configure.ac index fa588e3c..0adaf6c2 100644 --- a/fluidsynth/configure.ac +++ b/fluidsynth/configure.ac @@ -111,25 +111,20 @@ if test "x$ENABLE_LADSPA" = "xyes" ; then fi -AC_ARG_ENABLE(functioncheck, AS_HELP_STRING([--enable-functioncheck], - [profiling using FunctionCheck, turns on debugging (default=no)]), - ENABLE_FUNCTIONCHECK=$enableval, - ENABLE_FUNCTIONCHECK=no) +AC_ARG_ENABLE(trap-on-fpe, AS_HELP_STRING([--enable-trap-on-fpe], + [Enable SIGFPE trap on Floating Point Exceptions (debugging)]), + ENABLE_TRAPONFPE=$enableval, ENABLE_TRAPONFPE=no) -FCLDFLAGS="" -FCCFLAGS="" -if test "${ENABLE_FUNCTIONCHECK}" = "yes"; then - FCCFLAGS=`fc-config --cflags` - FCLDFLAGS=`fc-config --libs` +if test "$ENABLE_TRAPONFPE" = "yes"; then + AC_DEFINE(TRAP_ON_FPE, 1, [Define to enable SIGFPE assertions]) fi -AC_SUBST(FCLDFLAGS) +AC_ARG_ENABLE(fpe-check, AS_HELP_STRING([--enable-fpe-check], + [Enable Floating Point Exception checks and debug messages]), + ENABLE_FPECHECK=$enableval, ENABLE_FPECHECK=no) - -if test "${ENABLE_FUNCTIONCHECK}" = "yes"; then - ENABLE_DEBUG=yes -else - ENABLE_DEBUG=no +if test "$ENABLE_FPECHECK" = "yes"; then + AC_DEFINE(FPE_CHECK, 1, [Define to enable FPE checks]) fi AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug], @@ -137,11 +132,7 @@ AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug], ENABLE_DEBUG=$enableval) if test "$ENABLE_DEBUG" = "yes"; then - if test "${ENABLE_FUNCTIONCHECK}" = "yes"; then - CFLAGS="${CFLAGS} ${FCCFLAGS} -Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wstrict-prototypes -Wno-unused" - else - CFLAGS="${CFLAGS} ${FCCFLAGS} -g -Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wstrict-prototypes -Wno-unused" - fi + CFLAGS="${CFLAGS} ${FCCFLAGS} -g -Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wstrict-prototypes -Wno-unused" AC_DEFINE(DEBUG, 1, [Define to activate debugging message]) else CFLAGS="${CFLAGS} ${FCCFLAGS} -O2 -fomit-frame-pointer -funroll-all-loops -finline-functions -Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wstrict-prototypes -Wno-unused -Winline" @@ -399,23 +390,29 @@ else echo "Readline: no" fi -if test "${ENABLE_DEBUG}" = "yes"; then - echo "Debug: yes" -else - echo "Debug: no" -fi - if test "${profiling_flag}" = "yes"; then echo "Profiling: yes" else echo "Profiling: no" fi -dnl if test "${ENABLE_FUNCTIONCHECK}" = "yes"; then -dnl echo "FunctionCheck: yes" -dnl else -dnl echo "FunctionCheck: no" -dnl fi +if test "${ENABLE_DEBUG}" = "yes"; then + echo "Debug: yes" +else + echo "Debug: no" +fi + +if test "${ENABLE_TRAPONFPE}" = "yes"; then + echo "Trap on FPE (debug): yes" +else + echo "Trap on FPE (debug): no" +fi + +if test "${ENABLE_FPECHECK}" = "yes"; then + echo "Check FPE (debug): yes" +else + echo "Check FPE (debug): no" +fi echo "**************************************************************" echo diff --git a/fluidsynth/src/Makefile.am b/fluidsynth/src/Makefile.am index 66760e24..b8ccdf6b 100644 --- a/fluidsynth/src/Makefile.am +++ b/fluidsynth/src/Makefile.am @@ -111,10 +111,9 @@ libfluidsynth_la_LIBADD = $(LIBFLUID_LIBS) $(LASH_LIBS) $(LADCCA_LIBS) \ $(READLINE_LIBS) $(COREAUDIO_LIBS) $(JACK_LIBS) $(ALSA_LIBS) libfluidsynth_la_LDFLAGS = \ -version-info @LT_VERSION_INFO@ \ - -export-dynamic @FCLDFLAGS@ $(LIBFLUID_LDFLAGS) + -export-dynamic $(LIBFLUID_LDFLAGS) libfluidsynth_la_CPPFLAGS = $(LIBFLUID_CPPFLAGS) fluidsynth_SOURCES = fluidsynth.c fluidsynth_LDADD = libfluidsynth.la -fluidsynth_LDFLAGS = @FCLDFLAGS@ fluidsynth_CPPFLAGS = $(FLUIDSYNTH_CPPFLAGS) diff --git a/fluidsynth/src/config.h.in b/fluidsynth/src/config.h.in index 97bcc982..fdd78663 100644 --- a/fluidsynth/src/config.h.in +++ b/fluidsynth/src/config.h.in @@ -12,6 +12,9 @@ /* Define to activate debugging message */ #undef DEBUG +/* Define to enable FPE checks */ +#undef FPE_CHECK + /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H @@ -150,6 +153,9 @@ /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS +/* Define to enable SIGFPE assertions */ +#undef TRAP_ON_FPE + /* Version number of package */ #undef VERSION diff --git a/fluidsynth/src/fluid_chorus.c b/fluidsynth/src/fluid_chorus.c index 9347f558..0f199951 100644 --- a/fluidsynth/src/fluid_chorus.c +++ b/fluidsynth/src/fluid_chorus.c @@ -477,9 +477,7 @@ void fluid_chorus_processmix(fluid_chorus_t* chorus, fluid_real_t *in, chorus->phase[i] %= (chorus->modulation_period_samples); } /* foreach chorus block */ - /* average values based on number of chorus stages */ - if (chorus->number_blocks) - d_out /= chorus->number_blocks; + d_out *= chorus->level; /* Add the chorus sum d_out to output */ left_out[sample_index] += d_out; @@ -547,9 +545,7 @@ void fluid_chorus_processreplace(fluid_chorus_t* chorus, fluid_real_t *in, chorus->phase[i] %= (chorus->modulation_period_samples); } /* foreach chorus block */ - /* average values based on number of chorus stages */ - if (chorus->number_blocks) - d_out /= chorus->number_blocks; + d_out *= chorus->level; /* Store the chorus sum d_out to output */ left_out[sample_index] = d_out; diff --git a/fluidsynth/src/fluid_synth.c b/fluidsynth/src/fluid_synth.c index d1bd8a98..d8307d7b 100644 --- a/fluidsynth/src/fluid_synth.c +++ b/fluidsynth/src/fluid_synth.c @@ -27,6 +27,14 @@ #include "fluid_settings.h" #include "fluid_sfont.h" +#ifdef TRAP_ON_FPE +#define _GNU_SOURCE +#include + +/* seems to not be declared in fenv.h */ +extern int feenableexcept (int excepts); +#endif + fluid_sfloader_t* new_fluid_defsfloader(void); @@ -152,13 +160,18 @@ fluid_synth_init() { fluid_synth_initialized++; +#ifdef TRAP_ON_FPE + /* Turn on floating point exception traps */ + feenableexcept (FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID); +#endif + fluid_conversion_config(); fluid_dsp_float_config(); fluid_sys_config(); - init_dither(); + init_dither(); /* SF2.01 page 53 section 8.4.1: MIDI Note-On Velocity to Initial Attenuation */ @@ -464,87 +477,57 @@ new_fluid_synth(fluid_settings_t *settings) } } - /* Allocate the sample buffers - * - * GCC seems to have a bug with alignment (address must be multiple - * of 16 bytes. So we have to align for ourselves... As soon as - * GCC aligns reliably, this mess can be cleaned up. - */ - + /* Allocate the sample buffers */ synth->left_buf = NULL; synth->right_buf = NULL; - synth->left_ubuf = NULL; - synth->right_ubuf = NULL; synth->fx_left_buf = NULL; synth->fx_right_buf = NULL; - synth->fx_left_ubuf = NULL; - synth->fx_right_ubuf = NULL; /* Left and right audio buffers */ synth->left_buf = FLUID_ARRAY(fluid_real_t*, synth->nbuf); synth->right_buf = FLUID_ARRAY(fluid_real_t*, synth->nbuf); - synth->left_ubuf = FLUID_ARRAY(fluid_real_t*, synth->nbuf); - synth->right_ubuf = FLUID_ARRAY(fluid_real_t*, synth->nbuf); - if ((synth->left_buf == NULL) || (synth->right_buf == NULL) || - (synth->left_ubuf == NULL) || (synth->right_ubuf == NULL)) { + if ((synth->left_buf == NULL) || (synth->right_buf == NULL)) { FLUID_LOG(FLUID_ERR, "Out of memory"); goto error_recovery; } FLUID_MEMSET(synth->left_buf, 0, synth->nbuf * sizeof(fluid_real_t*)); FLUID_MEMSET(synth->right_buf, 0, synth->nbuf * sizeof(fluid_real_t*)); - FLUID_MEMSET(synth->left_ubuf, 0, synth->nbuf * sizeof(fluid_real_t*)); - FLUID_MEMSET(synth->right_ubuf, 0, synth->nbuf * sizeof(fluid_real_t*)); for (i = 0; i < synth->nbuf; i++) { - /* +4: add four floats for 16 added bytes */ + synth->left_buf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE); + synth->right_buf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE); - synth->left_ubuf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE + 4); - synth->right_ubuf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE + 4); - - if ((synth->left_ubuf[i] == NULL) || (synth->right_ubuf[i] == NULL)) { + if ((synth->left_buf[i] == NULL) || (synth->right_buf[i] == NULL)) { FLUID_LOG(FLUID_ERR, "Out of memory"); goto error_recovery; } - - synth->left_buf[i] = (fluid_real_t*) FLUID_ALIGN16BYTE(synth->left_ubuf[i]); - synth->right_buf[i] = (fluid_real_t*) FLUID_ALIGN16BYTE(synth->right_ubuf[i]); } /* Effects audio buffers */ synth->fx_left_buf = FLUID_ARRAY(fluid_real_t*, synth->effects_channels); synth->fx_right_buf = FLUID_ARRAY(fluid_real_t*, synth->effects_channels); - synth->fx_left_ubuf = FLUID_ARRAY(fluid_real_t*, synth->effects_channels); - synth->fx_right_ubuf = FLUID_ARRAY(fluid_real_t*, synth->effects_channels); - if ((synth->fx_left_buf == NULL) || (synth->fx_left_ubuf == NULL) || - (synth->fx_right_buf == NULL) || (synth->fx_right_ubuf == NULL)) { + if ((synth->fx_left_buf == NULL) || (synth->fx_right_buf == NULL)) { FLUID_LOG(FLUID_ERR, "Out of memory"); goto error_recovery; } - FLUID_MEMSET(synth->fx_left_ubuf, 0, 2 * sizeof(fluid_real_t*)); FLUID_MEMSET(synth->fx_left_buf, 0, 2 * sizeof(fluid_real_t*)); - FLUID_MEMSET(synth->fx_right_ubuf, 0, 2 * sizeof(fluid_real_t*)); FLUID_MEMSET(synth->fx_right_buf, 0, 2 * sizeof(fluid_real_t*)); for (i = 0; i < synth->effects_channels; i++) { + synth->fx_left_buf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE); + synth->fx_right_buf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE); - /* +4: add four floats for 16 added bytes */ - synth->fx_left_ubuf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE + 4); - synth->fx_right_ubuf[i] = FLUID_ARRAY(fluid_real_t, FLUID_BUFSIZE + 4); - - if ((synth->fx_left_ubuf[i] == NULL) || (synth->fx_right_ubuf[i] == NULL)) { + if ((synth->fx_left_buf[i] == NULL) || (synth->fx_right_buf[i] == NULL)) { FLUID_LOG(FLUID_ERR, "Out of memory"); goto error_recovery; } - - synth->fx_left_buf[i] = (fluid_real_t*) FLUID_ALIGN16BYTE(synth->fx_left_ubuf[i]); - synth->fx_right_buf[i] = (fluid_real_t*) FLUID_ALIGN16BYTE(synth->fx_right_ubuf[i]); } @@ -655,45 +638,41 @@ delete_fluid_synth(fluid_synth_t* synth) } /* free all the sample buffers */ - if (synth->left_ubuf != NULL) { + if (synth->left_buf != NULL) { for (i = 0; i < synth->nbuf; i++) { - if (synth->left_ubuf[i] != NULL) { - FLUID_FREE(synth->left_ubuf[i]); + if (synth->left_buf[i] != NULL) { + FLUID_FREE(synth->left_buf[i]); } } - FLUID_FREE(synth->left_ubuf); + FLUID_FREE(synth->left_buf); } - FLUID_FREE(synth->left_buf); - if (synth->right_ubuf != NULL) { + if (synth->right_buf != NULL) { for (i = 0; i < synth->nbuf; i++) { - if (synth->right_ubuf[i] != NULL) { - FLUID_FREE(synth->right_ubuf[i]); + if (synth->right_buf[i] != NULL) { + FLUID_FREE(synth->right_buf[i]); } } - FLUID_FREE(synth->right_ubuf); + FLUID_FREE(synth->right_buf); } - FLUID_FREE(synth->right_buf); - if (synth->fx_left_ubuf != NULL) { + if (synth->fx_left_buf != NULL) { for (i = 0; i < 2; i++) { - if (synth->fx_left_ubuf[i] != NULL) { - FLUID_FREE(synth->fx_left_ubuf[i]); + if (synth->fx_left_buf[i] != NULL) { + FLUID_FREE(synth->fx_left_buf[i]); } } - FLUID_FREE(synth->fx_left_ubuf); + FLUID_FREE(synth->fx_left_buf); } - FLUID_FREE(synth->fx_left_buf); - if (synth->fx_right_ubuf != NULL) { + if (synth->fx_right_buf != NULL) { for (i = 0; i < 2; i++) { - if (synth->fx_right_ubuf[i] != NULL) { - FLUID_FREE(synth->fx_right_ubuf[i]); + if (synth->fx_right_buf[i] != NULL) { + FLUID_FREE(synth->fx_right_buf[i]); } } - FLUID_FREE(synth->fx_right_ubuf); + FLUID_FREE(synth->fx_right_buf); } - FLUID_FREE(synth->fx_right_buf); /* release the reverb module */ if (synth->reverb != NULL) { diff --git a/fluidsynth/src/fluid_synth.h b/fluidsynth/src/fluid_synth.h index 4e8fadb2..de80f6cb 100644 --- a/fluidsynth/src/fluid_synth.h +++ b/fluidsynth/src/fluid_synth.h @@ -128,11 +128,6 @@ struct _fluid_synth_t fluid_real_t** fx_left_buf; fluid_real_t** fx_right_buf; - fluid_real_t** left_ubuf; /* Stores the unaligned buffers (see new_fluid_synth) */ - fluid_real_t** right_ubuf; /* Stores the unaligned buffers (see new_fluid_synth) */ - fluid_real_t** fx_left_ubuf; /* Stores the unaligned buffers (see new_fluid_synth) */ - fluid_real_t** fx_right_ubuf; /* Stores the unaligned buffers (see new_fluid_synth) */ - fluid_revmodel_t* reverb; fluid_chorus_t* chorus; int cur; /** the current sample in the audio buffers to be output */ @@ -154,7 +149,6 @@ struct _fluid_synth_t #endif }; - /** returns 1 if the value has been set, 0 otherwise */ int fluid_synth_setstr(fluid_synth_t* synth, char* name, char* str); diff --git a/fluidsynth/src/fluid_sys.c b/fluidsynth/src/fluid_sys.c index cd9b4c03..b57beb9b 100644 --- a/fluidsynth/src/fluid_sys.c +++ b/fluidsynth/src/fluid_sys.c @@ -20,7 +20,6 @@ #include "fluid_sys.h" -//#include static char fluid_errbuf[512]; /* buffer for error message */ @@ -796,6 +795,7 @@ void fluid_time_config(void) { if (fluid_cpu_frequency < 0.0) { fluid_cpu_frequency = fluid_estimate_cpu_frequency() / 1000000.0; + if (fluid_cpu_frequency == 0.0) fluid_cpu_frequency = 1.0; } } @@ -856,7 +856,7 @@ double fluid_estimate_cpu_frequency(void) #endif -#if 0 +#ifdef FPE_CHECK /*************************************************************** * @@ -890,7 +890,8 @@ double fluid_estimate_cpu_frequency(void) #define _FPU_CLR_SW() __asm__ ("fnclex" : : ) /* Purpose: - * Checks, if the floating point unit has produced an exception in the meantime. + * Checks, if the floating point unit has produced an exception, print a message + * if so and clear the exception. */ unsigned int fluid_check_fpe_i386(char* explanation) { @@ -899,11 +900,10 @@ unsigned int fluid_check_fpe_i386(char* explanation) _FPU_GET_SW(s); _FPU_CLR_SW(); - if ((s & _FPU_STATUS_IE) - || (s & _FPU_STATUS_DE) - || (s & _FPU_STATUS_ZE) - || (s & _FPU_STATUS_OE) - || (s & _FPU_STATUS_UE)) { + s &= _FPU_STATUS_IE | _FPU_STATUS_DE | _FPU_STATUS_ZE | _FPU_STATUS_OE | _FPU_STATUS_UE; + + if (s) + { FLUID_LOG(FLUID_WARN, "FPE exception (before or in %s): %s%s%s%s%s", explanation, (s & _FPU_STATUS_IE) ? "Invalid operation " : "", (s & _FPU_STATUS_DE) ? "Denormal number " : "", @@ -915,10 +915,18 @@ unsigned int fluid_check_fpe_i386(char* explanation) return s; } -#endif +/* Purpose: + * Clear floating point exception. + */ +void fluid_clear_fpe_i386 (void) +{ + _FPU_CLR_SW(); +} + +#endif // ifdef FPE_CHECK -#endif +#endif // #else (its POSIX) /*************************************************************** diff --git a/fluidsynth/src/fluid_sys.h b/fluidsynth/src/fluid_sys.h index 27086428..57587cb1 100644 --- a/fluidsynth/src/fluid_sys.h +++ b/fluidsynth/src/fluid_sys.h @@ -284,14 +284,15 @@ extern fluid_profile_data_t fluid_profile_data[]; fluid_check_fpe() checks for "unnormalized numbers" and other exceptions of the floating point processsor. */ -#if 0 -/* Enable FPE exception check */ +#ifdef FPE_CHECK #define fluid_check_fpe(expl) fluid_check_fpe_i386(expl) +#define fluid_clear_fpe() fluid_clear_fpe_i386() #else -/* Disable FPE exception check */ #define fluid_check_fpe(expl) +#define fluid_clear_fpe() #endif unsigned int fluid_check_fpe_i386(char * explanation_in_case_of_fpe); +void fluid_clear_fpe_i386(void); #endif /* _FLUID_SYS_H */ diff --git a/fluidsynth/src/fluid_voice.c b/fluidsynth/src/fluid_voice.c index e9dedc27..d8cc676b 100644 --- a/fluidsynth/src/fluid_voice.c +++ b/fluidsynth/src/fluid_voice.c @@ -46,21 +46,6 @@ #define FLUID_MIN_VOLENVRELEASE -7200.0f /* ~16ms */ -/* Purpose: - * zap_almost_zero will return a number, as long as its - * absolute value is over a certain threshold. Otherwise 0. See - * fluid_rev.c for documentation (denormal numbers) - */ - -# if defined(WITH_FLOAT) -# define zap_almost_zero(_sample) \ - ((((*(unsigned int*)&(_sample))&0x7f800000) < 0x08000000)? 0.0f : (_sample)) -# else -/* 1e-20 was chosen as an arbitrary (small) threshold. */ -#define zap_almost_zero(_sample) ((abs(_sample) < 1e-20)? 0.0f : (_sample)) -#endif - - static inline void fluid_voice_effects (fluid_voice_t *voice, int count, fluid_real_t* dsp_left_buf, fluid_real_t* dsp_right_buf, @@ -267,15 +252,9 @@ fluid_voice_write(fluid_voice_t* voice, fluid_real_t target_amp; /* target amplitude */ int count; - /* All variables starting with dsp_ are used by the DSP - loop. Documented in fluid_dsp_core.c */ - - int dsp_interp_method = voice->interp_method; - /* +4: add four floats for 16 added bytes */ - fluid_real_t dsp_buf_unaligned[FLUID_BUFSIZE+4]; - fluid_real_t* dsp_buf = (fluid_real_t*) FLUID_ALIGN16BYTE(&dsp_buf_unaligned); + fluid_real_t dsp_buf[FLUID_BUFSIZE]; fluid_env_data_t* env_data; fluid_real_t x; @@ -603,7 +582,6 @@ fluid_voice_write(fluid_voice_t* voice, * The buffer has to be filled from 0 to FLUID_BUFSIZE-1. * Depending on the position in the loop and the loop size, this * may require several runs. */ - fluid_check_fpe ("voice_write DSP processing"); voice->dsp_buf = dsp_buf; @@ -624,6 +602,8 @@ fluid_voice_write(fluid_voice_t* voice, break; } + fluid_check_fpe ("voice_write interpolation"); + if (count > 0) fluid_voice_effects (voice, count, dsp_left_buf, dsp_right_buf, dsp_reverb_buf, dsp_chorus_buf); @@ -698,12 +678,10 @@ fluid_voice_effects (fluid_voice_t *voice, int count, int dsp_i; float v; - /* filter (implement the voice filter according to Soundfont standard) */ + /* filter (implement the voice filter according to SoundFont standard) */ - /* Check for denormal number (too close to zero) once in a - * while. This is not a big concern here - why would someone play a - * sample with an empty tail? */ - dsp_hist1 = zap_almost_zero(dsp_hist1); + /* Check for denormal number (too close to zero). */ + if (fabs (dsp_hist1) < 1e-20) dsp_hist1 = 0.0f; /* FIXME JMG - Is this even needed? */ /* Two versions of the filter loop. One, while the filter is * changing towards its new setting. The other, if the filter @@ -792,6 +770,8 @@ fluid_voice_effects (fluid_voice_t *voice, int count, voice->b02 = dsp_b02; voice->b1 = dsp_b1; voice->filter_coeff_incr_count = dsp_filter_coeff_incr_count; + + fluid_check_fpe ("voice_effects"); } /* diff --git a/fluidsynth/src/fluidsynth_priv.h b/fluidsynth/src/fluidsynth_priv.h index 34ffacad..9ecaec12 100644 --- a/fluidsynth/src/fluidsynth_priv.h +++ b/fluidsynth/src/fluidsynth_priv.h @@ -277,21 +277,6 @@ typedef FILE* fluid_file; #define fluid_clip(_val, _min, _max) \ { (_val) = ((_val) < (_min))? (_min) : (((_val) > (_max))? (_max) : (_val)); } -/* Purpose: - * Some commands (SSE extensions on Pentium) need aligned data( - * The address must be ...xxx0. - * Take a pointer, and round it up to the next suitable address. - * Obviously, one has to allocate 15 bytes of additional memory. - * As soon as proper alignment is supported by the compiler, this - * can be removed. - */ -#ifdef ENABLE_SSE -/* FIXME - This is broken on AMD 64 - only used if SSE enabled */ -#define FLUID_ALIGN16BYTE(ptr)(((int)(ptr)+15) & (~0xFL)) -#else -#define FLUID_ALIGN16BYTE(ptr) ptr -#endif - #if WITH_FTS #define FLUID_PRINTF post #define FLUID_FLUSH()