diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-02-25 19:27:58 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-02-25 19:27:58 +0000 |
| commit | 8bfb6ae0780b0bf3318c345df78518ad3fabc9fc (patch) | |
| tree | c423e4619fff25b91f85eaa5f4509dc26fda218c /src | |
| parent | d371988d26f8c9c4240dc3794df044cbe95d5d0d (diff) | |
Tidy up creation of analysis a bit.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/audio_analysis.cc | 8 | ||||
| -rw-r--r-- | src/lib/film.cc | 3 | ||||
| -rw-r--r-- | src/lib/film.h | 2 | ||||
| -rw-r--r-- | src/lib/job.cc | 1 | ||||
| -rw-r--r-- | src/lib/job.h | 1 | ||||
| -rw-r--r-- | src/wx/audio_dialog.cc | 62 | ||||
| -rw-r--r-- | src/wx/audio_dialog.h | 7 | ||||
| -rw-r--r-- | src/wx/audio_plot.cc | 10 | ||||
| -rw-r--r-- | src/wx/film_editor.cc | 3 | ||||
| -rw-r--r-- | src/wx/job_manager_view.cc | 1 |
10 files changed, 73 insertions, 25 deletions
diff --git a/src/lib/audio_analysis.cc b/src/lib/audio_analysis.cc index 39c1ba226..fffafc4d4 100644 --- a/src/lib/audio_analysis.cc +++ b/src/lib/audio_analysis.cc @@ -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); } diff --git a/src/lib/film.cc b/src/lib/film.cc index f36614689..ab636bdfc 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -342,7 +342,10 @@ Film::examine_content () void Film::analyse_audio_finished () { + ensure_ui_thread (); _analyse_audio_job.reset (); + + AudioAnalysisFinished (); } void diff --git a/src/lib/film.h b/src/lib/film.h index c268d3eac..847ab434e 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -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; diff --git a/src/lib/job.cc b/src/lib/job.cc index bfad65a0a..6a53e629c 100644 --- a/src/lib/job.cc +++ b/src/lib/job.cc @@ -147,7 +147,6 @@ Job::set_state (State s) if (_state == FINISHED_OK || _state == FINISHED_ERROR) { _ran_for = elapsed_time (); - Finished (); } } diff --git a/src/lib/job.h b/src/lib/job.h index 1538e2779..c98dbaea1 100644 --- a/src/lib/job.h +++ b/src/lib/job.h @@ -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: diff --git a/src/wx/audio_dialog.cc b/src/wx/audio_dialog.cc index 32864ca15..89b04409a 100644 --- a/src/wx/audio_dialog.cc +++ b/src/wx/audio_dialog.cc @@ -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; } } diff --git a/src/wx/audio_dialog.h b/src/wx/audio_dialog.h index 968fd0a12..623c9a067 100644 --- a/src/wx/audio_dialog.h +++ b/src/wx/audio_dialog.h @@ -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; }; diff --git a/src/wx/audio_plot.cc b/src/wx/audio_plot.cc index 1ad07fcce..41d074dad 100644 --- a/src/wx/audio_plot.cc +++ b/src/wx/audio_plot.cc @@ -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 (); diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index 725f2d1b3..c9f83677c 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -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); } diff --git a/src/wx/job_manager_view.cc b/src/wx/job_manager_view.cc index 7537da287..7361f29a8 100644 --- a/src/wx/job_manager_view.cc +++ b/src/wx/job_manager_view.cc @@ -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); |
