summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-09-04 12:50:25 +0100
committerCarl Hetherington <cth@carlh.net>2018-09-04 12:50:25 +0100
commita57717d54c34096d80a467ad78e9fdcecca70b2c (patch)
treeaee991e62c82443d7c2d780ce6cb7debe79ee1bc /src
parent1938b1b08d38fc199717d1875a61ef05e5b965de (diff)
Allow the butler to say "try again later" when get_video() is called
while it's suspended. Then make the GUI follow that suggestion. Should
Diffstat (limited to 'src')
-rw-r--r--src/lib/butler.cc14
-rw-r--r--src/lib/butler.h8
-rw-r--r--src/wx/film_viewer.cc7
3 files changed, 25 insertions, 4 deletions
diff --git a/src/lib/butler.cc b/src/lib/butler.cc
index a127ee9bd..3e408c4d5 100644
--- a/src/lib/butler.cc
+++ b/src/lib/butler.cc
@@ -190,17 +190,27 @@ try
}
pair<shared_ptr<PlayerVideo>, DCPTime>
-Butler::get_video ()
+Butler::get_video (Error* e)
{
boost::mutex::scoped_lock lm (_mutex);
+ if (_suspended) {
+ if (e) {
+ *e = AGAIN;
+ }
+ return make_pair(shared_ptr<PlayerVideo>(), DCPTime());
+ }
+
/* Wait for data if we have none */
while (_video.empty() && !_finished && !_died) {
_arrived.wait (lm);
}
if (_video.empty()) {
- return make_pair (shared_ptr<PlayerVideo>(), DCPTime());
+ if (e) {
+ *e = NONE;
+ }
+ return make_pair(shared_ptr<PlayerVideo>(), DCPTime());
}
pair<shared_ptr<PlayerVideo>, DCPTime> const r = _video.get ();
diff --git a/src/lib/butler.h b/src/lib/butler.h
index 4322c401d..fb133d108 100644
--- a/src/lib/butler.h
+++ b/src/lib/butler.h
@@ -41,7 +41,13 @@ public:
~Butler ();
void seek (DCPTime position, bool accurate);
- std::pair<boost::shared_ptr<PlayerVideo>, DCPTime> get_video ();
+
+ enum Error {
+ NONE,
+ AGAIN
+ };
+
+ std::pair<boost::shared_ptr<PlayerVideo>, DCPTime> get_video (Error* e = 0);
boost::optional<DCPTime> get_audio (float* out, Frame frames);
boost::optional<TextRingBuffers::Data> get_closed_caption ();
diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc
index 76e269975..d954e1818 100644
--- a/src/wx/film_viewer.cc
+++ b/src/wx/film_viewer.cc
@@ -294,7 +294,12 @@ FilmViewer::get ()
DCPOMATIC_ASSERT (_butler);
do {
- _player_video = _butler->get_video ();
+ Butler::Error e;
+ _player_video = _butler->get_video (&e);
+ if (!_player_video.first && e == Butler::AGAIN) {
+ signal_manager->when_idle (boost::bind(&FilmViewer::get, this));
+ return;
+ }
} while (
_player_video.first &&
_film->three_d() &&