diff options
author | Robin Gareus <robin@gareus.org> | 2015-11-03 19:20:00 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-11-03 19:21:32 +0100 |
commit | 5eaaa5fcaecc54fc8cc59e6573c544906d9ea0a8 (patch) | |
tree | 3bf08164aaab586805bea836b6ff68a1eb588f2e /libs/ardour/ebur128_analysis.cc | |
parent | 72ec5e9a0139b6b5eb8debaffd88f0ebd69df501 (diff) |
libardour wrapper for EBUr128 VAMP plugin
Diffstat (limited to 'libs/ardour/ebur128_analysis.cc')
-rw-r--r-- | libs/ardour/ebur128_analysis.cc | 112 |
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; +} |