summaryrefslogtreecommitdiff
path: root/libs/ardour/ebur128_analysis.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-11-03 19:20:00 +0100
committerRobin Gareus <robin@gareus.org>2015-11-03 19:21:32 +0100
commit5eaaa5fcaecc54fc8cc59e6573c544906d9ea0a8 (patch)
tree3bf08164aaab586805bea836b6ff68a1eb588f2e /libs/ardour/ebur128_analysis.cc
parent72ec5e9a0139b6b5eb8debaffd88f0ebd69df501 (diff)
libardour wrapper for EBUr128 VAMP plugin
Diffstat (limited to 'libs/ardour/ebur128_analysis.cc')
-rw-r--r--libs/ardour/ebur128_analysis.cc112
1 files changed, 112 insertions, 0 deletions
diff --git a/libs/ardour/ebur128_analysis.cc b/libs/ardour/ebur128_analysis.cc
new file mode 100644
index 0000000000..4ddf004adf
--- /dev/null
+++ b/libs/ardour/ebur128_analysis.cc
@@ -0,0 +1,112 @@
+/*
+ Copyright (C) 2015 Robin Gareus
+
+ 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 <cmath>
+#include "ardour/ebur128_analysis.h"
+
+#include "i18n.h"
+
+using namespace Vamp;
+using namespace ARDOUR;
+using namespace std;
+
+/* need a static initializer function for this */
+
+EBUr128Analysis::EBUr128Analysis (float sr)
+ : AudioAnalyser (sr, X_("libardourvampplugins:ebur128"))
+ , _loudness (0)
+ , _loudness_range (0)
+{
+}
+
+EBUr128Analysis::~EBUr128Analysis()
+{
+}
+
+int
+EBUr128Analysis::run (Readable* src)
+{
+ int ret = -1;
+ bool done = false;
+ framecnt_t len = src->readable_length();
+ framepos_t pos = 0;
+ uint32_t n_channels = src->n_channels();
+ Plugin::FeatureSet features;
+
+ plugin->reset ();
+ if (!plugin->initialise (n_channels, stepsize, bufsize)) {
+ return -1;
+ }
+
+ float** bufs = (float**) malloc(n_channels * sizeof(float*));
+ for (uint32_t c = 0; c < n_channels; ++c) {
+ bufs[c] = (float*) malloc(bufsize * sizeof(float));
+ }
+
+ while (!done) {
+ framecnt_t to_read;
+ to_read = min ((len - pos), (framecnt_t) bufsize);
+
+ for (uint32_t c = 0; c < n_channels; ++c) {
+ if (src->read (bufs[c], pos, to_read, c) != to_read) {
+ goto out;
+ }
+ /* zero fill buffer if necessary */
+ if (to_read != bufsize) {
+ memset (bufs[c] + to_read, 0, (bufsize - to_read) * sizeof (float));
+ }
+ }
+
+ plugin->process (bufs, RealTime::fromSeconds ((double) pos / sample_rate));
+
+ pos += min (stepsize, to_read);
+
+ if (pos >= len) {
+ done = true;
+ }
+ }
+
+ features = plugin->getRemainingFeatures ();
+
+ if (use_features (features, 0)) {
+ goto out;
+ }
+
+ ret = 0;
+
+out:
+ for (uint32_t c = 0; c < n_channels; ++c) {
+ free (bufs[c]);
+ }
+ free (bufs);
+
+ return ret;
+}
+
+int
+EBUr128Analysis::use_features (Plugin::FeatureSet& features, ostream* out)
+{
+ if (features.empty() || features.size() != 2) {
+ return 0;
+ }
+ _loudness = features[0][0].values[0];
+ _loudness_range = features[1][0].values[0];
+
+ return 0;
+}