No-op; fix GPL address and use the explicit-program-name version.
[dcpomatic.git] / src / wx / audio_plot.cc
index 829290d4d16a57d126166ab307ef377fb3ace7bc..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,10 +41,11 @@ 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__      
+#ifndef __WXOSX__
        SetDoubleBuffered (true);
-#endif 
+#endif
 
        for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) {
                _channel_visible[i] = false;
@@ -65,14 +68,19 @@ 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 
-       
+#endif
+
        Bind (wxEVT_PAINT, boost::bind (&AudioPlot::paint, this));
-       
+
        SetMinSize (wxSize (640, 512));
 }
 
@@ -143,7 +151,7 @@ AudioPlot::paint ()
        gc->GetTextExtent (wxT ("-80dB"), &metrics.db_label_width, &db_label_height, &db_label_descent, &db_label_leading);
 
        metrics.db_label_width += 8;
-       
+
        int const data_width = GetSize().GetWidth() - metrics.db_label_width;
        /* Assume all channels have the same number of points */
        metrics.x_scale = data_width / float (_analysis->points (0));
@@ -162,7 +170,7 @@ AudioPlot::paint ()
        gc->StrokePath (grid);
 
        gc->DrawText (_("Time"), data_width, metrics.height - metrics.y_origin + db_label_height / 2);
-       
+
        if (_type_visible[AudioPoint::PEAK]) {
                for (int c = 0; c < MAX_DCP_AUDIO_CHANNELS; ++c) {
                        wxGraphicsPath p = gc->CreatePath ();
@@ -203,7 +211,7 @@ AudioPlot::y_for_linear (float p, Metrics const & metrics) const
        if (p < 1e-4) {
                p = 1e-4;
        }
-       
+
        return metrics.height - (20 * log10(p) - _minimum) * metrics.y_scale - metrics.y_origin;
 }
 
@@ -213,13 +221,13 @@ AudioPlot::plot_peak (wxGraphicsPath& path, int channel, Metrics const & metrics
        if (_analysis->points (channel) == 0) {
                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;
@@ -237,26 +245,26 @@ AudioPlot::plot_rms (wxGraphicsPath& path, int channel, Metrics const & metrics)
        if (_analysis->points (channel) == 0) {
                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;
-       
+
        /* Pre-load the smoothing list */
        for (int i = 0; i < before; ++i) {
                smoothing.push_back (first);
        }
        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;
+}