Tidy up creation of analysis a bit.
authorCarl Hetherington <cth@carlh.net>
Mon, 25 Feb 2013 19:27:58 +0000 (19:27 +0000)
committerCarl Hetherington <cth@carlh.net>
Mon, 25 Feb 2013 19:27:58 +0000 (19:27 +0000)
src/lib/audio_analysis.cc
src/lib/film.cc
src/lib/film.h
src/lib/job.cc
src/lib/job.h
src/wx/audio_dialog.cc
src/wx/audio_dialog.h
src/wx/audio_plot.cc
src/wx/film_editor.cc
src/wx/job_manager_view.cc

index 39c1ba2261a910924ed41e9024ccfc03d9b5b1e1..fffafc4d4c5fe38ab4591883e160e7d0e35812cc 100644 (file)
@@ -21,6 +21,7 @@
 #include <cmath>
 #include <cassert>
 #include <fstream>
+#include <boost/filesystem.hpp>
 #include "audio_analysis.h"
 
 using std::ostream;
@@ -101,7 +102,9 @@ AudioAnalysis::points (int c) const
 void
 AudioAnalysis::write (string filename)
 {
-       ofstream f (filename.c_str ());
+       string tmp = filename + ".tmp";
+       
+       ofstream f (tmp.c_str ());
        f << _data.size() << "\n";
        for (vector<vector<AudioPoint> >::iterator i = _data.begin(); i != _data.end(); ++i) {
                f << i->size () << "\n";
@@ -109,4 +112,7 @@ AudioAnalysis::write (string filename)
                        j->write (f);
                }
        }
+
+       f.close ();
+       boost::filesystem::rename (tmp, filename);
 }
index f36614689c64a23d9bc65f09083fd2a2a91f27ba..ab636bdfcc3a651fe79cd1b87dd94d15693e93ed 100644 (file)
@@ -342,7 +342,10 @@ Film::examine_content ()
 void
 Film::analyse_audio_finished ()
 {
+       ensure_ui_thread ();
        _analyse_audio_job.reset ();
+
+       AudioAnalysisFinished ();
 }
 
 void
index c268d3eac9a01498505d50e6369089a19caeb279..847ab434ea06adfc98a169626da7e7b0b5f5fa78 100644 (file)
@@ -367,6 +367,8 @@ public:
        /** Emitted when some property has changed */
        mutable boost::signals2::signal<void (Property)> Changed;
 
+       boost::signals2::signal<void ()> AudioAnalysisFinished;
+
        /** Current version number of the state file */
        static int const state_version;
 
index bfad65a0a61f18d6566fa937b528232b91fe38f2..6a53e629cfd033a5d4f1b7fd8a86bb48a252c8ff 100644 (file)
@@ -147,7 +147,6 @@ Job::set_state (State s)
 
        if (_state == FINISHED_OK || _state == FINISHED_ERROR) {
                _ran_for = elapsed_time ();
-               Finished ();
        }
 }
 
index 1538e2779563910e67e998b2ec87c10f80838fcd..c98dbaea15dfb13133611f61727439d332158470 100644 (file)
@@ -65,6 +65,7 @@ public:
        void descend (float);
        float overall_progress () const;
 
+       /** Emitted by the JobManagerView from the UI thread */
        boost::signals2::signal<void()> Finished;
 
 protected:
index 32864ca15974a9c400bb88da7c27efcbc75a17a0..89b04409a816d90899c6209844da93a094280fa6 100644 (file)
@@ -17,6 +17,7 @@
 
 */
 
+#include <boost/filesystem.hpp>
 #include "audio_dialog.h"
 #include "audio_plot.h"
 #include "audio_analysis.h"
@@ -24,8 +25,9 @@
 #include "wx_util.h"
 
 using boost::shared_ptr;
+using boost::bind;
 
