summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2022-05-08 23:24:51 +0200
committerCarl Hetherington <cth@carlh.net>2022-05-08 23:25:42 +0200
commit1c9a65e90d05f02e1fd4914268435a9c2274459e (patch)
tree48a7276f759da5fa890c9532ad4fe2937aefb356
parent530f42305826fa96dc8fd807f44ac83a5b7866c4 (diff)
Speed up content selection when we have audio analysis files (#2247).
-rw-r--r--src/wx/audio_panel.cc17
-rw-r--r--src/wx/audio_panel.h2
2 files changed, 17 insertions, 2 deletions
diff --git a/src/wx/audio_panel.cc b/src/wx/audio_panel.cc
index f25af27f7..7efdeb8ac 100644
--- a/src/wx/audio_panel.cc
+++ b/src/wx/audio_panel.cc
@@ -57,6 +57,9 @@ using namespace boost::placeholders;
using namespace dcpomatic;
+std::map<boost::filesystem::path, float> AudioPanel::_peak_cache;
+
+
AudioPanel::AudioPanel (ContentPanel* p)
: ContentSubPanel (p, _("Audio"))
{
@@ -445,8 +448,18 @@ AudioPanel::peak () const
auto playlist = make_shared<Playlist>();
playlist->add (_parent->film(), sel.front());
try {
- auto analysis = make_shared<AudioAnalysis>(_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<AudioAnalysis>(path);
+ peak_dB = linear_to_db(analysis->overall_sample_peak().first.peak) + analysis->gain_correction(playlist);
+ _peak_cache[path] = *peak_dB;
+ }
} catch (...) {
}
diff --git a/src/wx/audio_panel.h b/src/wx/audio_panel.h
index 213ad4cb7..e3a294955 100644
--- a/src/wx/audio_panel.h
+++ b/src/wx/audio_panel.h
@@ -83,4 +83,6 @@ private:
boost::signals2::scoped_connection _mapping_connection;
boost::signals2::scoped_connection _active_jobs_connection;
+
+ static std::map<boost::filesystem::path, float> _peak_cache;
};