RAII to postpone processor changes/graph recalculation
authorRobin Gareus <robin@gareus.org>
Fri, 25 Nov 2016 17:07:43 +0000 (18:07 +0100)
committerRobin Gareus <robin@gareus.org>
Fri, 25 Nov 2016 17:16:08 +0000 (18:16 +0100)
libs/ardour/ardour/session.h
libs/ardour/session.cc
libs/ardour/session_transport.cc

index 7ae2fb4bd825b88246a8d90858ef4548f524d974..b2409e3da669f0e0969a40c4f96ba707e82c4bad 100644 (file)
@@ -581,20 +581,40 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        StateOfTheState state_of_the_state() const { return _state_of_the_state; }
 
        class StateProtector {
        StateOfTheState state_of_the_state() const { return _state_of_the_state; }
 
        class StateProtector {
-                                               public:
-               StateProtector (Session* s) : _session (s) {
-                       g_atomic_int_inc (&s->_suspend_save);
-               }
-               ~StateProtector () {
-                       if (g_atomic_int_dec_and_test (&_session->_suspend_save)) {
-                               while (_session->_save_queued) {
-                                       _session->_save_queued = false;
-                                       _session->save_state ("");
+               public:
+                       StateProtector (Session* s) : _session (s) {
+                               g_atomic_int_inc (&s->_suspend_save);
+                       }
+                       ~StateProtector () {
+                               if (g_atomic_int_dec_and_test (&_session->_suspend_save)) {
+                                       while (_session->_save_queued) {
+                                               _session->_save_queued = false;
+                                               _session->save_state ("");
+                                       }
                                }
                        }
                                }
                        }
-               }
-            private:
-               Session * _session;
+               private:
+                       Session * _session;
+       };
+
+       class ProcessorChangeBlocker {
+               public:
+                       ProcessorChangeBlocker (Session* s, bool rc = true)
+                               : _session (s)
+                               , _reconfigure_on_delete (rc)
+                       {
+                               g_atomic_int_inc (&s->_ignore_route_processor_changes);
+                       }
+                       ~ProcessorChangeBlocker () {
+                               if (g_atomic_int_dec_and_test (&_session->_ignore_route_processor_changes)) {
+                                       if (_reconfigure_on_delete) {
+                                               _session->route_processors_changed (RouteProcessorChange ());
+                                       }
+                               }
+                       }
+               private:
+                       Session* _session;
+                       bool _reconfigure_on_delete;
        };
 
        void add_route_group (RouteGroup *);
        };
 
        void add_route_group (RouteGroup *);
@@ -2005,7 +2025,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        GraphEdges _current_route_graph;
 
        void ensure_route_presentation_info_gap (PresentationInfo::order_t, uint32_t gap_size);
        GraphEdges _current_route_graph;
 
        void ensure_route_presentation_info_gap (PresentationInfo::order_t, uint32_t gap_size);
-       bool ignore_route_processor_changes;
+
+       friend class    ProcessorChangeBlocker;
+       gint            _ignore_route_processor_changes; /* atomic */
 
        MidiClockTicker* midi_clock;
 
 
        MidiClockTicker* midi_clock;
 
index c0041ef5555e4dd0891fcbca8d85122a1d972be0..723960749e7cc6845f79ed4d4a4048568b4bf242 100644 (file)
@@ -312,7 +312,7 @@ Session::Session (AudioEngine &eng,
        , _step_editors (0)
        , _suspend_timecode_transmission (0)
        ,  _speakers (new Speakers)
        , _step_editors (0)
        , _suspend_timecode_transmission (0)
        ,  _speakers (new Speakers)
-       , ignore_route_processor_changes (false)
+       , _ignore_route_processor_changes (0)
        , midi_clock (0)
        , _scene_changer (0)
        , _midi_ports (0)
        , midi_clock (0)
        , _scene_changer (0)
        , _midi_ports (0)
@@ -1129,7 +1129,7 @@ Session::remove_monitor_section ()
 
 
                boost::shared_ptr<RouteList> r = routes.reader ();
 
 
                boost::shared_ptr<RouteList> r = routes.reader ();
-               PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
+               ProcessorChangeBlocker  pcb (this, false);
 
                for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
 
 
                for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
 
@@ -1289,7 +1289,7 @@ Session::add_monitor_section ()
 
        boost::shared_ptr<RouteList> rls = routes.reader ();
 
 
        boost::shared_ptr<RouteList> rls = routes.reader ();
 
-       PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
+       ProcessorChangeBlocker  pcb (this, false /* XXX */);
 
        for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
 
 
        for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
 
@@ -1413,7 +1413,7 @@ Session::reset_monitor_section ()
 
        boost::shared_ptr<RouteList> rls = routes.reader ();
 
 
        boost::shared_ptr<RouteList> rls = routes.reader ();
 
-       PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
+       ProcessorChangeBlocker pcb (this, false);
 
        for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
 
 
        for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
 
@@ -3662,7 +3662,7 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
                        /* if the monitoring section had a pointer to this route, remove it */
                        if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
                                Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
                        /* if the monitoring section had a pointer to this route, remove it */
                        if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
                                Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
-                               PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
+                               ProcessorChangeBlocker pcb (this, false);
                                (*iter)->remove_aux_or_listen (_monitor_out);
                        }
 
                                (*iter)->remove_aux_or_listen (_monitor_out);
                        }
 
@@ -6216,14 +6216,11 @@ Session::update_route_record_state ()
 void
 Session::listen_position_changed ()
 {
 void
 Session::listen_position_changed ()
 {
-       {
-               boost::shared_ptr<RouteList> r = routes.reader ();
-               PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
-               for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
-                       (*i)->listen_position_changed ();
-               }
+       ProcessorChangeBlocker pcb (this);
+       boost::shared_ptr<RouteList> r = routes.reader ();
+       for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+               (*i)->listen_position_changed ();
        }
        }
-       route_processors_changed (RouteProcessorChange ());
 }
 
 void
 }
 
 void
index 8771af46aa7138df63c17c386571d89a52cb982e..68e6f49342abc2ddd217b6f9e0d9ecbb4be9faf9 100644 (file)
@@ -1992,7 +1992,7 @@ Session::xrun_recovery ()
 void
 Session::route_processors_changed (RouteProcessorChange c)
 {
 void
 Session::route_processors_changed (RouteProcessorChange c)
 {
-       if (ignore_route_processor_changes) {
+       if (g_atomic_int_get (&_ignore_route_processor_changes) > 0) {
                return;
        }
 
                return;
        }