* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
* *
- * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 *
- * by the XIPHOPHORUS Company http://www.xiph.org/ *
+ * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
+ * by the Xiph.Org Foundation http://www.xiph.org/ *
* *
********************************************************************
function: linear scale -> dB, Bark and Mel scales
- last mod: $Id: scales.h,v 1.26 2002/07/11 06:40:50 xiphmont Exp $
********************************************************************/
#include <math.h>
#include "os.h"
+#ifdef _MSC_VER
+/* MS Visual Studio doesn't have C99 inline keyword. */
+#define inline __inline
+#endif
+
/* 20log10(x) */
#define VORBIS_IEEE_FLOAT32 1
#ifdef VORBIS_IEEE_FLOAT32
-static float unitnorm(float x){
- ogg_uint32_t *ix=(ogg_uint32_t *)&x;
- *ix=(*ix&0x80000000UL)|(0x3f800000UL);
- return(x);
-}
-
-static float FABS(float *x){
- ogg_uint32_t *ix=(ogg_uint32_t *)x;
- *ix&=0x7fffffffUL;
- return(*x);
+static inline float unitnorm(float x){
+ union {
+ ogg_uint32_t i;
+ float f;
+ } ix;
+ ix.f = x;
+ ix.i = (ix.i & 0x80000000U) | (0x3f800000U);
+ return ix.f;
}
-static float todB(const float *x){
- float calc;
- ogg_int32_t *i=(ogg_int32_t *)x;
- calc = ((*i) & 0x7fffffff);
- calc *= 7.1771144e-7f;
- calc += -764.27118f;
- return calc;
+/* Segher was off (too high) by ~ .3 decibel. Center the conversion correctly. */
+static inline float todB(const float *x){
+ union {
+ ogg_uint32_t i;
+ float f;
+ } ix;
+ ix.f = *x;
+ ix.i = ix.i&0x7fffffff;
+ return (float)(ix.i * 7.17711438e-7f -764.6161886f);
}
#define todB_nn(x) todB(x)
return(1.f);
}
-#define FABS(x) fabs(*(x))
-
#define todB(x) (*(x)==0?-400.f:log(*(x)**(x))*4.34294480f)
#define todB_nn(x) (*(x)==0.f?-400.f:log(*(x))*8.6858896f)
-#endif
+#endif
-#define fromdB(x) (exp((x)*.11512925f))
+#define fromdB(x) (exp((x)*.11512925f))
/* The bark scale equations are approximations, since the original
table was somewhat hand rolled. The below are chosen to have the
#define fromOC(o) (exp(((o)+5.965784f)*.693147f))
#endif
-