summaryrefslogtreecommitdiff
path: root/libs/evoral/src/ControlSet.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/evoral/src/ControlSet.cc')
-rw-r--r--libs/evoral/src/ControlSet.cc115
1 files changed, 115 insertions, 0 deletions
diff --git a/libs/evoral/src/ControlSet.cc b/libs/evoral/src/ControlSet.cc
new file mode 100644
index 0000000000..c9096187db
--- /dev/null
+++ b/libs/evoral/src/ControlSet.cc
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2008-2014 David Robillard <d@drobilla.net>
+ * Copyright (C) 2010-2018 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2010 Carl Hetherington <carl@carlh.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <iostream>
+#include <limits>
+#include "evoral/ControlSet.h"
+#include "evoral/ControlList.h"
+#include "evoral/Control.h"
+#include "evoral/Event.h"
+
+using namespace std;
+
+namespace Evoral {
+
+
+ControlSet::ControlSet()
+{
+}
+
+ControlSet::ControlSet (const ControlSet&)
+ : noncopyable ()
+{
+ /* 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::Threads::Mutex::Lock lm (_control_lock);
+
+ for (Controls::const_iterator li = _controls.begin(); li != _controls.end(); ++li) {
+ if (li->second->list() && !li->second->list()->empty()) {
+ s.insert (li->first);
+ }
+ }
+}
+
+/** If a control for the given parameter does not exist and \a create_if_missing is true,
+ * a control will be created, added to this set, and returned.
+ * If \a create_if_missing is false this function may return null.
+ */
+boost::shared_ptr<Control>
+ControlSet::control (const Parameter& parameter, bool create_if_missing)
+{
+ Controls::iterator i = _controls.find(parameter);
+
+ if (i != _controls.end()) {
+ return i->second;
+
+ } else if (create_if_missing) {
+ boost::shared_ptr<Control> ac(control_factory(parameter));
+ add_control(ac);
+ return ac;
+
+ } else {
+ return boost::shared_ptr<Control>();
+ }
+}
+
+void
+ControlSet::clear_controls ()
+{
+ Glib::Threads::Mutex::Lock lm (_control_lock);
+
+ _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();
+}