Be more tolerant to missing values or errors in io_config()
[ardour.git] / libs / ardour / tempo.cc
index 9862126873a1169334b51bb6fe1c95233385b526..56f88d33d9d6b080ccaab9e837afef4b422c91f6 100644 (file)
@@ -33,7 +33,7 @@
 #include "ardour/lmath.h"
 #include "ardour/tempo.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include <locale.h>
 
 using namespace std;
@@ -179,13 +179,13 @@ TempoSection::get_state() const
        char buf[256];
        LocaleGuard lg;
 
-       snprintf (buf, sizeof (buf), "%f", pulse());
+       snprintf (buf, sizeof (buf), "%lf", pulse());
        root->add_property ("pulse", buf);
        snprintf (buf, sizeof (buf), "%li", frame());
        root->add_property ("frame", buf);
-       snprintf (buf, sizeof (buf), "%f", _beats_per_minute);
+       snprintf (buf, sizeof (buf), "%lf", _beats_per_minute);
        root->add_property ("beats-per-minute", buf);
-       snprintf (buf, sizeof (buf), "%f", _note_type);
+       snprintf (buf, sizeof (buf), "%lf", _note_type);
        root->add_property ("note-type", buf);
        snprintf (buf, sizeof (buf), "%s", movable()?"yes":"no");
        root->add_property ("movable", buf);
@@ -569,12 +569,12 @@ MeterSection::get_state() const
        root->add_property ("bbt", buf);
        snprintf (buf, sizeof (buf), "%lf", beat());
        root->add_property ("beat", buf);
-       snprintf (buf, sizeof (buf), "%f", _note_type);
+       snprintf (buf, sizeof (buf), "%lf", _note_type);
        root->add_property ("note-type", buf);
        snprintf (buf, sizeof (buf), "%li", frame());
        root->add_property ("frame", buf);
        root->add_property ("lock-style", enum_2_string (position_lock_style()));
-       snprintf (buf, sizeof (buf), "%f", _divisions_per_bar);
+       snprintf (buf, sizeof (buf), "%lf", _divisions_per_bar);
        root->add_property ("divisions-per-bar", buf);
        snprintf (buf, sizeof (buf), "%s", movable()?"yes":"no");
        root->add_property ("movable", buf);
@@ -2978,7 +2978,7 @@ TempoMap::gui_dilate_tempo (TempoSection* ts, const framepos_t& frame, const fra
 }
 
 double
-TempoMap::exact_beat_at_frame (const framepos_t& frame, const int32_t& sub_num)
+TempoMap::exact_beat_at_frame (const framepos_t& frame, const int32_t sub_num)
 {
        Glib::Threads::RWLock::ReaderLock lm (lock);
 
@@ -2986,7 +2986,7 @@ TempoMap::exact_beat_at_frame (const framepos_t& frame, const int32_t& sub_num)
 }
 
 double
-TempoMap::exact_beat_at_frame_locked (const Metrics& metrics, const framepos_t& frame, const int32_t& sub_num)
+TempoMap::exact_beat_at_frame_locked (const Metrics& metrics, const framepos_t& frame, const int32_t sub_num)
 {
        double beat = beat_at_frame_locked (metrics, frame);
        if (sub_num > 1) {
@@ -3471,6 +3471,7 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
                                catch (failed_constructor& err){
                                        error << _("Tempo map: could not set new state, restoring old one.") << endmsg;
                                        _metrics = old_metrics;
+                                       old_metrics.clear();
                                        break;
                                }
 
@@ -3484,6 +3485,7 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
                                catch (failed_constructor& err) {
                                        error << _("Tempo map: could not set new state, restoring old one.") << endmsg;
                                        _metrics = old_metrics;
+                                       old_metrics.clear();
                                        break;
                                }
                        }
@@ -3535,6 +3537,13 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
                }
 
                recompute_map (_metrics);
+
+               Metrics::const_iterator d = old_metrics.begin();
+               while (d != old_metrics.end()) {
+                       delete (*d);
+                       ++d;
+               }
+               old_metrics.clear ();
        }
 
        PropertyChanged (PropertyChange ());