macOS / new boost build fixes.
[dcpomatic.git] / src / lib / butler.cc
index df23580863a800e41c2f5c2561719822605966a3..39da0bd5c10434a04449eaf782098cff29cfe13e 100644 (file)
@@ -39,6 +39,9 @@ using boost::bind;
 using boost::optional;
 using boost::function;
 using namespace dcpomatic;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
 
 /** Minimum video readahead in frames */
 #define MINIMUM_VIDEO_READAHEAD 10
@@ -208,6 +211,12 @@ try
        boost::mutex::scoped_lock lm (_mutex);
        _finished = true;
        _arrived.notify_all ();
+} catch (std::exception& e) {
+       store_current ();
+       boost::mutex::scoped_lock lm (_mutex);
+       _died = true;
+       _died_message = e.what ();
+       _arrived.notify_all ();
 } catch (...) {
        store_current ();
        boost::mutex::scoped_lock lm (_mutex);
@@ -226,7 +235,7 @@ Butler::get_video (bool blocking, Error* e)
 
        if (_suspended || (_video.empty() && !blocking)) {
                if (e) {
-                       *e = AGAIN;
+                       e->code = Error::AGAIN;
                }
                return make_pair(shared_ptr<PlayerVideo>(), DCPTime());
        }
@@ -239,11 +248,12 @@ Butler::get_video (bool blocking, Error* e)
        if (_video.empty()) {
                if (e) {
                        if (_died) {
-                               *e = DIED;
+                               e->code = Error::DIED;
+                               e->message = _died_message;
                        } else if (_finished) {
-                               *e = FINISHED;
+                               e->code = Error::FINISHED;
                        } else {
-                               *e = NONE;
+                               e->code = Error::NONE;
                        }
                }
                return make_pair(shared_ptr<PlayerVideo>(), DCPTime());
@@ -299,6 +309,13 @@ try
                LOG_TIMING("finish-prepare in %1", thread_id());
        }
 }
+catch (std::exception& e)
+{
+       store_current ();
+       boost::mutex::scoped_lock lm (_mutex);
+       _died = true;
+       _died_message = e.what ();
+}
 catch (...)
 {
        store_current ();
@@ -406,3 +423,22 @@ Butler::text (PlayerText pt, TextType type, optional<DCPTextTrack> track, DCPTim
 
        _closed_caption.put (pt, *track, period);
 }
+
+string
+Butler::Error::summary () const
+{
+       switch (code)
+       {
+               case Error::NONE:
+                       return "No error registered";
+               case Error::AGAIN:
+                       return "Butler not ready";
+               case Error::DIED:
+                       return String::compose("Butler died (%1)", message);
+               case Error::FINISHED:
+                       return "Butler finished";
+       }
+
+       return "";
+}
+