summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-02-10 02:05:14 +0000
committerCarl Hetherington <cth@carlh.net>2018-02-10 02:05:14 +0000
commit9d4906db6e143248cf1e814d539aa2c7a50721dc (patch)
treef64ba1c5c73d8e15ad94f71897805b68d96a6c1b
parent11a6decd652158b2288de17dc1aeafcd860fdfef (diff)
Fix odd behaviour when analysing single bits of audio which start at non-zero positions (#1203).
-rw-r--r--src/lib/analyse_audio_job.cc19
-rw-r--r--src/lib/analyse_audio_job.h6
-rw-r--r--src/lib/film.cc2
-rw-r--r--src/lib/job_manager.cc5
-rw-r--r--src/lib/job_manager.h3
-rw-r--r--src/wx/audio_dialog.cc14
-rw-r--r--test/audio_analysis_test.cc10
-rw-r--r--test/audio_processor_test.cc2
8 files changed, 40 insertions, 21 deletions
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 <cth@carlh.net>
+ Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
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<const Film> film, shared_ptr<const Playlist> playlist)
+/** @param from_zero true to analyse audio from time 0 in the playlist, otherwise begin at Playlist::start */
+AnalyseAudioJob::AnalyseAudioJob (shared_ptr<const Film> film, shared_ptr<const Playlist> 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<const Film> film, shared_ptr<const
_sample_peak[i] = 0;
_sample_peak_frame[i] = 0;
}
+
+ if (!_from_zero) {
+ _start = _playlist->start().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<const AudioBuffers> 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<const AudioBuffers> 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 <cth@carlh.net>
+ Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -44,7 +44,7 @@ class Filter;
class AnalyseAudioJob : public Job
{
public:
- AnalyseAudioJob (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist>);
+ AnalyseAudioJob (boost::shared_ptr<const Film>, boost::shared_ptr<const Playlist>, bool from_zero);
~AnalyseAudioJob ();
std::string name () const;
@@ -59,6 +59,8 @@ private:
void analyse (boost::shared_ptr<const AudioBuffers>, DCPTime time);
boost::shared_ptr<const Playlist> _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<Job> j, weak_ptr<Content> 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 <cth@carlh.net>
+ Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -182,6 +182,7 @@ void
JobManager::analyse_audio (
shared_ptr<const Film> film,
shared_ptr<const Playlist> playlist,
+ bool from_zero,
boost::signals2::connection& connection,
function<void()> 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 <cth@carlh.net>
+ Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
@@ -50,6 +50,7 @@ public:
void analyse_audio (
boost::shared_ptr<const Film> film,
boost::shared_ptr<const Playlist> playlist,
+ bool from_zero,
boost::signals2::connection& connection,
boost::function<void()> 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<const Film> film = _film.lock ();
DCPOMATIC_ASSERT (film);
+ shared_ptr<Content> check = _content.lock();
+
boost::filesystem::path const path = film->audio_analysis_path (_playlist);
if (!boost::filesystem::exists (path)) {
_plot->set_analysis (shared_ptr<AudioAnalysis> ());
_analysis.reset ();
- JobManager::instance()->analyse_audio (film, _playlist, _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this));
+ JobManager::instance()->analyse_audio (
+ film, _playlist, !static_cast<bool>(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<bool>(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<bool>(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<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist ()));
+ shared_ptr<AnalyseAudioJob> 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<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist ()));
+ shared_ptr<AnalyseAudioJob> 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<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist ()));
+ shared_ptr<AnalyseAudioJob> 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> 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<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist ()));
+ shared_ptr<AnalyseAudioJob> job (new AnalyseAudioJob (film, film->playlist(), false));
JobManager::instance()->add (job);
wait_for_jobs ();