Revert "Use make_shared<>."
[dcpomatic.git] / src / wx / audio_plot.cc
index 1c5c1f94bf210ef37d1cde0f9d8780e224ebda4a..c19ba946a6c362efdf09adfa98b6442303ecac61 100644 (file)
@@ -1,29 +1,31 @@
 /*
-    Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
 
-    This program is free software; you can redistribute it and/or modify
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic 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,
+    DCP-o-matic 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.
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
 
 */
 
-#include <iostream>
-#include <boost/bind.hpp>
-#include <wx/graphics.h>
 #include "audio_plot.h"
 #include "lib/audio_decoder.h"
 #include "lib/audio_analysis.h"
+#include "lib/compose.hpp"
 #include "wx/wx_util.h"
+#include <wx/graphics.h>
+#include <boost/bind.hpp>
+#include <iostream>
 
 using std::cout;
 using std::vector;
@@ -39,6 +41,7 @@ int const AudioPlot::max_smoothing = 128;
 AudioPlot::AudioPlot (wxWindow* parent)
        : wxPanel (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE)
        , _smoothing (max_smoothing / 2)
+       , _gain_correction (0)
 {
 #ifndef __WXOSX__
        SetDoubleBuffered (true);
@@ -65,9 +68,14 @@ AudioPlot::AudioPlot (wxWindow* parent)
        _colours.push_back (wxColour (255,   0, 139));
        _colours.push_back (wxColour (139,   0, 255));
 
+       _colours.push_back (wxColour (139, 139, 255));
+       _colours.push_back (wxColour (  0, 139, 255));
+       _colours.push_back (wxColour (255, 139, 139));
+       _colours.push_back (wxColour (255, 139,   0));
+
        set_analysis (shared_ptr<AudioAnalysis> ());
 
-#if MAX_DCP_AUDIO_CHANNELS != 12
+#if MAX_DCP_AUDIO_CHANNELS != 16
 #warning AudioPlot::AudioPlot is expecting the wrong MAX_DCP_AUDIO_CHANNELS
 #endif
 
@@ -214,12 +222,12 @@ AudioPlot::plot_peak (wxGraphicsPath& path, int channel, Metrics const & metrics
                return;
        }
 
-       path.MoveToPoint (metrics.db_label_width, y_for_linear (_analysis->get_point(channel, 0)[AudioPoint::PEAK], metrics));
+       path.MoveToPoint (metrics.db_label_width, y_for_linear (get_point(channel, 0)[AudioPoint::PEAK], metrics));
 
        float peak = 0;
        int const N = _analysis->points(channel);
        for (int i = 0; i < N; ++i) {
-               float const p = _analysis->get_point(channel, i)[AudioPoint::PEAK];
+               float const p = get_point(channel, i)[AudioPoint::PEAK];
                peak -= 0.01f * (1 - log10 (_smoothing) / log10 (max_smoothing));
                if (p > peak) {
                        peak = p;
@@ -238,14 +246,14 @@ AudioPlot::plot_rms (wxGraphicsPath& path, int channel, Metrics const & metrics)
                return;
        }
 
-       path.MoveToPoint (metrics.db_label_width, y_for_linear (_analysis->get_point(channel, 0)[AudioPoint::RMS], metrics));
+       path.MoveToPoint (metrics.db_label_width, y_for_linear (get_point(channel, 0)[AudioPoint::RMS], metrics));
 
        list<float> smoothing;
 
        int const N = _analysis->points(channel);
 
-       float const first = _analysis->get_point(channel, 0)[AudioPoint::RMS];
-       float const last = _analysis->get_point(channel, N - 1)[AudioPoint::RMS];
+       float const first = get_point(channel, 0)[AudioPoint::RMS];
+       float const last = get_point(channel, N - 1)[AudioPoint::RMS];
 
        int const before = _smoothing / 2;
        int const after = _smoothing - before;
@@ -256,7 +264,7 @@ AudioPlot::plot_rms (wxGraphicsPath& path, int channel, Metrics const & metrics)
        }
        for (int i = 0; i < after; ++i) {
                if (i < N) {
-                       smoothing.push_back (_analysis->get_point(channel, i)[AudioPoint::RMS]);
+                       smoothing.push_back (get_point(channel, i)[AudioPoint::RMS]);
                } else {
                        smoothing.push_back (last);
                }
@@ -267,7 +275,7 @@ AudioPlot::plot_rms (wxGraphicsPath& path, int channel, Metrics const & metrics)
                int const next_for_window = i + after;
 
                if (next_for_window < N) {
-                       smoothing.push_back (_analysis->get_point(channel, i)[AudioPoint::RMS]);
+                       smoothing.push_back (get_point(channel, i)[AudioPoint::RMS]);
                } else {
                        smoothing.push_back (last);
                }
@@ -293,3 +301,21 @@ AudioPlot::set_smoothing (int s)
        _smoothing = s;
        Refresh ();
 }
+
+void
+AudioPlot::set_gain_correction (double gain)
+{
+       _gain_correction = gain;
+       Refresh ();
+}
+
+AudioPoint
+AudioPlot::get_point (int channel, int point) const
+{
+       AudioPoint p = _analysis->get_point (channel, point);
+       for (int i = 0; i < AudioPoint::COUNT; ++i) {
+               p[i] *= pow (10, _gain_correction / 20);
+       }
+
+       return p;
+}