summaryrefslogtreecommitdiff
path: root/libs/ardour/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/ardour
parent98f1cb76edc316cc9e69b210b4ca2b22797caa13 (diff)
RAII to postpone processor changes/graph recalculation
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r--libs/ardour/ardour/session.h48
1 files changed, 35 insertions, 13 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;