summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/film.cc48
-rw-r--r--src/lib/film.h17
-rw-r--r--src/lib/player.cc2
-rw-r--r--src/lib/playlist.h9
4 files changed, 50 insertions, 26 deletions
diff --git a/src/lib/film.cc b/src/lib/film.cc
index c6a6f3cce..6ae33f9f2 100644
--- a/src/lib/film.cc
+++ b/src/lib/film.cc
@@ -212,10 +212,10 @@ Film::Film(optional<boost::filesystem::path> dir)
_video_bit_rate[encoding] = Config::instance()->default_video_bit_rate(encoding);
}
- _playlist_change_connection = _playlist->Change.connect(bind(&Film::playlist_change, this, _1));
- _playlist_order_changed_connection = _playlist->OrderChange.connect(bind(&Film::playlist_order_changed, this));
- _playlist_content_change_connection = _playlist->ContentChange.connect(bind(&Film::playlist_content_change, this, _1, _2, _3));
- _playlist_length_change_connection = _playlist->LengthChange.connect(bind(&Film::playlist_length_change, this));
+ _playlist_change_connection = _playlist->Change.connect_same_thread(bind(&Film::playlist_change, this, _1));
+ _playlist_order_changed_connection = _playlist->OrderChange.connect_same_thread(bind(&Film::playlist_order_changed, this));
+ _playlist_content_change_connection = _playlist->ContentChange.connect_same_thread(bind(&Film::playlist_content_change, this, _1, _2, _3));
+ _playlist_length_change_connection = _playlist->LengthChange.connect_same_thread(bind(&Film::playlist_length_change, this));
if (dir) {
_directory = dcp::filesystem::weakly_canonical(*dir);
@@ -430,7 +430,7 @@ Film::metadata(bool with_content_paths) const
cxml::add_text_child(root, "CustomReelBoundary", fmt::to_string(boundary.get()));
}
cxml::add_text_child(root, "ReencodeJ2K", _reencode_j2k ? "1" : "0");
- cxml::add_text_child(root, "UserExplicitVideoFrameRate", _user_explicit_video_frame_rate ? "1" : "0");
+ cxml::add_text_child(root, "UserExplicitVideoFrameRate", user_explicit_video_frame_rate() ? "1" : "0");
for (auto const& marker: _markers) {
auto m = cxml::add_child(root, "Marker");
m->set_attribute("type", dcp::marker_to_string(marker.first));
@@ -1220,14 +1220,21 @@ Film::set_video_bit_rate(VideoEncoding encoding, int64_t bit_rate)
void
Film::set_video_frame_rate(int f, bool user_explicit)
{
- if (_video_frame_rate == f) {
- return;
+ {
+ boost::mutex::scoped_lock lm(_mutex);
+ if (_video_frame_rate == f) {
+ return;
+ }
}
FilmChangeSignaller ch(this, FilmProperty::VIDEO_FRAME_RATE);
- _video_frame_rate = f;
- if (user_explicit) {
- _user_explicit_video_frame_rate = true;
+
+ {
+ boost::mutex::scoped_lock lm(_mutex);
+ _video_frame_rate = f;
+ if (user_explicit) {
+ _user_explicit_video_frame_rate = true;
+ }
}
}
@@ -1314,12 +1321,16 @@ Film::set_reencode_j2k(bool r)
_reencode_j2k = r;
}
+
+/** Can be called from any thread */
void
Film::signal_change(ChangeType type, int p)
{
signal_change(type, static_cast<FilmProperty>(p));
}
+
+/** Can be called from any thread */
void
Film::signal_change(ChangeType type, FilmProperty p)
{
@@ -1327,7 +1338,7 @@ Film::signal_change(ChangeType type, FilmProperty p)
set_dirty(true);
if (p == FilmProperty::CONTENT) {
- if (!_user_explicit_video_frame_rate) {
+ if (!user_explicit_video_frame_rate()) {
set_video_frame_rate(best_video_frame_rate());
}
}
@@ -1784,7 +1795,7 @@ Film::check_settings_consistency()
void
Film::playlist_order_changed()
{
- /* XXX: missing PENDING */
+ signal_change(ChangeType::PENDING, FilmProperty::CONTENT_ORDER);
signal_change(ChangeType::DONE, FilmProperty::CONTENT_ORDER);
}
@@ -2374,12 +2385,17 @@ Film::set_sign_language_video_language(optional<dcp::LanguageTag> lang)
void
-Film::set_dirty(bool dirty)
+Film::set_dirty(bool dirty_)
{
- auto const changed = dirty != _dirty;
- _dirty = dirty;
+ bool changed = false;
+ {
+ boost::mutex::scoped_lock lm(_mutex);
+ changed = dirty_ != _dirty;
+ _dirty = dirty_;
+ }
+
if (changed) {
- emit(boost::bind(boost::ref(DirtyChange), _dirty));
+ emit(boost::bind(boost::ref(DirtyChange), dirty()));
}
}
diff --git a/src/lib/film.h b/src/lib/film.h
index 8574c700f..d6c6e945b 100644
--- a/src/lib/film.h
+++ b/src/lib/film.h
@@ -39,6 +39,7 @@
#include "ratio.h"
#include "remembered_asset.h"
#include "resolution.h"
+#include "signal.h"
#include "signaller.h"
#include "territory_type.h"
#include "transcode_job.h"
@@ -133,6 +134,7 @@ public:
/** @return true if our state has changed since we last saved it */
bool dirty() const {
+ boost::mutex::scoped_lock lm(_mutex);
return _dirty;
}
@@ -486,10 +488,17 @@ private:
void check_reel_boundaries_for_atmos();
std::vector<dcpomatic::DCPTimePeriod> reels_for_type(ReelType type) const;
+ bool user_explicit_video_frame_rate() const {
+ boost::mutex::scoped_lock lm(_mutex);
+ return _user_explicit_video_frame_rate;
+ }
+
/** Log to write to */
std::shared_ptr<Log> _log;
std::shared_ptr<Playlist> _playlist;
+ mutable boost::mutex _mutex;
+
/** Complete path to directory containing the film metadata;
* must not be relative.
*/
@@ -570,10 +579,10 @@ private:
std::map<std::string, std::string> _ui_state;
- boost::signals2::scoped_connection _playlist_change_connection;
- boost::signals2::scoped_connection _playlist_order_changed_connection;
- boost::signals2::scoped_connection _playlist_content_change_connection;
- boost::signals2::scoped_connection _playlist_length_change_connection;
+ ScopedConnection _playlist_change_connection;
+ ScopedConnection _playlist_order_changed_connection;
+ ScopedConnection _playlist_content_change_connection;
+ ScopedConnection _playlist_length_change_connection;
std::list<boost::signals2::connection> _job_connections;
std::list<boost::signals2::connection> _audio_analysis_connections;
diff --git a/src/lib/player.cc b/src/lib/player.cc
index 878a802f6..58e49c921 100644
--- a/src/lib/player.cc
+++ b/src/lib/player.cc
@@ -143,7 +143,7 @@ Player::connect()
/* The butler must hear about this first, so since we are proxying this through to the butler we must
be first.
*/
- _playlist_change_connection = playlist()->Change.connect(bind(&Player::playlist_change, this, _1), boost::signals2::at_front);
+ _playlist_change_connection = playlist()->Change.connect_same_thread(bind(&Player::playlist_change, this, _1), boost::signals2::at_front);
_playlist_content_change_connection = playlist()->ContentChange.connect(bind(&Player::playlist_content_change, this, _1, _2, _3));
}
diff --git a/src/lib/playlist.h b/src/lib/playlist.h
index ca4a80bbf..d3fff1fdb 100644
--- a/src/lib/playlist.h
+++ b/src/lib/playlist.h
@@ -30,7 +30,6 @@
#include "signal.h"
#include "types.h"
#include <libcxml/cxml.h>
-#include <boost/signals2.hpp>
#include <boost/thread.hpp>
#include <list>
@@ -83,12 +82,12 @@ public:
void repeat(std::shared_ptr<const Film> film, ContentList, int);
/** Emitted when content has been added to or removed from the playlist; implies OrderChange */
- mutable boost::signals2::signal<void (ChangeType)> Change;
- mutable boost::signals2::signal<void ()> OrderChange;
+ mutable Signal<void (ChangeType)> Change;
+ mutable Signal<void ()> OrderChange;
/** Emitted when the length might have changed; may sometimes be emitted when it has not */
- mutable boost::signals2::signal<void ()> LengthChange;
+ mutable Signal<void ()> LengthChange;
- mutable boost::signals2::signal<void (ChangeType, int, bool)> ContentChange;
+ mutable Signal<void (ChangeType, int, bool)> ContentChange;
private:
void content_change(std::weak_ptr<const Film>, ChangeType, int, bool);