Make terminate_threads() less likely to leave _threads containing invalid pointers.
[dcpomatic.git] / src / lib / content.cc
index 1e73418b64bf8be7fdf6a2d63d2b6857c4301774..9280d2e612be094566c183ea6a0340b3179e1f5f 100644 (file)
@@ -205,13 +205,13 @@ Content::signal_change (ChangeType c, int p)
                } else {
                        emit (boost::bind (boost::ref(Change), c, shared_from_this(), p, _change_signals_frequent));
                }
-       } catch (boost::bad_weak_ptr) {
+       } catch (boost::bad_weak_ptr &) {
                /* This must be during construction; never mind */
        }
 }
 
 void
-Content::set_position (shared_ptr<const Film> film, DCPTime p)
+Content::set_position (shared_ptr<const Film> film, DCPTime p, bool force_emit)
 {
        /* video and audio content can modify its position */
 
@@ -219,7 +219,13 @@ Content::set_position (shared_ptr<const Film> film, DCPTime p)
                video->modify_position (film, p);
        }
 
-       if (audio) {
+       /* Only allow the audio to modify if we have no video;
+          sometimes p can't be on an integer video AND audio frame,
+          and in these cases we want the video constraint to be
+          satisfied since (I think) the audio code is better able to
+          cope.
+       */
+       if (!video && audio) {
                audio->modify_position (film, p);
        }
 
@@ -227,7 +233,7 @@ Content::set_position (shared_ptr<const Film> film, DCPTime p)
 
        {
                boost::mutex::scoped_lock lm (_mutex);
-               if (p == _position) {
+               if (p == _position && !force_emit) {
                        cc.abort ();
                        return;
                }
@@ -245,7 +251,8 @@ Content::set_trim_start (ContentTime t)
                video->modify_trim_start (t);
        }
 
-       if (audio) {
+       /* See note in ::set_position */
+       if (!video && audio) {
                audio->modify_trim_start (t);
        }
 
@@ -356,10 +363,10 @@ Content::path_summary () const
 
 /** @return a list of properties that might be interesting to the user */
 list<UserProperty>
-Content::user_properties () const
+Content::user_properties (shared_ptr<const Film> film) const
 {
        list<UserProperty> p;
-       add_properties (p);
+       add_properties (film, p);
        return p;
 }
 
@@ -423,7 +430,7 @@ Content::active_video_frame_rate (shared_ptr<const Film> film) const
 }
 
 void
-Content::add_properties (list<UserProperty>& p) const
+Content::add_properties (shared_ptr<const Film>, list<UserProperty>& p) const
 {
        p.push_back (UserProperty (UserProperty::GENERAL, _("Filename"), path(0).string ()));