#include "pa_dither.h"#include "pa_types.h"#define PA_DITHER_BITS_ (15)void PaUtil_InitializeTriangularDitherState( PaUtilTriangularDitherGenerator *state ){ state->previous = 0; state->randSeed1 = 22222; state->randSeed2 = 5555555;}signed long PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerator *state ){ signed long current, highPass; /* Generate two random numbers. */ state->randSeed1 = (state->randSeed1 * 196314165) + 907633515; state->randSeed2 = (state->randSeed2 * 196314165) + 907633515; /* Generate triangular distribution about 0. * Shift before adding to prevent overflow which would skew the distribution. * Also shift an extra bit for the high pass filter. */#define DITHER_SHIFT_ ((SIZEOF_LONG*8 - PA_DITHER_BITS_) + 1) current = (((signed long)state->randSeed1)>>DITHER_SHIFT_) + (((signed long)state->randSeed2)>>DITHER_SHIFT_); /* High pass filter to reduce audibility. */ highPass = current - state->previous; state->previous = current; return highPass;}/* Multiply by PA_FLOAT_DITHER_SCALE_ to get a float between -2.0 and +1.99999 */#define PA_FLOAT_DITHER_SCALE_ (1.0f / ((1<<PA_DITHER_BITS_)-1))static const float const_float_dither_scale_ = PA_FLOAT_DITHER_SCALE_;float PaUtil_GenerateFloatTriangularDither( PaUtilTriangularDitherGenerator *state ){ signed long current, highPass; /* Generate two random numbers. */ state->randSeed1 = (state->randSeed1 * 196314165) + 907633515; state->randSeed2 = (state->randSeed2 * 196314165) + 907633515; /* Generate triangular distribution about 0. * Shift before adding to prevent overflow which would skew the distribution. * Also shift an extra bit for the high pass filter. */#define DITHER_SHIFT_ ((SIZEOF_LONG*8 - PA_DITHER_BITS_) + 1) current = (((signed long)state->randSeed1)>>DITHER_SHIFT_) + (((signed long)state->randSeed2)>>DITHER_SHIFT_); /* High pass filter to reduce audibility. */ highPass = current - state->previous; state->previous = current; return ((float)highPass) * const_float_dither_scale_;}