Another macOS std::list boost::thread SNAFU.
[dcpomatic.git] / src / lib / hints.cc
index c1d90abcd89b73dcb92ad7bdf9289ebb298595e0..6cb037ed0afd2ebd6bb865734de77eebd455f33f 100644 (file)
@@ -49,10 +49,10 @@ using boost::shared_ptr;
 using boost::weak_ptr;
 using boost::optional;
 using boost::bind;
+using namespace dcpomatic;
 
 Hints::Hints (weak_ptr<const Film> film)
        : _film (film)
-       , _thread (0)
        , _long_ccap (false)
        , _overlap_ccap (false)
        , _too_many_ccap_lines (false)
@@ -64,27 +64,22 @@ Hints::Hints (weak_ptr<const Film> film)
 void
 Hints::start ()
 {
-       _thread = new boost::thread (bind(&Hints::thread, this));
+       _thread = boost::thread (bind(&Hints::thread, this));
 }
 
 Hints::~Hints ()
 {
-       if (!_thread) {
+       if (!_thread.joinable()) {
                return;
        }
 
        try {
-               {
-                       boost::mutex::scoped_lock lm (_mutex);
-                       _stop = true;
-               }
-               _thread->interrupt ();
-               _thread->join ();
+               _stop = true;
+               _thread.interrupt ();
+               _thread.join ();
        } catch (...) {
 
        }
-
-       delete _thread;
 }
 
 void
@@ -116,7 +111,7 @@ Hints::thread ()
        }
 
        if (film->audio_channels() < 6) {
-               hint (_("Your DCP has fewer than 6 audio channels.  This may cause problems on some projectors."));
+               hint (_("Your DCP has fewer than 6 audio channels.  This may cause problems on some projectors.  You may want to set the DCP to have 6 channels.  It does not matter if your content has fewer channels, as DCP-o-matic will fill the extras with silence."));
        }
 
        AudioProcessor const * ap = film->audio_processor();
@@ -272,20 +267,21 @@ Hints::thread ()
        struct timeval last_pulse;
        gettimeofday (&last_pulse, 0);
 
-       while (!player->pass()) {
+       try {
+               while (!player->pass()) {
 
-               struct timeval now;
-               gettimeofday (&now, 0);
-               if ((seconds(now) - seconds(last_pulse)) > 1) {
-                       {
-                               boost::mutex::scoped_lock lm (_mutex);
+                       struct timeval now;
+                       gettimeofday (&now, 0);
+                       if ((seconds(now) - seconds(last_pulse)) > 1) {
                                if (_stop) {
                                        break;
                                }
+                               emit (bind (boost::ref(Pulse)));
+                               last_pulse = now;
                        }
-                       emit (bind (boost::ref(Pulse)));
-                       last_pulse = now;
                }
+       } catch (...) {
+               store_current ();
        }
 
        emit (bind(boost::ref(Finished)));
@@ -320,9 +316,13 @@ Hints::text (PlayerText text, TextType type, DCPTimePeriod period)
                _too_many_ccap_lines = true;
        }
 
-       if (!_overlap_ccap && _last && _last->overlap(period)) {
+       shared_ptr<const Film> film = _film.lock ();
+       DCPOMATIC_ASSERT (film);
+
+       /* XXX: maybe overlapping closed captions (i.e. different languages) are OK with Interop? */
+       if (film->interop() && !_overlap_ccap && _last && _last->overlap(period)) {
                _overlap_ccap = true;
-               hint (_("You have overlapping closed captions, which are not allowed."));
+               hint (_("You have overlapping closed captions, which are not allowed in Interop DCPs.  Change your DCP standard to SMPTE."));
        }
 
        _last = period;