using std::cout;
using std::dynamic_pointer_cast;
-using std::list;
-using std::make_pair;
using std::make_shared;
-using std::map;
using std::max;
using std::min;
-using std::pair;
using std::shared_ptr;
using std::string;
using std::vector;
using namespace dcpomatic;
-static
-void
-ignore_progress (float)
-{
-
-}
-
-
/** @param j Job to report progress to, or 0.
* @param text_only true to enable only the text (subtitle/ccap) parts of the writer.
*/
pool.create_thread (boost::bind (&boost::asio::io_service::run, &service));
}
- boost::function<void (float)> set_progress;
+ std::function<void (float)> set_progress;
if (job) {
set_progress = boost::bind (&Writer::set_digest_progress, this, job.get(), _1);
} else {
- set_progress = &ignore_progress;
+ set_progress = [](float) {
+ boost::this_thread::interruption_point();
+ };
}
for (auto& i: _reels) {
work.reset ();
- {
+ try {
+ pool.join_all ();
+ } catch (boost::thread_interrupted) {
+ /* join_all was interrupted, so we need to interrupt the threads
+ * in our pool then try again to join them.
+ */
+ pool.interrupt_all ();
pool.join_all ();
}
issuer = String::compose("DCP-o-matic %1 %2", dcpomatic_version, dcpomatic_git_commit);
}
+ cpl->set_creator (creator);
+ cpl->set_issuer (issuer);
+
cpl->set_ratings (film()->ratings());
vector<dcp::ContentVersion> cv;
if (film()->luminance()) {
cpl->set_luminance (*film()->luminance());
}
+ if (film()->sign_language_video_language()) {
+ cpl->set_sign_language_video_language (*film()->sign_language_video_language());
+ }
auto ac = film()->mapped_audio_channels();
dcp::MCASoundField field = (
boost::algorithm::replace_all (text, "$TYPE", film()->dcp_content_type()->pretty_name());
boost::algorithm::replace_all (text, "$CONTAINER", film()->container()->container_nickname());
- auto audio_languages = film()->audio_languages();
- if (!audio_languages.empty()) {
- boost::algorithm::replace_all (text, "$AUDIO_LANGUAGE", audio_languages.front().description());
+ auto audio_language = film()->audio_language();
+ if (audio_language) {
+ boost::algorithm::replace_all (text, "$AUDIO_LANGUAGE", audio_language->description());
} else {
boost::algorithm::replace_all (text, "$AUDIO_LANGUAGE", _("None"));
}
Waker waker;
waker.nudge ();
+
+ boost::this_thread::interruption_point();
}
/** Calculate hashes for any referenced MXF assets which do not already have one */
void
-Writer::calculate_referenced_digests (boost::function<void (float)> set_progress)
+Writer::calculate_referenced_digests (std::function<void (float)> set_progress)
+try
{
for (auto const& i: _reel_assets) {
auto file = dynamic_pointer_cast<dcp::ReelFileAsset>(i.asset);
file->set_hash (file->asset_ref().asset()->hash());
}
}
+} catch (boost::thread_interrupted) {
+ /* set_progress contains an interruption_point, so any of these methods
+ * may throw thread_interrupted, at which point we just give up.
+ */
}