From 24829c93b8512d83b6de73abdf43fdfff07260c7 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 22 Jul 2017 15:40:27 +0200 Subject: AutomationWatch: single DropReferences connection per AC --- libs/ardour/ardour/automation_watch.h | 4 +++- libs/ardour/automation_watch.cc | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/automation_watch.h b/libs/ardour/ardour/automation_watch.h index 6822a38b4a..75bb553b47 100644 --- a/libs/ardour/ardour/automation_watch.h +++ b/libs/ardour/ardour/automation_watch.h @@ -33,7 +33,7 @@ namespace ARDOUR { class AutomationControl; -class LIBARDOUR_API AutomationWatch : public sigc::trackable, public ARDOUR::SessionHandlePtr, public PBD::ScopedConnectionList { +class LIBARDOUR_API AutomationWatch : public sigc::trackable, public ARDOUR::SessionHandlePtr { public: static AutomationWatch& instance(); @@ -46,6 +46,7 @@ class LIBARDOUR_API AutomationWatch : public sigc::trackable, public ARDOUR::Ses private: typedef std::set > AutomationWatches; + typedef std::map, PBD::ScopedConnection> AutomationConnection; AutomationWatch (); ~AutomationWatch(); @@ -55,6 +56,7 @@ class LIBARDOUR_API AutomationWatch : public sigc::trackable, public ARDOUR::Ses framepos_t _last_time; bool _run_thread; AutomationWatches automation_watches; + AutomationConnection automation_connections; Glib::Threads::Mutex automation_watch_lock; PBD::ScopedConnection transport_connection; 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 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 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 ac) */ boost::weak_ptr 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 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) { -- cgit v1.2.3