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 *);
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;
, _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)
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) {
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) {
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) {
/* 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);
}
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