/* ZynAddSubFX - a software synthesizer Compressor.h - simple audio compressor macros Copyright (C) 2016 Hans Petter Selasky 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. */ #ifndef _COMPRESSOR_H_ #define _COMPRESSOR_H_ #define floatIsValid(x) ({ \ float __r = (x) * 0.0; \ __r == 0.0 || __r == -0.0; \ }) #define stereoCompressor(div,pv,l,r) do { \ /* \ * Don't max the output range to avoid \ * overflowing sample rate conversion and \ * equalizer filters in the DSP's output \ * path. Keep one 10th, 1dB, reserved. \ */ \ const float __limit = 1.0 - (1.0 / 10.0); \ float __peak; \ \ /* sanity checks */ \ __peak = (pv); \ if (!floatIsValid(__peak)) \ __peak = 0.0; \ if (!floatIsValid(l)) \ (l) = 0.0; \ if (!floatIsValid(r)) \ (r) = 0.0; \ /* compute maximum */ \ if ((l) < -__peak) \ __peak = -(l); \ else if ((l) > __peak) \ __peak = (l); \ if ((r) < -__peak) \ __peak = -(r); \ else if ((r) > __peak) \ __peak = (r); \ /* compressor */ \ if (__peak > __limit) { \ (l) /= __peak; \ (r) /= __peak; \ (l) *= __limit; \ (r) *= __limit; \ __peak -= __peak / (div); \ } \ (pv) = __peak; \ } while (0) #endif /* _COMPRESSOR_H_ */