summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-11-25 18:07:43 +0100
committerRobin Gareus <robin@gareus.org>2016-11-25 18:16:08 +0100
commit4d81e3ec07cf3d08b7688c62e5fddd0170132fb8 (patch)
tree9c6ef230a825949638728e1c5d7d18eb4fbd4390 /libs/ardour
parent98f1cb76edc316cc9e69b210b4ca2b22797caa13 (diff)
RAII to postpone processor changes/graph recalculation
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/session.h48
-rw-r--r--libs/ardour/session.cc21
-rw-r--r--libs/ardour/session_transport.cc2
3 files changed, 45 insertions, 26 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 7ae2fb4bd8..b2409e3da6 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -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 {
- 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 *);
@@ -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);
- bool ignore_route_processor_changes;
+
+ friend class ProcessorChangeBlocker;
+ gint _ignore_route_processor_changes; /* atomic */
MidiClockTicker* midi_clock;
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index c0041ef555..723960749e 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -312,7 +312,7 @@ Session::Session (AudioEngine &eng,
, _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)
@@ -1129,7 +1129,7 @@ Session::remove_monitor_section ()
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) {
@@ -1289,7 +1289,7 @@ Session::add_monitor_section ()
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) {
@@ -1413,7 +1413,7 @@ Session::reset_monitor_section ()
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) {
@@ -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 ());
- PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
+ ProcessorChangeBlocker pcb (this, false);
(*iter)->remove_aux_or_listen (_monitor_out);
}
@@ -6216,14 +6216,11 @@ Session::update_route_record_state ()
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
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index 8771af46aa..68e6f49342 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -1992,7 +1992,7 @@ Session::xrun_recovery ()
void
Session::route_processors_changed (RouteProcessorChange c)
{
- if (ignore_route_processor_changes) {
+ if (g_atomic_int_get (&_ignore_route_processor_changes) > 0) {
return;
}