summaryrefslogtreecommitdiff
path: root/src/wx/audio_plot.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-07-01 23:37:55 +0100
committerCarl Hetherington <cth@carlh.net>2015-07-01 23:37:55 +0100
commit4bf5a8794cf1ed6411e085b35c11777c3508f82e (patch)
tree2e0390a371a9fe828307b6d11313726299f232e3 /src/wx/audio_plot.cc
parent92b6430402753a572c33d594ba0745a4e461edf4 (diff)
Restore short-cutting of analysis gain updates.
If we have an analysis of one piece of content and the gain changes we don't re-run the analysis, instead applying a suitable `correction' in the UI.
Diffstat (limited to 'src/wx/audio_plot.cc')
-rw-r--r--src/wx/audio_plot.cc41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/wx/audio_plot.cc b/src/wx/audio_plot.cc
index 1c5c1f94b..605738b4f 100644
--- a/src/wx/audio_plot.cc
+++ b/src/wx/audio_plot.cc
@@ -1,5 +1,5 @@
/*
- 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
it under the terms of the GNU General Public License as published by
@@ -17,13 +17,13 @@
*/
-#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 "wx/wx_util.h"
+#include <wx/graphics.h>
+#include <boost/bind.hpp>
+#include <iostream>
using std::cout;
using std::vector;
@@ -39,6 +39,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);
@@ -214,12 +215,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 +239,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 +257,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 +268,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 +294,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;
+}