Emit the state of the job with the Finished signals.
authorCarl Hetherington <cth@carlh.net>
Thu, 16 Mar 2023 00:47:03 +0000 (01:47 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 16 Mar 2023 21:45:18 +0000 (22:45 +0100)
src/lib/job.cc
src/lib/job.h
src/lib/job_manager.cc
src/lib/job_manager.h
test/audio_analysis_test.cc

index 53527d265da66d99262d7924d6e0f16d7647dc1b..912c6a6ef3c961374a81bd4863509a94d0c524f2 100644 (file)
@@ -358,12 +358,31 @@ Job::set_state (State s)
        }
 
        if (finished) {
-               emit (boost::bind (boost::ref (Finished)));
-               FinishedImmediate ();
+               auto const result = state_to_result(s);
+               emit(boost::bind(boost::ref(Finished), result));
+               FinishedImmediate(result);
        }
 }
 
 
+Job::Result
+Job::state_to_result(State state) const
+{
+       switch (state) {
+       case FINISHED_OK:
+               return Result::RESULT_OK;
+       case FINISHED_ERROR:
+               return Result::RESULT_ERROR;
+       case FINISHED_CANCELLED:
+               return Result::RESULT_CANCELLED;
+       default:
+               DCPOMATIC_ASSERT(false);
+       };
+
+       DCPOMATIC_ASSERT(false);
+}
+
+
 /** @return DCPTime (in seconds) that this sub-job has been running */
 int
 Job::elapsed_sub_time () const
@@ -677,11 +696,11 @@ Job::resume ()
 
 
 void
-Job::when_finished (boost::signals2::connection& connection, function<void()> finished)
+Job::when_finished(boost::signals2::connection& connection, function<void(Result)> finished)
 {
        boost::mutex::scoped_lock lm (_state_mutex);
        if (_state == FINISHED_OK || _state == FINISHED_ERROR || _state == FINISHED_CANCELLED) {
-               finished ();
+               finished(state_to_result(_state));
        } else {
                connection = Finished.connect (finished);
        }
index c8204c2806aa20ff14bcb82a16eba70f0de1291a..5562afc16cc89cae1e9dec8941ee837622598d8b 100644 (file)
@@ -91,13 +91,19 @@ public:
                return _film;
        }
 
-       void when_finished (boost::signals2::connection& connection, std::function<void()> finished);
+       enum class Result {
+               RESULT_OK,
+               RESULT_ERROR,     // we can't have plain ERROR on Windows
+               RESULT_CANCELLED
+       };
+
+       void when_finished(boost::signals2::connection& connection, std::function<void(Result)> finished);
 
        boost::signals2::signal<void()> Progress;
        /** Emitted from the UI thread when the job is finished */
-       boost::signals2::signal<void()> Finished;
+       boost::signals2::signal<void (Result)> Finished;
        /** Emitted from the job thread when the job is finished */
-       boost::signals2::signal<void()> FinishedImmediate;
+       boost::signals2::signal<void (Result)> FinishedImmediate;
 
 protected:
 
@@ -114,6 +120,7 @@ protected:
                FINISHED_CANCELLED ///< the job was cancelled
        };
 
+       Result state_to_result(State state) const;
        void set_state (State);
        void set_error (std::string s, std::string d = "");
        void set_message (std::string m);
index 61087db72c5dccdf50c0efd49696158d95fa5cfb..9fcd86f2d38b7c034a332740a74457f672bd1b9b 100644 (file)
@@ -229,7 +229,7 @@ JobManager::analyse_audio (
        shared_ptr<const Playlist> playlist,
        bool from_zero,
        boost::signals2::connection& connection,
-       function<void()> ready
+       function<void (Job::Result)> ready
        )
 {
        {
@@ -264,7 +264,7 @@ JobManager::analyse_subtitles (
        shared_ptr<const Film> film,
        shared_ptr<Content> content,
        boost::signals2::connection& connection,
-       function<void()> ready
+       function<void (Job::Result)> ready
        )
 {
        {
index 435c250d194f015eff06f0e97d45779e2156dfb9..c8450bfdae152e3d4101ad0f1b3c063825e4cc55 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 
+#include "job.h"
 #include "signaller.h"
 #include <boost/thread/mutex.hpp>
 #include <boost/thread.hpp>
@@ -32,7 +33,6 @@
 #include <list>
 
 
-class Job;
 class Film;
 class Playlist;
 class Content;
@@ -70,14 +70,14 @@ public:
                std::shared_ptr<const Playlist> playlist,
                bool from_zero,
                boost::signals2::connection& connection,
-               std::function<void()> ready
+               std::function<void (Job::Result)> ready
                );
 
        void analyse_subtitles (
                std::shared_ptr<const Film> film,
                std::shared_ptr<Content> content,
                boost::signals2::connection& connection,
-               std::function<void()> ready
+               std::function<void (Job::Result)> ready
                );
 
        boost::signals2::signal<void (std::weak_ptr<Job>)> JobAdded;
index df809bb1510097b041ff4db9600cc5adf0912413..5a9c753242ec2983a541294f9b7ab841f6a5a9fa 100644 (file)
@@ -193,7 +193,7 @@ BOOST_AUTO_TEST_CASE (analyse_audio_test4)
        auto playlist = make_shared<Playlist>();
        playlist->add (film, content);
        boost::signals2::connection c;
-       JobManager::instance()->analyse_audio(film, playlist, false, c, []() {});
+       JobManager::instance()->analyse_audio(film, playlist, false, c, [](Job::Result) {});
        BOOST_CHECK (!wait_for_jobs ());
 }
 
@@ -209,7 +209,7 @@ BOOST_AUTO_TEST_CASE (analyse_audio_leqm_test)
        auto playlist = make_shared<Playlist>();
        playlist->add (film, content);
        boost::signals2::connection c;
-       JobManager::instance()->analyse_audio(film, playlist, false, c, []() {});
+       JobManager::instance()->analyse_audio(film, playlist, false, c, [](Job::Result) {});
        BOOST_CHECK (!wait_for_jobs());
 
        AudioAnalysis analysis(film->audio_analysis_path(playlist));
@@ -230,6 +230,6 @@ BOOST_AUTO_TEST_CASE(analyse_audio_with_long_silent_end)
        auto playlist = make_shared<Playlist>();
        playlist->add(film, content);
        boost::signals2::connection c;
-       JobManager::instance()->analyse_audio(film, playlist, false, c, []() {});
+       JobManager::instance()->analyse_audio(film, playlist, false, c, [](Job::Result) {});
        BOOST_CHECK(!wait_for_jobs());
 }