Bulk update copyright dates
[flac.git] / src / share / replaygain_synthesis / replaygain_synthesis.c
index cdcc7dc..b7d227e 100644 (file)
@@ -1,19 +1,20 @@
 /* replaygain_synthesis - Routines for applying ReplayGain to a signal
- * Copyright (C) 2002,2003,2004  Josh Coalson
+ * Copyright (C) 2002-2009  Josh Coalson
+ * Copyright (C) 2011-2016  Xiph.Org Foundation
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
  *
- * This program is distributed in the hope that it will be useful,
+ * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 /*
  * This is an aggregation of pieces of code from John Edwards' WaveGain
  * Additional code by Magnus Holmgren and Gian-Carlo Pascutto
  */
 
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
 #include <string.h> /* for memset() */
 #include <math.h>
-#include "private/fast_float_math_hack.h"
-#include "replaygain_synthesis.h"
+#include "share/replaygain_synthesis.h"
 #include "FLAC/assert.h"
 
-#if defined _MSC_VER
-#define FLAC__INLINE __inline
-#else
-#define FLAC__INLINE
-#endif
-
-/* adjust for compilers that can't understand using LL suffix for int64_t literals */
-#ifdef _MSC_VER
-#define FLAC__I64L(x) x
-#else
 #define FLAC__I64L(x) x##LL
-#endif
 
 
 /*
@@ -86,7 +79,7 @@
  *  XORed values of both generators.
  */
 
-static unsigned int random_int_()
+static unsigned int random_int_(void)
 {
        static const unsigned char parity_[256] = {
                0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
@@ -211,14 +204,14 @@ void FLAC__replaygain_synthesis__init_dither_context(DitherContext *d, int bits,
        static unsigned char default_dither [] = { 92, 92, 88, 84, 81, 78, 74, 67,  0,  0 };
        static const float*               F [] = { F44_0, F44_1, F44_2, F44_3 };
 
-       int index;
+       int indx;
 
        if (shapingtype < 0) shapingtype = 0;
        if (shapingtype > 3) shapingtype = 3;
        d->ShapingType = (NoiseShaping)shapingtype;
-       index = bits - 11 - shapingtype;
-       if (index < 0) index = 0;
-       if (index > 9) index = 9;
+       indx = bits - 11 - shapingtype;
+       if (indx < 0) indx = 0;
+       if (indx > 9) indx = 9;
 
        memset ( d->ErrorHistory , 0, sizeof (d->ErrorHistory ) );
        memset ( d->DitherHistory, 0, sizeof (d->DitherHistory) );
@@ -226,7 +219,7 @@ void FLAC__replaygain_synthesis__init_dither_context(DitherContext *d, int bits,
        d->FilterCoeff = F [shapingtype];
        d->Mask   = ((FLAC__uint64)-1) << (32 - bits);
        d->Add    = 0.5     * ((1L << (32 - bits)) - 1);
-       d->Dither = 0.01f*default_dither[index] / (((FLAC__int64)1) << bits);
+       d->Dither = 0.01f*default_dither[indx] / (((FLAC__int64)1) << bits);
        d->LastHistoryIndex = 0;
 }
 
@@ -234,7 +227,7 @@ void FLAC__replaygain_synthesis__init_dither_context(DitherContext *d, int bits,
  * the following is based on parts of wavegain.c
  */
 
-static FLAC__INLINE FLAC__int64 dither_output_(DitherContext *d, FLAC__bool do_dithering, int shapingtype, int i, double Sum, int k)
+static FLAC__int64 dither_output_(DitherContext *d, FLAC__bool do_dithering, int shapingtype, int i, double Sum, int k)
 {
        union {
                double d;
@@ -301,41 +294,6 @@ static FLAC__INLINE FLAC__int64 dither_output_(DitherContext *d, FLAC__bool do_d
 
 size_t FLAC__replaygain_synthesis__apply_gain(FLAC__byte *data_out, FLAC__bool little_endian_data_out, FLAC__bool unsigned_data_out, const FLAC__int32 * const input[], unsigned wide_samples, unsigned channels, const unsigned source_bps, const unsigned target_bps, const double scale, const FLAC__bool hard_limit, FLAC__bool do_dithering, DitherContext *dither_context)
 {
-       static const FLAC__int32 conv_factors_[33] = {
-               -1, /* 0 bits-per-sample (not supported) */
-               -1, /* 1 bits-per-sample (not supported) */
-               -1, /* 2 bits-per-sample (not supported) */
-               -1, /* 3 bits-per-sample (not supported) */
-               268435456, /* 4 bits-per-sample */
-               134217728, /* 5 bits-per-sample */
-               67108864, /* 6 bits-per-sample */
-               33554432, /* 7 bits-per-sample */
-               16777216, /* 8 bits-per-sample */
-               8388608, /* 9 bits-per-sample */
-               4194304, /* 10 bits-per-sample */
-               2097152, /* 11 bits-per-sample */
-               1048576, /* 12 bits-per-sample */
-               524288, /* 13 bits-per-sample */
-               262144, /* 14 bits-per-sample */
-               131072, /* 15 bits-per-sample */
-               65536, /* 16 bits-per-sample */
-               32768, /* 17 bits-per-sample */
-               16384, /* 18 bits-per-sample */
-               8192, /* 19 bits-per-sample */
-               4096, /* 20 bits-per-sample */
-               2048, /* 21 bits-per-sample */
-               1024, /* 22 bits-per-sample */
-               512, /* 23 bits-per-sample */
-               256, /* 24 bits-per-sample */
-               128, /* 25 bits-per-sample */
-               64, /* 26 bits-per-sample */
-               32, /* 27 bits-per-sample */
-               16, /* 28 bits-per-sample */
-               8, /* 29 bits-per-sample */
-               4, /* 30 bits-per-sample */
-               2, /* 31 bits-per-sample */
-               1 /* 32 bits-per-sample */
-       };
        static const FLAC__int64 hard_clip_factors_[33] = {
                0, /* 0 bits-per-sample (not supported) */
                0, /* 1 bits-per-sample (not supported) */
@@ -371,7 +329,7 @@ size_t FLAC__replaygain_synthesis__apply_gain(FLAC__byte *data_out, FLAC__bool l
                -1073741824, /* 31 bits-per-sample */
                (FLAC__int64)(-1073741824) * 2 /* 32 bits-per-sample */
        };
-       const FLAC__int32 conv_factor = conv_factors_[target_bps];
+       const FLAC__int32 conv_shift = 32 - target_bps;
        const FLAC__int64 hard_clip_factor = hard_clip_factors_[target_bps];
        /*
         * The integer input coming in has a varying range based on the
@@ -414,9 +372,9 @@ size_t FLAC__replaygain_synthesis__apply_gain(FLAC__byte *data_out, FLAC__bool l
                                else if(sample > 0.5)
                                        sample = tanh((sample - 0.5) / (1-0.5)) * (1-0.5) + 0.5;
                        }
-                       sample *= 2147483647.f;
+                       sample *= 2147483647.;
 
-                       val64 = dither_output_(dither_context, do_dithering, noise_shaping, (i + last_history_index) % 32, sample, channel) / conv_factor;
+                       val64 = dither_output_(dither_context, do_dithering, noise_shaping, (i + last_history_index) % 32, sample, channel) >> conv_shift;
 
                        val32 = (FLAC__int32)val64;
                        if(val64 >= -hard_clip_factor)