diff options
Diffstat (limited to 'libs/ardour/vumeterdsp.cc')
-rw-r--r-- | libs/ardour/vumeterdsp.cc | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/libs/ardour/vumeterdsp.cc b/libs/ardour/vumeterdsp.cc new file mode 100644 index 0000000000..67d48f6c54 --- /dev/null +++ b/libs/ardour/vumeterdsp.cc @@ -0,0 +1,89 @@ +/* + Copyright (C) 2012 Fons Adriaensen <fons@linuxaudio.org> + Adopted for Ardour 2013 by Robin Gareus <robin@gareus.org> + + 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 program 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. + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include <math.h> +#include "ardour/vumeterdsp.h" + + +float Vumeterdsp::_w; +float Vumeterdsp::_g; + + +Vumeterdsp::Vumeterdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Vumeterdsp::~Vumeterdsp (void) +{ +} + + +void Vumeterdsp::process (float *p, int n) +{ + float z1, z2, m, t1, t2; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + t2 = z2 / 2; + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + z2 += 4 * _w * (z1 - z2); + if (z2 > m) m = z2; + } + + _z1 = z1; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Vumeterdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Vumeterdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Vumeterdsp::init (float fsamp) +{ + _w = 11.1f / fsamp; + _g = 1.5f * 1.571f; +} |