export analysis: include true-peak positions.
authorRobin Gareus <robin@gareus.org>
Fri, 12 Feb 2016 11:42:51 +0000 (12:42 +0100)
committerRobin Gareus <robin@gareus.org>
Fri, 12 Feb 2016 11:42:51 +0000 (12:42 +0100)
libs/ardour/ardour/export_analysis.h
libs/audiographer/src/general/analyser.cc

index 9da0a4f7876d02f844198e00335669b69152d0af..f62cdf0d533ae857a54443a06b810d154afe4085 100644 (file)
@@ -20,6 +20,7 @@
 #define __ardour_export_analysis_h__
 
 #include <map>
+#include <set>
 #include <cstring>
 #include <boost/shared_ptr.hpp>
 
@@ -53,6 +54,7 @@ namespace ARDOUR {
                        , have_loudness (other.have_loudness)
                        , have_dbtp (other.have_dbtp)
                        , n_channels (other.n_channels)
+                       , truepeakpos (other.truepeakpos)
                {
                        memcpy (peaks, other.peaks, sizeof(peaks));
                        memcpy (spectrum, other.spectrum, sizeof(spectrum));
@@ -74,6 +76,7 @@ namespace ARDOUR {
 
                PeakData peaks[2][800];
                float spectrum[800][200];
+               std::set<framecnt_t> truepeakpos[2]; // bins with >= -1dBTB
        };
 
        typedef boost::shared_ptr<ExportAnalysis> ExportAnalysisPtr;
index 23c85e8a7c7b912057cd25963334d3dfcad7cbdc..d969095b0847c0c1281115a665ab128902033e06 100644 (file)
@@ -248,13 +248,21 @@ Analyser::result ()
                }
        }
 
+       const unsigned cmask = _result.n_channels - 1; // [0, 1]
        for (unsigned int c = 0; c < _channels; ++c) {
                if (!_dbtp_plugin[c]) { continue; }
                Vamp::Plugin::FeatureSet features = _dbtp_plugin[c]->getRemainingFeatures ();
-               if (!features.empty () && features.size () == 1) {
+               if (!features.empty () && features.size () == 2) {
                        _result.have_dbtp = true;
                        float p = features[0][0].values[0];
                        if (p > _result.truepeak) { _result.truepeak = p; }
+
+                       for (std::vector<float>::const_iterator i = features[1][0].values.begin();
+                                       i != features[1][0].values.end(); ++i) {
+                               const framecnt_t pk = (*i) / _spp;
+                               const unsigned int cc = c & cmask;
+                               _result.truepeakpos[cc].insert (pk);
+                       }
                }
        }