[PD-cvs] externals/freeverb~ freeverb~.c,1.3,1.4
Martin Peach
mrpeach at users.sourceforge.net
Mon Dec 10 23:23:28 CET 2007
Update of /cvsroot/pure-data/externals/freeverb~
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14040
Modified Files:
freeverb~.c
Log Message:
Modified denormal checking code to avoid type-punning errors.
Index: freeverb~.c
===================================================================
RCS file: /cvsroot/pure-data/externals/freeverb~/freeverb~.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** freeverb~.c 24 Sep 2006 23:05:22 -0000 1.3
--- freeverb~.c 10 Dec 2007 22:23:26 -0000 1.4
***************
*** 28,31 ****
--- 28,32 ----
#pragma warning( disable : 4244 )
#pragma warning( disable : 4305 )
+ #define inline __inline
#endif
***************
*** 134,147 ****
} t_freeverb;
#ifndef IRIX
! #define IS_DENORM_FLOAT(v) ((((*(unsigned long*)&(v))&0x7f800000)==0)&&((v)!=0.f))
! #define IS_NAN_FLOAT(v) (((*(unsigned long*)&(v))&0x7f800000)==0x7f800000)
! #define IS_DENORM_NAN_FLOAT(v) (IS_DENORM_FLOAT(v)||IS_NAN_FLOAT(v))
! #define FIX_DENORM_NAN_FLOAT(v) ((v)=IS_DENORM_NAN_FLOAT(v)?0.f:(v))
! #else
! #define FIX_DENORM_NAN_FLOAT(v);
! #endif
! /* we need prototypes for Mac for everything */
static void comb_setdamp(t_freeverb *x, t_floatarg val);
static void comb_setfeedback(t_freeverb *x, t_floatarg val);
--- 135,169 ----
} t_freeverb;
+ //#ifndef IRIX
+ //#define IS_DENORM_FLOAT(v) ((((*(unsigned long*)&(v))&0x7f800000)==0)&&((v)!=0.f))
+ //#define IS_NAN_FLOAT(v) (((*(unsigned long*)&(v))&0x7f800000)==0x7f800000)
+ //#define IS_DENORM_NAN_FLOAT(v) (IS_DENORM_FLOAT(v)||IS_NAN_FLOAT(v))
+ //#define FIX_DENORM_NAN_FLOAT(v) ((v)=IS_DENORM_NAN_FLOAT(v)?0.f:(v))
+ //#else
+ //#define FIX_DENORM_NAN_FLOAT(v);
+ //#endif
+
+ typedef union ulf
+ {
+ unsigned long ul;
+ float f;
+ } ulf;
+
+ static inline float fix_denorm_nan_float(float v);
+
+ static inline float fix_denorm_nan_float(float v)
+ {
#ifndef IRIX
! ulf u;
! u.f = v;
! if ((((u.ul & 0x7f800000) == 0L) && (u.f != 0.f)) || ((u.ul & 0x7f800000) == 0x7f800000))
! /* if the float is denormal or NaN, return 0.0 */
! return 0.0f;
! #endif //IRIX
! return v;
! }
!
! /* we need prototypes for Mac for everything */
static void comb_setdamp(t_freeverb *x, t_floatarg val);
static void comb_setfeedback(t_freeverb *x, t_floatarg val);
***************
*** 172,175 ****
--- 194,200 ----
static float freeverb_getdb(float f);
static void freeverb_print(t_freeverb *x);
+ #ifdef PD
+ void freeverb_tilde_setup(void);
+ #endif
#ifndef PD
void freeverb_assist(t_freeverb *x, void *b, long m, long a, char *s);
***************
*** 197,204 ****
output = x->x_bufcombL[filteridx][bufidx];
! FIX_DENORM_NAN_FLOAT(output);
! x->x_filterstoreL[filteridx] = (output*x->x_combdamp2) + (x->x_filterstoreL[filteridx]*x->x_combdamp1);
! FIX_DENORM_NAN_FLOAT(x->x_filterstoreL[filteridx]);
x->x_bufcombL[filteridx][bufidx] = input + (x->x_filterstoreL[filteridx]*x->x_combfeedback);
--- 222,231 ----
output = x->x_bufcombL[filteridx][bufidx];
! //FIX_DENORM_NAN_FLOAT(output);
! fix_denorm_nan_float(output);
! x->x_filterstoreL[filteridx] = (output*x->x_combdamp2) + (x->x_filterstoreL[filteridx]*x->x_combdamp1);
! //FIX_DENORM_NAN_FLOAT(x->x_filterstoreL[filteridx]);
! fix_denorm_nan_float(x->x_filterstoreL[filteridx]);
x->x_bufcombL[filteridx][bufidx] = input + (x->x_filterstoreL[filteridx]*x->x_combfeedback);
***************
*** 215,222 ****
output = x->x_bufcombR[filteridx][bufidx];
! FIX_DENORM_NAN_FLOAT(output);
x->x_filterstoreR[filteridx] = (output*x->x_combdamp2) + (x->x_filterstoreR[filteridx]*x->x_combdamp1);
! FIX_DENORM_NAN_FLOAT(x->x_filterstoreR[filteridx]);
x->x_bufcombR[filteridx][bufidx] = input + (x->x_filterstoreR[filteridx]*x->x_combfeedback);
--- 242,251 ----
output = x->x_bufcombR[filteridx][bufidx];
! //FIX_DENORM_NAN_FLOAT(output);
! fix_denorm_nan_float(output);
x->x_filterstoreR[filteridx] = (output*x->x_combdamp2) + (x->x_filterstoreR[filteridx]*x->x_combdamp1);
! //FIX_DENORM_NAN_FLOAT(x->x_filterstoreR[filteridx]);
! fix_denorm_nan_float(x->x_filterstoreR[filteridx]);
x->x_bufcombR[filteridx][bufidx] = input + (x->x_filterstoreR[filteridx]*x->x_combfeedback);
***************
*** 241,245 ****
bufout = (t_float)x->x_bufallpassL[filteridx][bufidx];
! FIX_DENORM_NAN_FLOAT(bufout);
output = -input + bufout;
--- 270,275 ----
bufout = (t_float)x->x_bufallpassL[filteridx][bufidx];
! //FIX_DENORM_NAN_FLOAT(bufout);
! fix_denorm_nan_float(bufout);
output = -input + bufout;
***************
*** 259,263 ****
bufout = (t_float)x->x_bufallpassR[filteridx][bufidx];
! FIX_DENORM_NAN_FLOAT(bufout);
output = -input + bufout;
--- 289,294 ----
bufout = (t_float)x->x_bufallpassR[filteridx][bufidx];
! //FIX_DENORM_NAN_FLOAT(bufout);
! fix_denorm_nan_float(bufout);
output = -input + bufout;
More information about the Pd-cvs
mailing list