X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Fwx%2Faudio_panel.cc;h=50831ec4076607e5833a64d7cc5f983a02ae44c3;hp=fed1e9c6a0934c459e175632665aa6ad4f565063;hb=28dc02d0b3759f37f66fed9a5f7e35d1c7c61aeb;hpb=fdb36750a09e3bba3d10fe5102e39a62eda68ea6 diff --git a/src/wx/audio_panel.cc b/src/wx/audio_panel.cc index fed1e9c6a..50831ec40 100644 --- a/src/wx/audio_panel.cc +++ b/src/wx/audio_panel.cc @@ -36,11 +36,12 @@ #include "lib/ffmpeg_content.h" #include "lib/job_manager.h" #include "lib/maths_util.h" +#include +LIBDCP_DISABLE_WARNINGS #include -#include +LIBDCP_ENABLE_WARNINGS -using std::cout; using std::dynamic_pointer_cast; using std::list; using std::make_shared; @@ -56,6 +57,9 @@ using namespace boost::placeholders; using namespace dcpomatic; +std::map AudioPanel::_peak_cache; + + AudioPanel::AudioPanel (ContentPanel* p) : ContentSubPanel (p, _("Audio")) { @@ -109,7 +113,7 @@ AudioPanel::create () _fade_out_label = create_label (this, _("Fade out"), true); _fade_out = new Timecode (this); - _use_same_fades_as_video = new wxCheckBox (this, wxID_ANY, _("Use same fades as video")); + _use_same_fades_as_video = new CheckBox(this, _("Use same fades as video")); _mapping = new AudioMappingView (this, _("Content"), _("content"), _("DCP"), _("DCP")); _sizer->Add (_mapping, 1, wxEXPAND | wxALL, 6); @@ -128,20 +132,20 @@ AudioPanel::create () film_changed (Film::Property::VIDEO_FRAME_RATE); film_changed (Film::Property::REEL_TYPE); - _reference->Bind (wxEVT_CHECKBOX, boost::bind (&AudioPanel::reference_clicked, this)); + _reference->bind(&AudioPanel::reference_clicked, this); _show->Bind (wxEVT_BUTTON, boost::bind (&AudioPanel::show_clicked, this)); _gain_calculate_button->Bind (wxEVT_BUTTON, boost::bind (&AudioPanel::gain_calculate_button_clicked, this)); _fade_in->Changed.connect (boost::bind(&AudioPanel::fade_in_changed, this)); _fade_out->Changed.connect (boost::bind(&AudioPanel::fade_out_changed, this)); - _use_same_fades_as_video->Bind (wxEVT_CHECKBOX, boost::bind(&AudioPanel::use_same_fades_as_video_changed, this)); + _use_same_fades_as_video->bind(&AudioPanel::use_same_fades_as_video_changed, this); _mapping_connection = _mapping->Changed.connect (boost::bind (&AudioPanel::mapping_changed, this, _1)); _active_jobs_connection = JobManager::instance()->ActiveJobsChanged.connect (boost::bind (&AudioPanel::active_jobs_changed, this, _1, _2)); add_to_grid (); - _sizer->Layout (); + layout(); } @@ -191,14 +195,6 @@ AudioPanel::add_to_grid () } -AudioPanel::~AudioPanel () -{ - if (_audio_dialog) { - _audio_dialog->Destroy (); - _audio_dialog = nullptr; - } -} - void AudioPanel::film_changed (Film::Property property) { @@ -257,6 +253,8 @@ AudioPanel::film_content_changed (int property) setup_peak (); layout (); } else if (property == AudioContentProperty::GAIN) { + /* This is a bit aggressive but probably not so bad */ + _peak_cache.clear(); setup_peak (); } else if (property == DCPContentProperty::REFERENCE_AUDIO) { if (ac.size() == 1) { @@ -306,18 +304,17 @@ AudioPanel::film_content_changed (int property) void AudioPanel::gain_calculate_button_clicked () { - auto d = new GainCalculatorDialog (this); - auto const r = d->ShowModal (); - auto c = d->db_change(); + GainCalculatorDialog dialog(this); + auto const r = dialog.ShowModal(); + auto change = dialog.db_change(); - if (r == wxID_CANCEL || !c) { - d->Destroy (); + if (r == wxID_CANCEL || !change) { return; } auto old_peak_dB = peak (); auto old_value = _gain->wrapped()->GetValue(); - _gain->wrapped()->SetValue(old_value + *c); + _gain->wrapped()->SetValue(old_value + *change); /* This appears to be necessary, as the change is not signalled, I think. @@ -330,8 +327,6 @@ AudioPanel::gain_calculate_button_clicked () _gain->wrapped()->SetValue (old_value); _gain->view_changed (); } - - d->Destroy (); } @@ -418,17 +413,14 @@ AudioPanel::setup_sensitivity () void AudioPanel::show_clicked () { - if (_audio_dialog) { - _audio_dialog->Destroy (); - _audio_dialog = nullptr; - } + _audio_dialog.reset(); auto ac = _parent->selected_audio (); if (ac.size() != 1) { return; } - _audio_dialog = new AudioDialog (this, _parent->film(), _parent->film_viewer(), ac.front()); + _audio_dialog.reset(this, _parent->film(), _parent->film_viewer(), ac.front()); _audio_dialog->Show (); } @@ -444,8 +436,18 @@ AudioPanel::peak () const auto playlist = make_shared(); playlist->add (_parent->film(), sel.front()); try { - auto analysis = make_shared(_parent->film()->audio_analysis_path(playlist)); - peak_dB = linear_to_db(analysis->overall_sample_peak().first.peak) + analysis->gain_correction(playlist); + /* Loading the audio analysis file is slow, and this ::peak() is called a few times when + * the content selection is changed, so cache it. + */ + auto const path = _parent->film()->audio_analysis_path(playlist); + auto cached = _peak_cache.find(path); + if (cached != _peak_cache.end()) { + peak_dB = cached->second; + } else { + auto analysis = make_shared(path); + peak_dB = linear_to_db(analysis->overall_sample_peak().first.peak) + analysis->gain_correction(playlist); + _peak_cache[path] = *peak_dB; + } } catch (...) { } @@ -517,10 +519,7 @@ void AudioPanel::set_film (shared_ptr) { /* We are changing film, so destroy any audio dialog for the old one */ - if (_audio_dialog) { - _audio_dialog->Destroy (); - _audio_dialog = nullptr; - } + _audio_dialog.reset(); }