Protect playlist with a mutex so that we can add content safely from e.g. examine...
[dcpomatic.git] / src / lib / playlist.h
index a31b6826e667db00cfd1f0b68cc198a740d27714..cd902d223d0f0944f5fd550f60805d2f8546dc12 100644 (file)
@@ -29,8 +29,8 @@
 class Content;
 class FFmpegContent;
 class FFmpegDecoder;
-class ImageMagickContent;
-class ImageMagickDecoder;
+class StillImageMagickContent;
+class StillImageMagickDecoder;
 class SndfileContent;
 class SndfileDecoder;
 class Job;
@@ -41,10 +41,7 @@ class Region;
  *  @brief A set of content files (video and audio), with knowledge of how they should be arranged into
  *  a DCP.
  *
- * This class holds Content objects, and it knows how they should be arranged. At the moment
- * the ordering is implicit; video content is placed sequentially, and audio content is taken
- * from the video unless any sound-only files are present.  If sound-only files exist, they
- * are played simultaneously (i.e. they can be split up into multiple files for different channels)
+ * This class holds Content objects, and it knows how they should be arranged.
  */
 
 struct ContentSorter
@@ -63,30 +60,24 @@ public:
 
        void add (boost::shared_ptr<Content>);
        void remove (boost::shared_ptr<Content>);
+       void remove (ContentList);
 
        bool has_subtitles () const;
 
-       typedef std::vector<boost::shared_ptr<Content> > ContentList;
-       
-       ContentList content () const {
-               return _content;
-       }
+       ContentList content () const;
 
        std::string video_identifier () const;
 
-       int loop () const {
-               return _loop;
-       }
-       
-       void set_loop (int l);
-
        Time length () const;
+       
        int best_dcp_frame_rate () const;
        Time video_end () const;
 
        void set_sequence_video (bool);
        void maybe_sequence_video ();
 
+       void repeat (ContentList, int);
+
        mutable boost::signals2::signal<void ()> Changed;
        /** Third parameter is true if signals are currently being emitted frequently */
        mutable boost::signals2::signal<void (boost::weak_ptr<Content>, int, bool)> ContentChanged;
@@ -96,10 +87,10 @@ private:
        void reconnect ();
 
        ContentList _content;
-       int _loop;
        bool _sequence_video;
        bool _sequencing_video;
        std::list<boost::signals2::connection> _content_connections;
+       mutable boost::mutex _mutex;
 };
 
 #endif