-AudioDialog::AudioDialog (wxWindow* parent, boost::shared_ptr<Film> film)
+AudioDialog::AudioDialog (wxWindow* parent)
        : wxDialog (parent, wxID_ANY, _("Audio"), wxDefaultPosition, wxSize (640, 512), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
        , _plot (0)
 {
@@ -42,8 +44,6 @@ AudioDialog::AudioDialog (wxWindow* parent, boost::shared_ptr<Film> film)
 
        sizer->Add (table);
 
-       set_film (film);
-
        SetSizer (sizer);
        sizer->Layout ();
        sizer->SetSizeHints (this);
@@ -54,27 +54,48 @@ AudioDialog::AudioDialog (wxWindow* parent, boost::shared_ptr<Film> film)
 void
 AudioDialog::set_film (boost::shared_ptr<Film> f)
 {
-       _film_connection.disconnect ();
-       _film = f;
+       _film_changed_connection.disconnect ();
+       _film_audio_analysis_finished_connection.disconnect ();
        
-       shared_ptr<AudioAnalysis> a;
+       _film = f;
 
-       try {
-               a.reset (new AudioAnalysis (f->audio_analysis_path ()));
-       } catch (...) {
+       try_to_load_analysis ();
+       setup_channels ();
 
-       }
-               
-       _plot->set_analysis (a);
+       _channel->SetSelection (0);
 
+       _film_changed_connection = _film->Changed.connect (bind (&AudioDialog::film_changed, this, _1));
+       _film_audio_analysis_finished_connection = _film->AudioAnalysisFinished.connect (bind (&AudioDialog::try_to_load_analysis, this));
+}
+
+void
+AudioDialog::setup_channels ()
+{
        _channel->Clear ();
-       for (int i = 0; i < f->audio_stream()->channels(); ++i) {
+
+       if (!_film->audio_stream()) {
+               return;
+       }
+       
+       for (int i = 0; i < _film->audio_stream()->channels(); ++i) {
                _channel->Append (audio_channel_name (i));
        }
+}      
 
-       _channel->SetSelection (0);
+void
+AudioDialog::try_to_load_analysis ()
+{
+       shared_ptr<AudioAnalysis> a;
 
-       _film_connection = f->Changed.connect (bind (&AudioDialog::film_changed, this, _1));
+       if (boost::filesystem::exists (_film->audio_analysis_path())) {
+               a.reset (new AudioAnalysis (_film->audio_analysis_path ()));
+       } else {
+               if (IsShown ()) {
+                       _film->analyse_audio ();
+               }
+       }
+               
+       _plot->set_analysis (a);
 }
 
 void
@@ -86,7 +107,16 @@ AudioDialog::channel_changed (wxCommandEvent &)
 void
 AudioDialog::film_changed (Film::Property p)
 {
-       if (p == Film::AUDIO_GAIN) {
+       switch (p) {
+       case Film::AUDIO_GAIN:
                _plot->set_gain (_film->audio_gain ());
+               break;
+       case Film::CONTENT_AUDIO_STREAM:
+       case Film::EXTERNAL_AUDIO:
+       case Film::USE_CONTENT_AUDIO:
+               setup_channels ();
+               break;
+       default:
+               break;
        }
 }
index 968fd0a122340f9021303dc2a799b68e868c1539..623c9a067a5d633342d4e79e4f3f29251a3e6372 100644 (file)
@@ -28,16 +28,19 @@ class Film;
 class AudioDialog : public wxDialog
 {
 public:
-       AudioDialog (wxWindow *, boost::shared_ptr<Film>);
+       AudioDialog (wxWindow *);
 
        void set_film (boost::shared_ptr<Film>);
 
 private:
        void film_changed (Film::Property);
        void channel_changed (wxCommandEvent &);
+       void try_to_load_analysis ();
+       void setup_channels ();
 
        boost::shared_ptr<Film> _film;
        AudioPlot* _plot;
        wxChoice* _channel;
-       boost::signals2::scoped_connection _film_connection;
+       boost::signals2::scoped_connection _film_changed_connection;
+       boost::signals2::scoped_connection _film_audio_analysis_finished_connection;
 };
index 1ad07fcce0dc9eb352c69d3456e28e0fac35cb2a..41d074dad485539b210ef34278fde82595a6b117 100644 (file)
@@ -65,15 +65,17 @@ AudioPlot::paint (wxPaintEvent &)
 {
        wxPaintDC dc (this);
 
-       if (!_analysis) {
-               return;
-       }
-       
        wxGraphicsContext* gc = wxGraphicsContext::Create (dc);
        if (!gc) {
                return;
        }
 
+       if (!_analysis) {
+               gc->SetFont (gc->CreateFont (*wxNORMAL_FONT));
+               gc->DrawText (_("Please wait; audio is being analysed..."), 32, 32);
+               return;
+       }
+       
        int const width = GetSize().GetWidth();
        float const xs = width / float (_analysis->points (_channel));
        int const height = GetSize().GetHeight ();
index 725f2d1b3c517f2dd4178fee92a20cc380798514..c9f83677c6da5db1cf7ef2168890538d4d810e5b 100644 (file)
@@ -1182,6 +1182,7 @@ FilmEditor::show_audio_clicked (wxCommandEvent &)
                _audio_dialog = 0;
        }
        
-       _audio_dialog = new AudioDialog (this, _film);
+       _audio_dialog = new AudioDialog (this);
        _audio_dialog->Show ();
+       _audio_dialog->set_film (_film);
 }
index 7537da287dca0f4ae545de67f902c5b5ec81e7c0..7361f29a815896d1021a5a1ed06a1500cc293f8c 100644 (file)
@@ -109,6 +109,7 @@ JobManagerView::update ()
                if ((*i)->finished() && !_job_records[*i].finalised) {
                        _job_records[*i].gauge->SetValue (100);
                        checked_set (_job_records[*i].message, st);
+                       (*i)->Finished ();
                        _job_records[*i].finalised = true;
                        if (!(*i)->error_details().empty ()) {
                                _job_records[*i].details->Enable (true);