diff --git a/libs/ardour/ardour/ebur128_analysis.h b/libs/ardour/ardour/ebur128_analysis.h new file mode 100644 index 0000000000..325ed76c2d --- /dev/null +++ b/libs/ardour/ardour/ebur128_analysis.h @@ -0,0 +1,53 @@ +/* + 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. + +*/ + +#ifndef __ardour_ebur128_analysis_h__ +#define __ardour_ebur128_analysis_h__ + +#include "ardour/audioanalyser.h" +#include "ardour/readable.h" + +namespace ARDOUR { + +class AudioSource; +class Session; + +class LIBARDOUR_API EBUr128Analysis : public AudioAnalyser +{ +public: + EBUr128Analysis (float sample_rate); + ~EBUr128Analysis(); + + int run (Readable*); + + float loudness () const { return _loudness; } + float loudness_range () const { return _loudness_range; } + +protected: + int use_features (Vamp::Plugin::FeatureSet&, std::ostream*); + +private: + float _loudness; + float _loudness_range; + +}; + +} /* namespace */ + +#endif /* __ardour_audioanalyser_h__ */ 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 +#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; +} diff --git a/libs/ardour/wscript b/libs/ardour/wscript index dccdd30345..c0ef56b7e3 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -65,6 +65,7 @@ libardour_sources = [ 'delivery.cc', 'directory_names.cc', 'diskstream.cc', + 'ebur128_analysis.cc', 'element_import_handler.cc', 'element_importer.cc', 'engine_slave.cc',