[SCM] calf/master: + VU meter: move to separate header to enable reuse, modify falloff behaviour, add clipping detection
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:39:52 UTC 2013
The following commit has been merged in the master branch:
commit 8641139a1723ad36df0f6a59b364b20b291f0213
Author: Krzysztof Foltman <wdev at foltman.com>
Date: Wed Dec 2 21:27:48 2009 +0000
+ VU meter: move to separate header to enable reuse, modify falloff behaviour, add clipping detection
diff --git a/src/calf/Makefile.am b/src/calf/Makefile.am
index 56963f6..48b0877 100644
--- a/src/calf/Makefile.am
+++ b/src/calf/Makefile.am
@@ -5,4 +5,4 @@ noinst_HEADERS = audio_fx.h benchmark.h biquad.h buffer.h custom_ctl.h \
lv2_uri_map.h lv2-midiport.h lv2helpers.h lv2wrap.h \
main_win.h metadata.h modmatrix.h modules.h modules_dev.h modules_small.h modules_synths.h modulelist.h \
multichorus.h onepole.h organ.h osc.h osctl.h osctlnet.h osctlserv.h plugininfo.h preset.h \
- preset_gui.h primitives.h synth.h utils.h wave.h waveshaping.h
+ preset_gui.h primitives.h synth.h utils.h vumeter.h wave.h waveshaping.h
diff --git a/src/calf/jackhost.h b/src/calf/jackhost.h
index 38b7b02..d6a1816 100644
--- a/src/calf/jackhost.h
+++ b/src/calf/jackhost.h
@@ -27,6 +27,7 @@
#include <jack/midiport.h>
#include "gui.h"
#include "utils.h"
+#include "vumeter.h"
#include <pthread.h>
namespace calf_plugins {
@@ -164,31 +165,6 @@ public:
}
};
-struct vumeter
-{
- float level, falloff;
-
- vumeter()
- {
- falloff = 0.999f;
- level = 0;
- }
-
- inline void update(float *src, unsigned int len)
- {
- double tmp = level;
- for (unsigned int i = 0; i < len; i++)
- tmp = std::max(tmp * falloff, (double)fabs(src[i]));
- level = tmp;
- dsp::sanitize(level);
- }
- inline void update_zeros(unsigned int len)
- {
- level *= pow((double)falloff, (double)len);
- dsp::sanitize(level);
- }
-};
-
template<class Module>
class jack_host: public jack_host_base, public Module {
public:
diff --git a/src/calf/vumeter.h b/src/calf/vumeter.h
new file mode 100644
index 0000000..de174c1
--- /dev/null
+++ b/src/calf/vumeter.h
@@ -0,0 +1,74 @@
+/* Calf DSP Library
+ * Peak metering facilities.
+ *
+ * Copyright (C) 2007 Krzysztof Foltman
+ *
+ * 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, 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., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+#ifndef __CALF_VUMETER_H
+#define __CALF_VUMETER_H
+
+/// Peak meter class
+struct vumeter
+{
+ /// Measured signal level
+ float level;
+ /// Falloff of signal level (b1 coefficient of a 1-pole filter)
+ float falloff;
+ /// Clip indicator (set to 1 when |value| >= 1, fading otherwise)
+ float clip;
+ /// Falloff of clip indicator (b1 coefficient of a 1-pole filter); set to 1 if no falloff is required (manual reset of clip indicator)
+ float clip_falloff;
+
+ vumeter()
+ {
+ falloff = 0.999f;
+ level = 0;
+ clip_falloff = 0.999f;
+ clip = 0;
+ }
+
+ /// Update peak meter based on input signal
+ inline void update(float *src, unsigned int len)
+ {
+ // "Age" the old level by falloff^length
+ float tmp = level * pow(falloff, len);
+ // Same for clip level (using different fade constant)
+ double tmp_clip = clip * pow(clip_falloff, len);
+ // Process input samples - to get peak value, take a max of all values in the input signal and "aged" old peak
+ // Clip is set to 1 if any sample is out-of-range, if no clip occurs, the "aged" value is assumed
+ for (unsigned int i = 0; i < len; i++) {
+ float sig = fabs(src[i]);
+ tmp = std::max(tmp, sig);
+ if (sig >= 1.f)
+ tmp_clip = 1.f;
+ }
+ level = tmp;
+ clip = tmp_clip;
+ dsp::sanitize(level);
+ dsp::sanitize(clip);
+ }
+ /// Update clip meter as if update was called with all-zero input signal
+ inline void update_zeros(unsigned int len)
+ {
+ level *= pow((double)falloff, (double)len);
+ clip *= pow((double)clip_falloff, (double)len);
+ dsp::sanitize(level);
+ dsp::sanitize(clip);
+ }
+};
+
+#endif
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list