summaryrefslogtreecommitdiff
path: root/libs/ardour/automation_watch.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-07-22 15:40:27 +0200
committerRobin Gareus <robin@gareus.org>2017-07-22 15:40:27 +0200
commit24829c93b8512d83b6de73abdf43fdfff07260c7 (patch)
tree4b42831723ded743efca75a4f7b166ee872fc290 /libs/ardour/automation_watch.cc
parent48ec6dd5c43cfb1f185fcc59941654e20de80f84 (diff)
AutomationWatch: single DropReferences connection per AC
Diffstat (limited to 'libs/ardour/automation_watch.cc')
-rw-r--r--libs/ardour/automation_watch.cc11
1 files changed, 9 insertions, 2 deletions
diff --git a/libs/ardour/automation_watch.cc b/libs/ardour/automation_watch.cc
index 21d1b6a49d..d1118e7669 100644
--- a/libs/ardour/automation_watch.cc
+++ b/libs/ardour/automation_watch.cc
@@ -60,6 +60,7 @@ AutomationWatch::~AutomationWatch ()
Glib::Threads::Mutex::Lock lm (automation_watch_lock);
automation_watches.clear ();
+ automation_connections.clear ();
}
void
@@ -67,7 +68,11 @@ AutomationWatch::add_automation_watch (boost::shared_ptr<AutomationControl> ac)
{
Glib::Threads::Mutex::Lock lm (automation_watch_lock);
DEBUG_TRACE (DEBUG::Automation, string_compose ("now watching control %1 for automation, astate = %2\n", ac->name(), enum_2_string (ac->automation_state())));
- automation_watches.insert (ac);
+ std::pair<AutomationWatches::iterator, bool> r = automation_watches.insert (ac);
+
+ if (!r.second) {
+ return;
+ }
/* if an automation control is added here while the transport is
* rolling, make sure that it knows that there is a write pass going
@@ -87,7 +92,7 @@ AutomationWatch::add_automation_watch (boost::shared_ptr<AutomationControl> ac)
*/
boost::weak_ptr<AutomationControl> wac (ac);
- ac->DropReferences.connect_same_thread (*this, boost::bind (&AutomationWatch::remove_weak_automation_watch, this, wac));
+ ac->DropReferences.connect_same_thread (automation_connections[ac], boost::bind (&AutomationWatch::remove_weak_automation_watch, this, wac));
}
void
@@ -108,6 +113,7 @@ AutomationWatch::remove_automation_watch (boost::shared_ptr<AutomationControl> a
Glib::Threads::Mutex::Lock lm (automation_watch_lock);
DEBUG_TRACE (DEBUG::Automation, string_compose ("remove control %1 from automation watch\n", ac->name()));
automation_watches.erase (ac);
+ automation_connections.erase (ac);
ac->list()->set_in_write_pass (false);
}
@@ -128,6 +134,7 @@ AutomationWatch::transport_stop_automation_watches (framepos_t when)
*/
automation_watches.clear ();
+ automation_connections.clear ();
}
for (AutomationWatches::iterator i = tmp.begin(); i != tmp.end(); ++i) {