/* This file is part of Evoral.
- * Copyright (C) 2008 Dave Robillard <http://drobilla.net>
+ * Copyright (C) 2008 David Robillard <http://drobilla.net>
* Copyright (C) 2000-2008 Paul Davis
*
* Evoral is free software; you can redistribute it and/or modify it under the
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <iostream>
#include <limits>
#include "evoral/ControlSet.hpp"
#include "evoral/ControlList.hpp"
{
}
-ControlSet::ControlSet (const ControlSet& other)
- : noncopyable ()
+ControlSet::ControlSet (const ControlSet&)
+ : noncopyable ()
{
- /* derived class must copy controls */
+ /* derived class must copy controls */
}
void
ControlSet::add_control(boost::shared_ptr<Control> ac)
{
_controls[ac->parameter()] = ac;
+
+ ac->ListMarkedDirty.connect_same_thread (_control_connections, boost::bind (&ControlSet::control_list_marked_dirty, this));
+
+ if (ac->list()) {
+ ac->list()->InterpolationChanged.connect_same_thread (
+ _list_connections,
+ boost::bind (&ControlSet::control_list_interpolation_changed,
+ this, ac->parameter(), _1));
+ }
}
void
ControlSet::what_has_data (set<Parameter>& s) const
{
- Glib::Mutex::Lock lm (_control_lock);
+ Glib::Threads::Mutex::Lock lm (_control_lock);
+
for (Controls::const_iterator li = _controls.begin(); li != _controls.end(); ++li) {
- s.insert(li->first);
+ if (li->second->list() && !li->second->list()->empty()) {
+ s.insert (li->first);
+ }
}
}
}
}
-bool
-ControlSet::find_next_event (FrameTime now, FrameTime end, ControlEvent& next_event) const
-{
- Controls::const_iterator li;
-
- next_event.when = std::numeric_limits<FrameTime>::max();
-
- for (li = _controls.begin(); li != _controls.end(); ++li) {
- ControlList::const_iterator i;
- boost::shared_ptr<const ControlList> alist (li->second->list());
- ControlEvent cp (now, 0.0f);
-
- for (i = lower_bound (alist->begin(), alist->end(), &cp, ControlList::time_comparator);
- i != alist->end() && (*i)->when < end; ++i) {
- if ((*i)->when > now) {
- break;
- }
- }
-
- if (i != alist->end() && (*i)->when < end) {
- if ((*i)->when < next_event.when) {
- next_event.when = (*i)->when;
- }
- }
- }
-
- return next_event.when != std::numeric_limits<FrameTime>::max();
-}
-
void
ControlSet::clear_controls ()
{
- Glib::Mutex::Lock lm (_control_lock);
+ Glib::Threads::Mutex::Lock lm (_control_lock);
- for (Controls::iterator li = _controls.begin(); li != _controls.end(); ++li)
- li->second->list()->clear();
-}
+ _control_connections.drop_connections ();
+ _list_connections.drop_connections ();
+ for (Controls::iterator li = _controls.begin(); li != _controls.end(); ++li) {
+ if (li->second->list()) {
+ li->second->list()->clear();
+ }
+ }
+}
} // namespace Evoral
+
+/* No good place for this so just put it here */
+
+std::ostream&
+std::operator<< (std::ostream & str, Evoral::Parameter const & p)
+{
+ return str << p.type() << '-' << p.id() << '-' << (int) p.channel();
+}