no-read-past-end for destructive crossfade as well; cleanup xfade coefficient arrays...
[ardour.git] / libs / ardour / state_manager.cc
index 30000d6784ea35bb567cd47e907cbf6447884557..cef2817899b6179fdd004de82f95acfd2eecb7b4 100644 (file)
@@ -4,6 +4,10 @@
 #include "i18n.h"
 
 using namespace ARDOUR;
+using namespace std;
+
+bool StateManager::_allow_save = true;
+set<StateManager*> StateManager::deferred;
 
 StateManager::StateManager ()
 {
@@ -14,6 +18,24 @@ StateManager::~StateManager()
 {
 }
 
+void
+StateManager::prohibit_save ()
+{
+       _allow_save = false;
+}
+
+void
+StateManager::allow_save (const char* why, bool do_save)
+{
+       _allow_save = true;
+       if (do_save) {
+               for (set<StateManager*>::iterator x = deferred.begin(); x != deferred.end(); ++x) {
+                       (*x)->save_state (why);
+               }
+       }
+       deferred.clear ();
+}
+
 void
 StateManager::drop_all_states ()
 {
@@ -32,13 +54,12 @@ StateManager::use_state (state_id_t id)
        Change what_changed;
        state_id_t n;
        StateMap::iterator i;
-       
+
        for (n = 0, i = states.begin(); n < id && i != states.end(); ++n, ++i);
 
        if (n != id || i == states.end()) {
-               fatal << compose (_("programming error: illegal state ID (%1) passed to "
-                                   "StateManager::set_state() (range = 0-%3)"), id,
-                                 states.size()-1)
+               fatal << string_compose (_("programming error: illegal state ID (%1) passed to "
+                                   "StateManager::set_state() (range = 0-%2)"), id, states.size()-1)
                      << endmsg;
                /*NOTREACHED*/
                return;
@@ -52,6 +73,11 @@ StateManager::use_state (state_id_t id)
 void
 StateManager::save_state (std::string why)
 {
+       if (!_allow_save) {
+               deferred.insert (this);
+               return;
+       }
+
        states.push_back (state_factory (why));
        _current_state_id = states.size() - 1;
 }