summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-07-25 11:38:15 +0100
committerCarl Hetherington <cth@carlh.net>2013-07-25 11:38:15 +0100
commit45a523803b72cf132b44b6feec543e3587becf3a (patch)
tree336aea4db3519643299b3552e524f4c1b74814b2 /src
parent8b05d71534e5e27ef4514af781a9e9d1259e7c03 (diff)
Prevent infinite loop of audio analysis if it is cancelled.
Diffstat (limited to 'src')
-rw-r--r--src/wx/audio_dialog.cc30
-rw-r--r--src/wx/audio_dialog.h1
-rw-r--r--src/wx/audio_plot.cc10
-rw-r--r--src/wx/audio_plot.h3
4 files changed, 34 insertions, 10 deletions
diff --git a/src/wx/audio_dialog.cc b/src/wx/audio_dialog.cc
index d885e2d4d..26655631e 100644
--- a/src/wx/audio_dialog.cc
+++ b/src/wx/audio_dialog.cc
@@ -100,16 +100,14 @@ AudioDialog::set_content (shared_ptr<AudioContent> c)
void
AudioDialog::try_to_load_analysis ()
{
- shared_ptr<AudioAnalysis> a;
-
- if (boost::filesystem::exists (_content->audio_analysis_path())) {
- a.reset (new AudioAnalysis (_content->audio_analysis_path ()));
- } else {
- if (IsShown ()) {
- _content->analyse_audio (bind (&AudioDialog::try_to_load_analysis, this));
- }
+ if (!boost::filesystem::exists (_content->audio_analysis_path()) && IsShown ()) {
+ _content->analyse_audio (bind (&AudioDialog::analysis_finished, this));
+ return;
}
-
+
+ shared_ptr<AudioAnalysis> a;
+
+ a.reset (new AudioAnalysis (_content->audio_analysis_path ()));
_plot->set_analysis (a);
if (_channel_checkbox[0]) {
@@ -124,6 +122,20 @@ AudioDialog::try_to_load_analysis ()
}
void
+AudioDialog::analysis_finished ()
+{
+ if (!boost::filesystem::exists (_content->audio_analysis_path())) {
+ /* We analysed and still nothing showed up, so maybe it was cancelled or it failed.
+ Give up.
+ */
+ _plot->set_message (_("Could not analyse audio."));
+ return;
+ }
+
+ try_to_load_analysis ();
+}
+
+void
AudioDialog::channel_clicked (wxCommandEvent& ev)
{
int c = 0;
diff --git a/src/wx/audio_dialog.h b/src/wx/audio_dialog.h
index c69baf282..62811091a 100644
--- a/src/wx/audio_dialog.h
+++ b/src/wx/audio_dialog.h
@@ -39,6 +39,7 @@ private:
void type_clicked (wxCommandEvent &);
void smoothing_changed (wxScrollEvent &);
void try_to_load_analysis ();
+ void analysis_finished ();
boost::shared_ptr<AudioContent> _content;
AudioPlot* _plot;
diff --git a/src/wx/audio_plot.cc b/src/wx/audio_plot.cc
index b2be40036..2539a93d9 100644
--- a/src/wx/audio_plot.cc
+++ b/src/wx/audio_plot.cc
@@ -40,6 +40,7 @@ AudioPlot::AudioPlot (wxWindow* parent)
: wxPanel (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE)
, _gain (0)
, _smoothing (max_smoothing / 2)
+ , _message (_("Please wait; audio is being analysed..."))
{
#ifndef __WXOSX__
SetDoubleBuffered (true);
@@ -96,6 +97,13 @@ AudioPlot::set_type_visible (int t, bool v)
}
void
+AudioPlot::set_message (wxString s)
+{
+ _message = s;
+ Refresh ();
+}
+
+void
AudioPlot::paint (wxPaintEvent &)
{
wxPaintDC dc (this);
@@ -107,7 +115,7 @@ AudioPlot::paint (wxPaintEvent &)
if (!_analysis || _analysis->channels() == 0) {
gc->SetFont (gc->CreateFont (*wxNORMAL_FONT));
- gc->DrawText (_("Please wait; audio is being analysed..."), 32, 32);
+ gc->DrawText (_message, 32, 32);
return;
}
diff --git a/src/wx/audio_plot.h b/src/wx/audio_plot.h
index 82f589f6f..5605f94a5 100644
--- a/src/wx/audio_plot.h
+++ b/src/wx/audio_plot.h
@@ -33,6 +33,7 @@ public:
void set_type_visible (int t, bool v);
void set_gain (float);
void set_smoothing (int);
+ void set_message (wxString);
static const int max_smoothing;
@@ -57,5 +58,7 @@ private:
float _x_scale;
float _y_scale;
+ wxString _message;
+
static const int _minimum;
};