#include <glibmm/timer.h>
#include "pbd/compose.h"
+#include "pbd/pthread_utils.h"
#include "ardour/automation_control.h"
#include "ardour/automation_watch.h"
Glib::Threads::Mutex::Lock lm (automation_watch_lock);
automation_watches.clear ();
+ automation_connections.clear ();
}
void
{
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
*/
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
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);
}
*/
automation_watches.clear ();
+ automation_connections.clear ();
}
for (AutomationWatches::iterator i = tmp.begin(); i != tmp.end(); ++i) {
- (*i)->stop_touch (true, when);
+ (*i)->stop_touch (when);
}
}
void
AutomationWatch::thread ()
{
+ pbd_set_thread_priority (pthread_self(), PBD_SCHED_FIFO, -25);
while (_run_thread) {
Glib::usleep ((gulong) floor (Config->get_automation_interval_msecs() * 1000));
timer ();