diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-07-01 23:37:55 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-07-01 23:37:55 +0100 |
| commit | 4bf5a8794cf1ed6411e085b35c11777c3508f82e (patch) | |
| tree | 2e0390a371a9fe828307b6d11313726299f232e3 /src/wx/audio_dialog.cc | |
| parent | 92b6430402753a572c33d594ba0745a4e461edf4 (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_dialog.cc')
| -rw-r--r-- | src/wx/audio_dialog.cc | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/src/wx/audio_dialog.cc b/src/wx/audio_dialog.cc index cd59693ea..17d50ef69 100644 --- a/src/wx/audio_dialog.cc +++ b/src/wx/audio_dialog.cc @@ -27,10 +27,12 @@ #include "lib/job_manager.h" #include <boost/filesystem.hpp> +using std::cout; using boost::shared_ptr; using boost::bind; using boost::optional; using boost::const_pointer_cast; +using boost::dynamic_pointer_cast; /** @param content Content to analyse, or 0 to analyse all of the film's audio */ AudioDialog::AudioDialog (wxWindow* parent, shared_ptr<Film> film, shared_ptr<AudioContent> content) @@ -109,7 +111,7 @@ AudioDialog::AudioDialog (wxWindow* parent, shared_ptr<Film> film, shared_ptr<Au overall_sizer->Layout (); overall_sizer->SetSizeHints (this); - _film_connection = film->ContentChanged.connect (boost::bind (&AudioDialog::try_to_load_analysis, this)); + _film_connection = film->ContentChanged.connect (boost::bind (&AudioDialog::content_changed, this, _2)); SetTitle (_("DCP-o-matic audio")); if (content) { @@ -152,6 +154,7 @@ AudioDialog::try_to_load_analysis () } _plot->set_analysis (_analysis); + _plot->set_gain_correction (gain_correction ()); setup_peak_time (); /* Set up some defaults if no check boxes are checked */ @@ -214,8 +217,18 @@ AudioDialog::channel_clicked (wxCommandEvent& ev) void AudioDialog::content_changed (int p) { - if (p == AudioContentProperty::AUDIO_GAIN || p == AudioContentProperty::AUDIO_STREAMS) { + if (p == AudioContentProperty::AUDIO_STREAMS) { try_to_load_analysis (); + } else if (p == AudioContentProperty::AUDIO_GAIN) { + if (_playlist->content().size() == 1) { + /* We can use a short-cut to render the effect of this + change, rather than recalculating everything. + */ + _plot->set_gain_correction (gain_correction ()); + setup_peak_time (); + } else { + try_to_load_analysis (); + } } } @@ -250,7 +263,7 @@ AudioDialog::setup_peak_time () return; } - float peak_dB = 20 * log10 (_analysis->peak().get()); + float const peak_dB = 20 * log10 (_analysis->peak().get()) + gain_correction (); _peak_time->SetLabel ( wxString::Format ( @@ -274,3 +287,22 @@ AudioDialog::Show (bool show) try_to_load_analysis (); return r; } + +/** @return gain correction in dB required to be added to raw gain values to render + * the dialog correctly. + */ +float +AudioDialog::gain_correction () +{ + if (_playlist->content().size() == 1 && _analysis->analysis_gain ()) { + /* In this case we know that the analysis was of a single piece of content and + we know that content's gain when the analysis was run. Hence we can work out + what correction is now needed to make it look `right'. + */ + shared_ptr<const AudioContent> ac = dynamic_pointer_cast<const AudioContent> (_playlist->content().front ()); + DCPOMATIC_ASSERT (ac); + return ac->audio_gain() - _analysis->analysis_gain().get (); + } + + return 0.0f; +} |
