diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-03-26 22:58:01 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-03-26 22:58:01 +0100 |
| commit | 37c28f4c76df89bc84d773beda1bb90be1cedd1a (patch) | |
| tree | 6346c20f1b47bcac9f8c383f8bee41ca56a26de1 /src/wx/audio_plot.cc | |
| parent | f0192490565c72aa9838f40cbab56c4c0c60e522 (diff) | |
Bump audio analysis file version and cache drawn points in the audio plot.
Diffstat (limited to 'src/wx/audio_plot.cc')
| -rw-r--r-- | src/wx/audio_plot.cc | 99 |
1 files changed, 60 insertions, 39 deletions
diff --git a/src/wx/audio_plot.cc b/src/wx/audio_plot.cc index 493d99f5e..19e7bdac8 100644 --- a/src/wx/audio_plot.cc +++ b/src/wx/audio_plot.cc @@ -169,52 +169,45 @@ AudioPlot::paint () gc->SetPen (wxPen (wxColour (200, 200, 200))); gc->StrokePath (h_grid); - if (_analysis->samples_per_point() && _analysis->sample_rate()) { + /* Draw an x axis with marks */ - /* Draw an x axis with marks */ + wxGraphicsPath v_grid = gc->CreatePath (); - wxGraphicsPath v_grid = gc->CreatePath (); + DCPOMATIC_ASSERT (_analysis->samples_per_point() != 0.0); + double const pps = _analysis->sample_rate() * metrics.x_scale / _analysis->samples_per_point(); - DCPOMATIC_ASSERT (_analysis->samples_per_point().get() != 0.0); - double const pps = _analysis->sample_rate().get() * metrics.x_scale / _analysis->samples_per_point().get(); + gc->SetPen (*wxThePenList->FindOrCreatePen (wxColour (0, 0, 0), 1, wxPENSTYLE_SOLID)); - gc->SetPen (*wxThePenList->FindOrCreatePen (wxColour (0, 0, 0), 1, wxPENSTYLE_SOLID)); + double const mark_interval = calculate_mark_interval (rint (128 / pps)); - double const mark_interval = calculate_mark_interval (rint (128 / pps)); + DCPTime t = DCPTime::from_seconds (mark_interval); + while ((t.seconds() * pps) < data_width) { + double tc = t.seconds (); + int const h = tc / 3600; + tc -= h * 3600; + int const m = tc / 60; + tc -= m * 60; + int const s = tc; - DCPTime t = DCPTime::from_seconds (mark_interval); - while ((t.seconds() * pps) < data_width) { - double tc = t.seconds (); - int const h = tc / 3600; - tc -= h * 3600; - int const m = tc / 60; - tc -= m * 60; - int const s = tc; + wxString str = wxString::Format (wxT ("%02d:%02d:%02d"), h, m, s); + wxDouble str_width; + wxDouble str_height; + wxDouble str_descent; + wxDouble str_leading; + gc->GetTextExtent (str, &str_width, &str_height, &str_descent, &str_leading); - wxString str = wxString::Format (wxT ("%02d:%02d:%02d"), h, m, s); - wxDouble str_width; - wxDouble str_height; - wxDouble str_descent; - wxDouble str_leading; - gc->GetTextExtent (str, &str_width, &str_height, &str_descent, &str_leading); + int const tx = llrintf (metrics.db_label_width + t.seconds() * pps); + gc->DrawText (str, tx - str_width / 2, metrics.height - metrics.y_origin + db_label_height); - int const tx = llrintf (metrics.db_label_width + t.seconds() * pps); - gc->DrawText (str, tx - str_width / 2, metrics.height - metrics.y_origin + db_label_height); + v_grid.MoveToPoint (tx, metrics.height - metrics.y_origin + 4); + v_grid.AddLineToPoint (tx, metrics.y_origin); - v_grid.MoveToPoint (tx, metrics.height - metrics.y_origin + 4); - v_grid.AddLineToPoint (tx, metrics.y_origin); - - t += DCPTime::from_seconds (mark_interval); - } - - gc->SetPen (wxPen (wxColour (200, 200, 200))); - gc->StrokePath (v_grid); - - } else { - /* This is an old analysis without samples_per_point information */ - gc->DrawText (_("Time"), data_width, metrics.height - metrics.y_origin + db_label_height / 2); + t += DCPTime::from_seconds (mark_interval); } + gc->SetPen (wxPen (wxColour (200, 200, 200))); + gc->StrokePath (v_grid); + if (_type_visible[AudioPoint::PEAK]) { for (int c = 0; c < MAX_DCP_AUDIO_CHANNELS; ++c) { wxGraphicsPath p = gc->CreatePath (); @@ -266,7 +259,7 @@ AudioPlot::plot_peak (wxGraphicsPath& path, int channel, Metrics const & metrics return; } - path.MoveToPoint (metrics.db_label_width, y_for_linear (get_point(channel, 0)[AudioPoint::PEAK], metrics)); + _peak[channel] = PointList (); float peak = 0; int const N = _analysis->points(channel); @@ -279,7 +272,20 @@ AudioPlot::plot_peak (wxGraphicsPath& path, int channel, Metrics const & metrics peak = 0; } - path.AddLineToPoint (metrics.db_label_width + i * metrics.x_scale, y_for_linear (peak, metrics)); + _peak[channel].push_back ( + Point ( + wxPoint (metrics.db_label_width + i * metrics.x_scale, y_for_linear (peak, metrics)), + DCPTime::from_frames (i * _analysis->samples_per_point(), _analysis->sample_rate()), + peak + ) + ); + } + + DCPOMATIC_ASSERT (_peak.find(channel) != _peak.end()); + + path.MoveToPoint (_peak[channel][0].draw); + BOOST_FOREACH (Point const & i, _peak[channel]) { + path.AddLineToPoint (i.draw); } } @@ -290,7 +296,7 @@ AudioPlot::plot_rms (wxGraphicsPath& path, int channel, Metrics const & metrics) return; } - path.MoveToPoint (metrics.db_label_width, y_for_linear (get_point(channel, 0)[AudioPoint::RMS], metrics)); + _rms[channel] = PointList(); list<float> smoothing; @@ -335,7 +341,20 @@ AudioPlot::plot_rms (wxGraphicsPath& path, int channel, Metrics const & metrics) p = sqrt (p / smoothing.size ()); } - path.AddLineToPoint (metrics.db_label_width + i * metrics.x_scale, y_for_linear (p, metrics)); + _rms[channel].push_back ( + Point ( + wxPoint (metrics.db_label_width + i * metrics.x_scale, y_for_linear (p, metrics)), + DCPTime::from_frames (i * _analysis->samples_per_point(), _analysis->sample_rate()), + p + ) + ); + } + + DCPOMATIC_ASSERT (_rms.find(channel) != _rms.end()); + + path.MoveToPoint (_rms[channel][0].draw); + BOOST_FOREACH (Point const & i, _rms[channel]) { + path.AddLineToPoint (i.draw); } } @@ -343,6 +362,8 @@ void AudioPlot::set_smoothing (int s) { _smoothing = s; + _rms.clear (); + _peak.clear (); Refresh (); } |
