From: Carl Hetherington Date: Sat, 10 Feb 2018 02:05:14 +0000 (+0000) Subject: Fix odd behaviour when analysing single bits of audio which start at non-zero positio... X-Git-Tag: v2.11.53~1 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=9d4906db6e143248cf1e814d539aa2c7a50721dc Fix odd behaviour when analysing single bits of audio which start at non-zero positions (#1203). --- diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc index fe56b3b6c..b96c7047b 100644 --- a/src/lib/analyse_audio_job.cc +++ b/src/lib/analyse_audio_job.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2018 Carl Hetherington This file is part of DCP-o-matic. @@ -50,9 +50,11 @@ using boost::dynamic_pointer_cast; int const AnalyseAudioJob::_num_points = 1024; -AnalyseAudioJob::AnalyseAudioJob (shared_ptr film, shared_ptr playlist) +/** @param from_zero true to analyse audio from time 0 in the playlist, otherwise begin at Playlist::start */ +AnalyseAudioJob::AnalyseAudioJob (shared_ptr film, shared_ptr playlist, bool from_zero) : Job (film) , _playlist (playlist) + , _from_zero (from_zero) , _done (0) , _samples_per_point (1) , _current (0) @@ -71,6 +73,10 @@ AnalyseAudioJob::AnalyseAudioJob (shared_ptr film, shared_ptrstart().get_value_or(DCPTime()); + } } AnalyseAudioJob::~AnalyseAudioJob () @@ -105,10 +111,9 @@ AnalyseAudioJob::run () player->set_play_referenced (); player->Audio.connect (bind (&AnalyseAudioJob::analyse, this, _1, _2)); - DCPTime const start = _playlist->start().get_value_or (DCPTime ()); DCPTime const length = _playlist->length (); - Frame const len = DCPTime (length - start).frames_round (_film->audio_frame_rate()); + Frame const len = DCPTime (length - _start).frames_round (_film->audio_frame_rate()); _samples_per_point = max (int64_t (1), len / _num_points); delete[] _current; @@ -123,6 +128,7 @@ AnalyseAudioJob::run () } if (has_any_audio) { + player->seek (_start, true); _done = 0; while (!player->pass ()) {} } @@ -166,6 +172,8 @@ AnalyseAudioJob::run () void AnalyseAudioJob::analyse (shared_ptr b, DCPTime time) { + DCPOMATIC_ASSERT (time >= _start); + #ifdef DCPOMATIC_HAVE_EBUR128_PATCHED_FFMPEG if (Config::instance()->analyse_ebur128 ()) { _ebur128->process (b); @@ -203,7 +211,6 @@ AnalyseAudioJob::analyse (shared_ptr b, DCPTime time) _done += frames; - DCPTime const start = _playlist->start().get_value_or (DCPTime ()); DCPTime const length = _playlist->length (); - set_progress ((time.seconds() - start.seconds()) / (length.seconds() - start.seconds())); + set_progress ((time.seconds() - _start.seconds()) / (length.seconds() - _start.seconds())); } diff --git a/src/lib/analyse_audio_job.h b/src/lib/analyse_audio_job.h index 7e5ea4719..d8dcda2f1 100644 --- a/src/lib/analyse_audio_job.h +++ b/src/lib/analyse_audio_job.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2018 Carl Hetherington This file is part of DCP-o-matic. @@ -44,7 +44,7 @@ class Filter; class AnalyseAudioJob : public Job { public: - AnalyseAudioJob (boost::shared_ptr, boost::shared_ptr); + AnalyseAudioJob (boost::shared_ptr, boost::shared_ptr, bool from_zero); ~AnalyseAudioJob (); std::string name () const; @@ -59,6 +59,8 @@ private: void analyse (boost::shared_ptr, DCPTime time); boost::shared_ptr _playlist; + DCPTime _start; + bool _from_zero; int64_t _done; int64_t _samples_per_point; diff --git a/src/lib/film.cc b/src/lib/film.cc index db1cb39aa..d5af889c5 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -1067,7 +1067,7 @@ Film::maybe_add_content (weak_ptr j, weak_ptr c, bool disable_audi playlist->add (content); boost::signals2::connection c; JobManager::instance()->analyse_audio ( - shared_from_this (), playlist, c, bind (&Film::audio_analysis_finished, this) + shared_from_this(), playlist, false, c, bind (&Film::audio_analysis_finished, this) ); _audio_analysis_connections.push_back (c); } diff --git a/src/lib/job_manager.cc b/src/lib/job_manager.cc index 3992e685e..d76f86056 100644 --- a/src/lib/job_manager.cc +++ b/src/lib/job_manager.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2018 Carl Hetherington This file is part of DCP-o-matic. @@ -182,6 +182,7 @@ void JobManager::analyse_audio ( shared_ptr film, shared_ptr playlist, + bool from_zero, boost::signals2::connection& connection, function ready ) @@ -203,7 +204,7 @@ JobManager::analyse_audio ( { boost::mutex::scoped_lock lm (_mutex); - job.reset (new AnalyseAudioJob (film, playlist)); + job.reset (new AnalyseAudioJob (film, playlist, from_zero)); connection = job->Finished.connect (ready); _jobs.push_back (job); } diff --git a/src/lib/job_manager.h b/src/lib/job_manager.h index c623b6ef9..9cba0fd09 100644 --- a/src/lib/job_manager.h +++ b/src/lib/job_manager.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2018 Carl Hetherington This file is part of DCP-o-matic. @@ -50,6 +50,7 @@ public: void analyse_audio ( boost::shared_ptr film, boost::shared_ptr playlist, + bool from_zero, boost::signals2::connection& connection, boost::function ready ); diff --git a/src/wx/audio_dialog.cc b/src/wx/audio_dialog.cc index 73ddd4c01..a08d29ad8 100644 --- a/src/wx/audio_dialog.cc +++ b/src/wx/audio_dialog.cc @@ -169,11 +169,15 @@ AudioDialog::try_to_load_analysis () shared_ptr film = _film.lock (); DCPOMATIC_ASSERT (film); + shared_ptr check = _content.lock(); + boost::filesystem::path const path = film->audio_analysis_path (_playlist); if (!boost::filesystem::exists (path)) { _plot->set_analysis (shared_ptr ()); _analysis.reset (); - JobManager::instance()->analyse_audio (film, _playlist, _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this)); + JobManager::instance()->analyse_audio ( + film, _playlist, !static_cast(check), _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this) + ); return; } @@ -181,11 +185,15 @@ AudioDialog::try_to_load_analysis () _analysis.reset (new AudioAnalysis (path)); } catch (OldFormatError& e) { /* An old analysis file: recreate it */ - JobManager::instance()->analyse_audio (film, _playlist, _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this)); + JobManager::instance()->analyse_audio ( + film, _playlist, !static_cast(check), _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this) + ); return; } catch (xmlpp::exception& e) { /* Probably a (very) old-style analysis file: recreate it */ - JobManager::instance()->analyse_audio (film, _playlist, _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this)); + JobManager::instance()->analyse_audio ( + film, _playlist, !static_cast(check), _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this) + ); return; } diff --git a/test/audio_analysis_test.cc b/test/audio_analysis_test.cc index 64081b89c..b461680c3 100644 --- a/test/audio_analysis_test.cc +++ b/test/audio_analysis_test.cc @@ -111,7 +111,7 @@ BOOST_AUTO_TEST_CASE (audio_analysis_test) film->examine_and_add_content (c); wait_for_jobs (); - shared_ptr job (new AnalyseAudioJob (film, film->playlist ())); + shared_ptr job (new AnalyseAudioJob (film, film->playlist(), false)); job->Finished.connect (boost::bind (&finished)); JobManager::instance()->add (job); wait_for_jobs (); @@ -128,7 +128,7 @@ BOOST_AUTO_TEST_CASE (audio_analysis_negative_delay_test) c->audio->set_delay (-250); - shared_ptr job (new AnalyseAudioJob (film, film->playlist ())); + shared_ptr job (new AnalyseAudioJob (film, film->playlist(), false)); job->Finished.connect (boost::bind (&finished)); JobManager::instance()->add (job); wait_for_jobs (); @@ -143,7 +143,7 @@ BOOST_AUTO_TEST_CASE (audio_analysis_test2) film->examine_and_add_content (c); wait_for_jobs (); - shared_ptr job (new AnalyseAudioJob (film, film->playlist ())); + shared_ptr job (new AnalyseAudioJob (film, film->playlist(), false)); job->Finished.connect (boost::bind (&finished)); JobManager::instance()->add (job); wait_for_jobs (); @@ -174,7 +174,7 @@ BOOST_AUTO_TEST_CASE (audio_analysis_test3) film->set_audio_channels (12); boost::signals2::connection connection; - JobManager::instance()->analyse_audio (film, film->playlist(), connection, boost::bind (&analysis_finished)); + JobManager::instance()->analyse_audio (film, film->playlist(), false, connection, boost::bind (&analysis_finished)); wait_for_jobs (); BOOST_CHECK (done); } @@ -193,6 +193,6 @@ BOOST_AUTO_TEST_CASE (analyse_audio_test4) shared_ptr playlist (new Playlist); playlist->add (content); boost::signals2::connection c; - JobManager::instance()->analyse_audio (film, playlist, c, boost::bind (&finished)); + JobManager::instance()->analyse_audio (film, playlist, false, c, boost::bind (&finished)); BOOST_CHECK (!wait_for_jobs ()); } diff --git a/test/audio_processor_test.cc b/test/audio_processor_test.cc index e3917af42..de212f611 100644 --- a/test/audio_processor_test.cc +++ b/test/audio_processor_test.cc @@ -48,7 +48,7 @@ BOOST_AUTO_TEST_CASE (audio_processor_test) film->set_audio_processor (AudioProcessor::from_id ("mid-side-decoder")); /* Analyse the audio and check it doesn't crash */ - shared_ptr job (new AnalyseAudioJob (film, film->playlist ())); + shared_ptr job (new AnalyseAudioJob (film, film->playlist(), false)); JobManager::instance()->add (job); wait_for_jobs ();