Fix a crash in rhythm ferret if the relevant plugin couldn't be found for some reason
authorJohn Emmas <johne53@tiscali.co.uk>
Sat, 4 Feb 2017 12:58:33 +0000 (12:58 +0000)
committerJohn Emmas <johne53@tiscali.co.uk>
Sat, 4 Feb 2017 12:58:33 +0000 (12:58 +0000)
The crash was caused by not catching 'failed_constructor()' (which gets thrown in the c'tor for AudioAnalyser).

gtk2_ardour/rhythm_ferret.cc

index 4d39232d8c734f713d8eb97394470acabc43683a..2106f487d29faf6ef39462c3fafc16c0c500a960 100644 (file)
@@ -253,28 +253,34 @@ RhythmFerret::run_analysis ()
 int
 RhythmFerret::run_percussion_onset_analysis (boost::shared_ptr<Readable> readable, frameoffset_t /*offset*/, AnalysisFeatureList& results)
 {
-       TransientDetector t (_session->frame_rate());
+       try {
+               TransientDetector t (_session->frame_rate());
 
-       for (uint32_t i = 0; i < readable->n_channels(); ++i) {
+               for (uint32_t i = 0; i < readable->n_channels(); ++i) {
 
-               AnalysisFeatureList these_results;
+                       AnalysisFeatureList these_results;
 
-               t.reset ();
-               float dB = detection_threshold_adjustment.get_value();
-               float coeff = dB > -80.0f ? pow (10.0f, dB * 0.05f) : 0.0f;
-               t.set_threshold (coeff);
-               t.set_sensitivity (4, sensitivity_adjustment.get_value());
+                       t.reset ();
+                       float dB = detection_threshold_adjustment.get_value();
+                       float coeff = dB > -80.0f ? pow (10.0f, dB * 0.05f) : 0.0f;
+                       t.set_threshold (coeff);
+                       t.set_sensitivity (4, sensitivity_adjustment.get_value());
 
-               if (t.run ("", readable.get(), i, these_results)) {
-                       continue;
-               }
+                       if (t.run ("", readable.get(), i, these_results)) {
+                               continue;
+                       }
 
-               /* merge */
+                       /* merge */
 
-               results.insert (results.end(), these_results.begin(), these_results.end());
-               these_results.clear ();
+                       results.insert (results.end(), these_results.begin(), these_results.end());
+                       these_results.clear ();
 
-               t.update_positions (readable.get(), i, results);
+                       t.update_positions (readable.get(), i, results);
+               }
+
+       } catch (failed_constructor& err) {
+               error << "Could not load percussion onset detection plugin" << endmsg;
+               return -1;
        }
 
        return 0;