/*
- 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.
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)
_sample_peak[i] = 0;
_sample_peak_frame[i] = 0;
}
+
+ if (!_from_zero) {
+ _start = _playlist->start().get_value_or(DCPTime());
+ }
}
AnalyseAudioJob::~AnalyseAudioJob ()
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;
}
if (has_any_audio) {
+ player->seek (_start, true);
_done = 0;
while (!player->pass ()) {}
}
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);
_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()));
}
/*
- 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.
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;
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;
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);
}
/*
- 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.
JobManager::analyse_audio (
shared_ptr<const Film> film,
shared_ptr<const Playlist> playlist,
+ bool from_zero,
boost::signals2::connection& connection,
function<void()> ready
)
{
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);
}
/*
- 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.
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
);
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;
}
_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;
}
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 ();
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 ();
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 ();
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);
}
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 ());
}
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 ();