Add option to analyse audio automatically when content is added (#673).
[dcpomatic.git] / src / lib / job.h
index 2119db2f3e71a67e6e3ac64f6103e317e0081f02..32e71d6581c0bb3767f68dca222cc58ce601aa80 100644 (file)
 #ifndef DCPOMATIC_JOB_H
 #define DCPOMATIC_JOB_H
 
-#include <string>
+#include "signaller.h"
 #include <boost/thread/mutex.hpp>
 #include <boost/enable_shared_from_this.hpp>
 #include <boost/signals2.hpp>
 #include <boost/thread.hpp>
+#include <string>
 
 class Film;
 
 /** @class Job
  *  @brief A parent class to represent long-running tasks which are run in their own thread.
  */
-class Job : public boost::enable_shared_from_this<Job>
+class Job : public boost::enable_shared_from_this<Job>, public Signaller, public boost::noncopyable
 {
 public:
-       Job (boost::shared_ptr<Film>);
-       virtual ~Job() {}
+       Job (boost::shared_ptr<const Film>);
+       virtual ~Job ();
 
        /** @return user-readable name of this job */
        virtual std::string name () const = 0;
+       virtual std::string json_name () const = 0;
        /** Run this job in the current thread. */
        virtual void run () = 0;
-       
+
        void start ();
+       void pause ();
+       void resume ();
        void cancel ();
 
        bool is_new () const;
@@ -55,20 +59,31 @@ public:
        bool finished_ok () const;
        bool finished_in_error () const;
        bool finished_cancelled () const;
+       bool paused () const;
 
        std::string error_summary () const;
        std::string error_details () const;
 
        int elapsed_time () const;
        virtual std::string status () const;
+       std::string json_status () const;
+       std::string sub_name () const {
+               return _sub_name;
+       }
 
        void set_progress_unknown ();
-       void set_progress (float);
-       void ascend ();
-       void descend (float);
-       float overall_progress () const;
+       void set_progress (float, bool force = false);
+       void sub (std::string);
+       boost::optional<float> progress () const;
+
+       boost::shared_ptr<const Film> film () const {
+               return _film;
+       }
+
+       void when_finished (boost::signals2::connection& connection, boost::function<void()> finished);
 
-       /** Emitted by the JobManagerView from the UI thread */
+       boost::signals2::signal<void()> Progress;
+       /** Emitted from the UI thread when the job is finished */
        boost::signals2::signal<void()> Finished;
 
 protected:
@@ -77,21 +92,23 @@ protected:
 
        /** Description of a job's state */
        enum State {
-               NEW,            ///< the job hasn't been started yet
-               RUNNING,        ///< the job is running
-               FINISHED_OK,    ///< the job has finished successfully
+               NEW,            ///< the job hasn't been started yet
+               RUNNING,        ///< the job is running
+               PAUSED,         ///< the job has been paused
+               FINISHED_OK,    ///< the job has finished successfully
                FINISHED_ERROR, ///< the job has finished in error
                FINISHED_CANCELLED ///< the job was cancelled
        };
-       
+
        void set_state (State);
        void set_error (std::string s, std::string d);
 
-       boost::shared_ptr<Film> _film;
+       boost::shared_ptr<const Film> _film;
 
 private:
 
        void run_wrapper ();
+       void set_progress_common (boost::optional<float> p);
 
        boost::thread* _thread;
 
@@ -103,23 +120,18 @@ private:
        std::string _error_summary;
        std::string _error_details;
 
-       /** time that this job was started */
+       /** time that this sub-job was started */
        time_t _start_time;
+       std::string _sub_name;
 
-       /** mutex for _stack and _progress_unknown */
+       /** mutex for _progress */
        mutable boost::mutex _progress_mutex;
+       boost::optional<float> _progress;
 
-       struct Level {
-               Level (float a) : allocation (a), normalised (0) {}
-
-               float allocation;
-               float normalised;
-       };
-
-       std::list<Level> _stack;
-
-       /** true if this job's progress will always be unknown */
-       bool _progress_unknown;
+       /** condition to signal changes to pause/resume so that we know when to wake;
+           this could be a general _state_change if it made more sense.
+       */
+       boost::condition_variable _pause_changed;
 
        int _ran_for;
 };