summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2006-09-19 18:11:19 +0000
committerDavid Robillard <d@drobilla.net>2006-09-19 18:11:19 +0000
commitd82dcd232f201b531a0be165ee44aede1bc8a1df (patch)
tree22e8cdc4ae801c4645a174f988d914056ceadf87
parentf0d7a30b0a4d9daeb8db95c59a5b0e836b03b31b (diff)
downloadingen-d82dcd232f201b531a0be165ee44aede1bc8a1df.tar.gz
ingen-d82dcd232f201b531a0be165ee44aede1bc8a1df.tar.bz2
ingen-d82dcd232f201b531a0be165ee44aede1bc8a1df.zip
Alsa MIDI fixes.
git-svn-id: http://svn.drobilla.net/lad/ingen@144 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--src/common/util/Atom.h2
-rw-r--r--src/libs/client/SigClientInterface.h63
-rw-r--r--src/libs/client/Store.cpp72
-rw-r--r--src/libs/client/Store.h17
-rw-r--r--src/libs/engine/AlsaMidiDriver.cpp7
-rw-r--r--src/libs/engine/AlsaMidiDriver.h6
-rw-r--r--src/libs/engine/Engine.cpp2
-rw-r--r--src/progs/Makefile.am2
-rw-r--r--src/progs/demolition/DemolitionClientInterface.cpp109
-rw-r--r--src/progs/demolition/DemolitionClientInterface.h79
-rw-r--r--src/progs/demolition/DemolitionModel.cpp246
-rw-r--r--src/progs/demolition/DemolitionModel.h59
-rw-r--r--src/progs/demolition/Makefile.am4
-rw-r--r--src/progs/demolition/demolition.cpp166
-rw-r--r--src/progs/ingenuity/ConnectWindow.cpp13
15 files changed, 224 insertions, 623 deletions
diff --git a/src/common/util/Atom.h b/src/common/util/Atom.h
index 6cb001e1..f28b9339 100644
--- a/src/common/util/Atom.h
+++ b/src/common/util/Atom.h
@@ -17,9 +17,9 @@
#ifndef ATOM_H
#define ATOM_H
+#include <cstdlib>
#include <cassert>
#include <cstring>
-#include <lo/lo.h>
/** An OSC atom (fundamental data types OSC messages are composed of).
diff --git a/src/libs/client/SigClientInterface.h b/src/libs/client/SigClientInterface.h
index 1f24ad40..4639bdc7 100644
--- a/src/libs/client/SigClientInterface.h
+++ b/src/libs/client/SigClientInterface.h
@@ -64,6 +64,69 @@ public:
sigc::signal<void, string, uint32_t, uint32_t> program_remove_sig;
protected:
+
+ // ClientInterface hooks that fire the above signals
+
+ void bundle_begin() {}
+ void bundle_end() {}
+
+ void transfer_begin() {}
+ void transfer_end() {}
+
+ void num_plugins(uint32_t num) { num_plugins_sig.emit(num); }
+
+ void response(int32_t id, bool success, string msg)
+ { response_sig.emit(id, success, msg); }
+
+ void error(string msg)
+ { error_sig.emit(msg); }
+
+ void new_plugin(string uri, string name)
+ { new_plugin_sig.emit(uri, name); }
+
+ void new_patch(string path, uint32_t poly)
+ { new_patch_sig.emit(path, poly); }
+
+ void new_node(string plugin_uri, string node_path, bool is_polyphonic, uint32_t num_ports)
+ { new_node_sig.emit(plugin_uri, node_path, is_polyphonic, num_ports); }
+
+ void new_port(string path, string data_type, bool is_output)
+ { new_port_sig.emit(path, data_type, is_output); }
+
+ void connection(string src_port_path, string dst_port_path)
+ { connection_sig.emit(src_port_path, dst_port_path); }
+
+ void object_destroyed(string path)
+ { object_destroyed_sig.emit(path); }
+
+ void patch_enabled(string path)
+ { patch_enabled_sig.emit(path); }
+
+ void patch_disabled(string path)
+ { patch_disabled_sig.emit(path); }
+
+ void patch_cleared(string path)
+ { patch_cleared_sig.emit(path); }
+
+ void object_renamed(string old_path, string new_path)
+ { object_renamed_sig.emit(old_path, new_path); }
+
+ void disconnection(string src_port_path, string dst_port_path)
+ { disconnection_sig.emit(src_port_path, dst_port_path); }
+
+ void metadata_update(string path, string key, Atom value)
+ { metadata_update_sig.emit(path, key, value); }
+
+ void control_change(string port_path, float value)
+ { control_change_sig.emit(port_path, value); }
+
+ void program_add(string path, uint32_t bank, uint32_t program, string name)
+ { program_add_sig.emit(path, bank, program, name); }
+
+ void program_remove(string path, uint32_t bank, uint32_t program)
+ { program_remove_sig.emit(path, bank, program); }
+
+protected:
SigClientInterface() {}
};
diff --git a/src/libs/client/Store.cpp b/src/libs/client/Store.cpp
index 3b7e9768..f9b3f17a 100644
--- a/src/libs/client/Store.cpp
+++ b/src/libs/client/Store.cpp
@@ -50,8 +50,8 @@ Store::Store(CountedPtr<EngineInterface> engine, CountedPtr<SigClientInterface>
void
Store::clear()
{
- m_objects.clear();
- m_plugins.clear();
+ _objects.clear();
+ _plugins.clear();
}
@@ -63,16 +63,16 @@ Store::add_plugin_orphan(CountedPtr<NodeModel> node)
<< node->plugin_uri() << " unknown." << endl;
map<string, list<CountedPtr<NodeModel> > >::iterator spawn
- = m_plugin_orphans.find(node->plugin_uri());
+ = _plugin_orphans.find(node->plugin_uri());
_engine->request_plugin(node->plugin_uri());
- if (spawn != m_plugin_orphans.end()) {
+ if (spawn != _plugin_orphans.end()) {
spawn->second.push_back(node);
} else {
list<CountedPtr<NodeModel> > l;
l.push_back(node);
- m_plugin_orphans[node->plugin_uri()] = l;
+ _plugin_orphans[node->plugin_uri()] = l;
}
}
@@ -81,13 +81,13 @@ void
Store::resolve_plugin_orphans(CountedPtr<PluginModel> plugin)
{
map<string, list<CountedPtr<NodeModel> > >::iterator n
- = m_plugin_orphans.find(plugin->uri());
+ = _plugin_orphans.find(plugin->uri());
- if (n != m_plugin_orphans.end()) {
+ if (n != _plugin_orphans.end()) {
list<CountedPtr<NodeModel> > spawn = n->second; // take a copy
- m_plugin_orphans.erase(plugin->uri()); // prevent infinite recursion
+ _plugin_orphans.erase(plugin->uri()); // prevent infinite recursion
for (list<CountedPtr<NodeModel> >::iterator i = spawn.begin();
i != spawn.end(); ++i) {
@@ -103,7 +103,7 @@ Store::add_connection_orphan(CountedPtr<ConnectionModel> connection)
cerr << "WARNING: Orphan connection " << connection->src_port_path()
<< " -> " << connection->dst_port_path() << " received." << endl;
- m_connection_orphans.push_back(connection);
+ _connection_orphans.push_back(connection);
}
@@ -112,8 +112,8 @@ Store::resolve_connection_orphans(CountedPtr<PortModel> port)
{
assert(port->parent());
- for (list<CountedPtr<ConnectionModel> >::iterator c = m_connection_orphans.begin();
- c != m_connection_orphans.end(); ) {
+ for (list<CountedPtr<ConnectionModel> >::iterator c = _connection_orphans.begin();
+ c != _connection_orphans.end(); ) {
if ((*c)->src_port_path() == port->path())
(*c)->set_src_port(port);
@@ -130,7 +130,7 @@ Store::resolve_connection_orphans(CountedPtr<PortModel> port)
cerr << "Resolved orphan connection " << (*c)->src_port_path() <<
(*c)->dst_port_path() << endl;
patch->add_connection(*c);
- m_connection_orphans.erase(c);
+ _connection_orphans.erase(c);
}
}
@@ -145,16 +145,16 @@ Store::add_orphan(CountedPtr<ObjectModel> child)
cerr << "WARNING: Orphan object " << child->path() << " received." << endl;
map<Path, list<CountedPtr<ObjectModel> > >::iterator children
- = m_orphans.find(child->path().parent());
+ = _orphans.find(child->path().parent());
_engine->request_object(child->path().parent());
- if (children != m_orphans.end()) {
+ if (children != _orphans.end()) {
children->second.push_back(child);
} else {
list<CountedPtr<ObjectModel> > l;
l.push_back(child);
- m_orphans[child->path().parent()] = l;
+ _orphans[child->path().parent()] = l;
}
}
@@ -163,16 +163,16 @@ void
Store::add_metadata_orphan(const Path& subject_path, const string& predicate, const Atom& value)
{
map<Path, list<std::pair<string, Atom> > >::iterator orphans
- = m_metadata_orphans.find(subject_path);
+ = _metadata_orphans.find(subject_path);
_engine->request_object(subject_path);
- if (orphans != m_metadata_orphans.end()) {
+ if (orphans != _metadata_orphans.end()) {
orphans->second.push_back(std::pair<string, Atom>(predicate, value));
} else {
list<std::pair<string, Atom> > l;
l.push_back(std::pair<string, Atom>(predicate, value));
- m_metadata_orphans[subject_path] = l;
+ _metadata_orphans[subject_path] = l;
}
}
@@ -181,13 +181,13 @@ void
Store::resolve_metadata_orphans(CountedPtr<ObjectModel> subject)
{
map<Path, list<std::pair<string, Atom> > >::iterator v
- = m_metadata_orphans.find(subject->path());
+ = _metadata_orphans.find(subject->path());
- if (v != m_metadata_orphans.end()) {
+ if (v != _metadata_orphans.end()) {
list<std::pair<string, Atom> > values = v->second; // take a copy
- m_metadata_orphans.erase(subject->path());
+ _metadata_orphans.erase(subject->path());
for (list<std::pair<string, Atom> >::iterator i = values.begin();
i != values.end(); ++i) {
@@ -201,13 +201,13 @@ void
Store::resolve_orphans(CountedPtr<ObjectModel> parent)
{
map<Path, list<CountedPtr<ObjectModel> > >::iterator c
- = m_orphans.find(parent->path());
+ = _orphans.find(parent->path());
- if (c != m_orphans.end()) {
+ if (c != _orphans.end()) {
list<CountedPtr<ObjectModel> > children = c->second; // take a copy
- m_orphans.erase(parent->path()); // prevent infinite recursion
+ _orphans.erase(parent->path()); // prevent infinite recursion
for (list<CountedPtr<ObjectModel> >::iterator i = children.begin();
i != children.end(); ++i) {
@@ -222,8 +222,8 @@ Store::add_object(CountedPtr<ObjectModel> object)
{
// If we already have "this" object, merge the existing one into the new
// one (with precedence to the new values).
- ObjectMap::iterator existing = m_objects.find(object->path());
- if (existing != m_objects.end()) {
+ ObjectMap::iterator existing = _objects.find(object->path());
+ if (existing != _objects.end()) {
existing->second->set(object);
} else {
@@ -235,7 +235,7 @@ Store::add_object(CountedPtr<ObjectModel> object)
parent->add_child(object);
assert(parent && (object->parent() == parent));
- m_objects[object->path()] = object;
+ _objects[object->path()] = object;
new_object_sig.emit(object);
resolve_metadata_orphans(parent);
@@ -249,7 +249,7 @@ Store::add_object(CountedPtr<ObjectModel> object)
add_orphan(object);
}
} else {
- m_objects[object->path()] = object;
+ _objects[object->path()] = object;
new_object_sig.emit(object);
}
@@ -262,12 +262,12 @@ Store::add_object(CountedPtr<ObjectModel> object)
CountedPtr<ObjectModel>
Store::remove_object(const Path& path)
{
- map<Path, CountedPtr<ObjectModel> >::iterator i = m_objects.find(path);
+ map<Path, CountedPtr<ObjectModel> >::iterator i = _objects.find(path);
- if (i != m_objects.end()) {
+ if (i != _objects.end()) {
assert((*i).second->path() == path);
CountedPtr<ObjectModel> result = (*i).second;
- m_objects.erase(i);
+ _objects.erase(i);
//cout << "[Store] Removed " << path << endl;
if (result)
@@ -297,8 +297,8 @@ CountedPtr<PluginModel>
Store::plugin(const string& uri)
{
assert(uri.length() > 0);
- map<string, CountedPtr<PluginModel> >::iterator i = m_plugins.find(uri);
- if (i == m_plugins.end())
+ map<string, CountedPtr<PluginModel> >::iterator i = _plugins.find(uri);
+ if (i == _plugins.end())
return CountedPtr<PluginModel>();
else
return (*i).second;
@@ -309,8 +309,8 @@ CountedPtr<ObjectModel>
Store::object(const Path& path)
{
assert(path.length() > 0);
- map<Path, CountedPtr<ObjectModel> >::iterator i = m_objects.find(path);
- if (i == m_objects.end()) {
+ map<Path, CountedPtr<ObjectModel> >::iterator i = _objects.find(path);
+ if (i == _objects.end()) {
return CountedPtr<ObjectModel>();
} else {
assert(i->second->path() == "/" || i->second->parent());
@@ -323,7 +323,7 @@ Store::add_plugin(CountedPtr<PluginModel> pm)
{
// FIXME: dupes? merge, like with objects?
- m_plugins[pm->uri()] = pm;
+ _plugins[pm->uri()] = pm;
}
diff --git a/src/libs/client/Store.h b/src/libs/client/Store.h
index a2083ba2..6a8700f9 100644
--- a/src/libs/client/Store.h
+++ b/src/libs/client/Store.h
@@ -54,9 +54,10 @@ public:
void clear();
- size_t num_objects() { return m_objects.size(); }
+ size_t num_object() { return _objects.size(); }
- const map<string, CountedPtr<PluginModel> >& plugins() const { return m_plugins; }
+ const map<string, CountedPtr<PluginModel> >& plugins() const { return _plugins; }
+ const map<Path, CountedPtr<ObjectModel> >& objects() const { return _objects; }
sigc::signal<void, CountedPtr<ObjectModel> > new_object_sig;
private:
@@ -98,23 +99,23 @@ private:
CountedPtr<SigClientInterface> _emitter;
typedef map<Path, CountedPtr<ObjectModel> > ObjectMap;
- ObjectMap m_objects; ///< Keyed by Ingen path
+ ObjectMap _objects; ///< Keyed by Ingen path
- map<string, CountedPtr<PluginModel> > m_plugins; ///< Keyed by URI
+ map<string, CountedPtr<PluginModel> > _plugins; ///< Keyed by URI
/** Objects we've received, but depend on the existance of another unknown object.
* Keyed by the path of the depended-on object (for tolerance of orderless comms) */
- map<Path, list<CountedPtr<ObjectModel> > > m_orphans;
+ map<Path, list<CountedPtr<ObjectModel> > > _orphans;
/** Same idea, except with plugins instead of parents.
* It's unfortunate everything doesn't just have a URI and this was the same.. ahem.. */
- map<string, list<CountedPtr<NodeModel> > > m_plugin_orphans;
+ map<string, list<CountedPtr<NodeModel> > > _plugin_orphans;
/** Not orphans OF metadata like the above, but orphans which are metadata */
- map<Path, list<std::pair<string, Atom> > > m_metadata_orphans;
+ map<Path, list<std::pair<string, Atom> > > _metadata_orphans;
/** Ditto */
- list<CountedPtr<ConnectionModel> > m_connection_orphans;
+ list<CountedPtr<ConnectionModel> > _connection_orphans;
};
diff --git a/src/libs/engine/AlsaMidiDriver.cpp b/src/libs/engine/AlsaMidiDriver.cpp
index 78d032be..3f6b060d 100644
--- a/src/libs/engine/AlsaMidiDriver.cpp
+++ b/src/libs/engine/AlsaMidiDriver.cpp
@@ -118,7 +118,7 @@ void
AlsaMidiPort::event(snd_seq_event_t* const ev)
{
// Abuse the tick field to hold the timestamp
- ev->time.tick = _driver->clock()->time_stamp();
+ ev->time.tick = _driver->audio_driver()->frame_time();
// Fix noteons with velocity 0 (required for DSSI spec)
if (ev->type == SND_SEQ_EVENT_NOTEON && ev->data.note.velocity == 0)
@@ -187,8 +187,9 @@ AlsaMidiPort::prepare_block(const SampleCount block_start, const SampleCount blo
bool AlsaMidiDriver::_midi_thread_exit_flag = true;
-AlsaMidiDriver::AlsaMidiDriver()
-: _seq_handle(NULL),
+AlsaMidiDriver::AlsaMidiDriver(AudioDriver* audio_driver)
+: _audio_driver(audio_driver),
+ _seq_handle(NULL),
_event_coder(NULL),
_is_activated(false)
{
diff --git a/src/libs/engine/AlsaMidiDriver.h b/src/libs/engine/AlsaMidiDriver.h
index ad40ed17..bc5e6203 100644
--- a/src/libs/engine/AlsaMidiDriver.h
+++ b/src/libs/engine/AlsaMidiDriver.h
@@ -27,6 +27,7 @@ namespace Ingen {
class Node;
class SetPortValueEvent;
class AlsaMidiDriver;
+class AudioDriver;
template <typename T> class DuplexPort;
static const int MAX_MIDI_EVENT_SIZE = 3;
@@ -76,7 +77,7 @@ private:
class AlsaMidiDriver : public MidiDriver
{
public:
- AlsaMidiDriver();
+ AlsaMidiDriver(AudioDriver* audio_driver);
~AlsaMidiDriver();
void activate();
@@ -86,6 +87,8 @@ public:
void prepare_block(const SampleCount block_start, const SampleCount block_end);
+ AudioDriver* audio_driver() { return _audio_driver; }
+
DriverPort* create_port(DuplexPort<MidiMessage>* patch_port)
{ return new AlsaMidiPort(this, patch_port); }
@@ -113,6 +116,7 @@ private:
// MIDI thread
static void* process_midi_in(void* me);
+ AudioDriver* _audio_driver;
snd_seq_t* _seq_handle;
snd_midi_event_t* _event_coder;
pthread_t _process_thread;
diff --git a/src/libs/engine/Engine.cpp b/src/libs/engine/Engine.cpp
index 94f964dc..5d064d49 100644
--- a/src/libs/engine/Engine.cpp
+++ b/src/libs/engine/Engine.cpp
@@ -54,7 +54,7 @@ Engine::Engine(AudioDriver* audio_driver)
#ifdef HAVE_JACK_MIDI
m_midi_driver(new JackMidiDriver(((JackAudioDriver*)m_audio_driver)->jack_client())),
#elif HAVE_ALSA_MIDI
- m_midi_driver(new AlsaMidiDriver()),
+ m_midi_driver(new AlsaMidiDriver(m_audio_driver)),
#else
m_midi_driver(new DummyMidiDriver()),
#endif
diff --git a/src/progs/Makefile.am b/src/progs/Makefile.am
index 01791a1b..f37c8af0 100644
--- a/src/progs/Makefile.am
+++ b/src/progs/Makefile.am
@@ -5,7 +5,7 @@ DIST_SUBDIRS = python supercollider
SUBDIRS = server
if BUILD_CONSOLE_CLIENTS
-SUBDIRS += patch_loader #demolition
+SUBDIRS += patch_loader # demolition
endif
if BUILD_GTK_CLIENT
diff --git a/src/progs/demolition/DemolitionClientInterface.cpp b/src/progs/demolition/DemolitionClientInterface.cpp
deleted file mode 100644
index 23f5733f..00000000
--- a/src/progs/demolition/DemolitionClientInterface.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/* This file is part of Ingen. Copyright (C) 2006 Dave Robillard.
- *
- * Ingen 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.
- *
- * Ingen 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "DemolitionClientInterface.h"
-#include "DemolitionModel.h"
-
-
-DemolitionClientInterface::DemolitionClientInterface(DemolitionModel* model)
-: m_model(model)
-{
-}
-
-
-DemolitionClientInterface::~DemolitionClientInterface()
-{
-}
-
-
-void
-DemolitionClientInterface::error(string msg)
-{
-}
-
-
-void
-DemolitionClientInterface::new_patch_model(CountedPtr<PatchModel> pm)
-{
- m_model->add_patch(pm);
-}
-
-
-void
-DemolitionClientInterface::new_port_model(PortModel* port_model)
-{
- m_model->add_port(port_model);
-}
-
-
-void
-DemolitionClientInterface::object_destroyed(string path)
-{
- m_model->remove_object(path);
-}
-
-void
-DemolitionClientInterface::patch_enabled(string path)
-{
-}
-
-
-void
-DemolitionClientInterface::patch_disabled(string path)
-{
-}
-
-
-void
-DemolitionClientInterface::new_node_model(CountedPtr<NodeModel> nm)
-{
- m_model->add_node(nm);
-}
-
-
-void
-DemolitionClientInterface::object_renamed(string old_path, string new_path)
-{
- m_model->object_renamed(old_path, new_path);
-}
-
-
-void
-DemolitionClientInterface::connection_model(ConnectionModel* cm)
-{
- m_model->add_connection(cm);
-}
-
-
-void
-DemolitionClientInterface::disconnection(string src_port_path, string dst_port_path)
-{
- m_model->remove_connection(src_port_path, dst_port_path);
-}
-
-
-void
-DemolitionClientInterface::control_change(string port_path, float value)
-{
-}
-
-
-void
-DemolitionClientInterface::new_plugin_model(PluginModel* pi)
-{
- m_model->add_plugin(pi);
-}
-
diff --git a/src/progs/demolition/DemolitionClientInterface.h b/src/progs/demolition/DemolitionClientInterface.h
deleted file mode 100644
index 809857cf..00000000
--- a/src/progs/demolition/DemolitionClientInterface.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* This file is part of Ingen. Copyright (C) 2006 Dave Robillard.
- *
- * Ingen 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.
- *
- * Ingen 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef DEMOLITIONCLIENTHOOKS_H
-#define DEMOLITIONCLIENTHOOKS_H
-
-#include <cstdlib>
-#include <string>
-#include "ModelClientInterface.h"
-#include "DemolitionModel.h"
-#include "PluginModel.h"
-using std::string;
-
-using namespace Ingen::Client;
-
-
-/** ModelClientInterface implementation for the Gtk client.
- *
- * These are the hooks into the GUI for the Comm class.
- *
- * \ingroup OmGtk
- */
-class DemolitionClientInterface : public ModelClientInterface
-{
-public:
- DemolitionClientInterface(DemolitionModel* model);
- virtual ~DemolitionClientInterface();
-
- void bundle_begin() {}
- void bundle_end() {}
-
- void transfer_begin() {}
- void transfer_end() {}
-
- void num_plugins(uint32_t num) {}
-
- void response(int32_t id, bool success, string msg) {}
-
- // OSC thread functions
- void error(string msg);
-
- void new_plugin(string type,
- string uri,
- string name) {}
- void new_patch_model(CountedPtr<PatchModel> pm);
- void new_port_model(CountedPtr<PortModel> port_model);
- void object_destroyed(string path);
- void patch_enabled(string path);
- void patch_disabled(string path);
- void patch_cleared(string path) { throw; }
- void new_node_model(CountedPtr<NodeModel> nm);
- void object_renamed(string old_path, string new_path);
- void connection_model(CountedPtr<ConnectionModel> cm);
- void disconnection(string src_port_path, string dst_port_path);
- void metadata_update(string path, string key, string value) {}
- void control_change(string port_path, float value);
- void new_plugin_model(CountedPtr<PluginModel> pi);
- void program_add(string path, uint32_t bank, uint32_t program, string name) {};
- void program_remove(string path, uint32_t bank, uint32_t program) {};
-
-private:
- DemolitionModel* m_model;
-};
-
-
-#endif // DEMOLITIONCLIENTHOOKS_H
diff --git a/src/progs/demolition/DemolitionModel.cpp b/src/progs/demolition/DemolitionModel.cpp
deleted file mode 100644
index 8ac10195..00000000
--- a/src/progs/demolition/DemolitionModel.cpp
+++ /dev/null
@@ -1,246 +0,0 @@
-/* This file is part of Ingen. Copyright (C) 2006 Dave Robillard.
- *
- * Ingen 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.
- *
- * Ingen 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "DemolitionModel.h"
-#include "util/Path.h"
-#include "PluginModel.h"
-#include <stdlib.h>
-#include <iostream>
-using std::cout; using std::cerr; using std::endl;
-
-
-DemolitionModel::~DemolitionModel()
-{
- for (vector<PluginModel*>::iterator i = m_plugins.begin(); i != m_plugins.end(); ++i)
- delete *i;
-
- for (vector<PatchModel*>::iterator i = m_patches.begin(); i != m_patches.end(); ++i)
- delete *i;
-}
-
-
-PatchModel*
-DemolitionModel::random_patch()
-{
- if (m_patches.size() == 0)
- return NULL;
- else
- return m_patches.at(rand() % m_patches.size());
-}
-
-
-NodeModel*
-DemolitionModel::random_node()
-{
- int max_attempts = m_patches.size()*4;
- int attempts = 0;
-
- while (attempts++ < max_attempts) {
- PatchModel* pm = random_patch();
-
- if (pm == NULL) {
- return NULL;
- } else {
- int size = pm->nodes().size();
- if (size == 0)
- continue;
- int index = rand() % size;
- NodeModelMap::const_iterator i = pm->nodes().begin();
- for (int j=0; j < index; ++j) {
- ++i;
- if (i == pm->nodes().end())
- return NULL;
- }
- return (*i).second.get();
- }
- }
- //cout << "***************************** Not returning node *********" << endl;
- return NULL;
-}
-
-
-NodeModel*
-DemolitionModel::random_node_in_patch(PatchModel* pm)
-{
- if (pm == NULL)
- return NULL;
-
- int size = pm->nodes().size();
- if (size == 0)
- return NULL;
-
- int index = rand() % size;
- NodeModelMap::const_iterator i = pm->nodes().begin();
- for (int j=0; j < index; ++j) {
- ++i;
- if (i == pm->nodes().end())
- return NULL;
- }
- return (*i).second.get();
-}
-
-
-PortModel*
-DemolitionModel::random_port()
-{
- NodeModel* node = random_node();
-
- if (node == NULL) return NULL;
-
- PortModelList ports = node->ports();
-
- int num_ports = ports.size();
- int index = rand() % num_ports;
- int i = 0;
-
- for (PortModelList::iterator p = ports.begin(); p != ports.end(); ++p, ++i)
- if (i == index)
- return (*p).get();
-
- return NULL; // shouldn't happen
-}
-
-
-PortModel*
-DemolitionModel::random_port_in_node(NodeModel* node)
-{
- if (node == NULL)
- return NULL;
-
- PortModelList ports = node->ports();
-
- int num_ports = ports.size();
- int index = rand() % num_ports;
- int i = 0;
-
- for (PortModelList::iterator p = ports.begin(); p != ports.end(); ++p, ++i)
- if (i == index)
- return (*p).get();
-
- return NULL; // shouldn't happen
-}
-
-
-PluginModel*
-DemolitionModel::random_plugin()
-{
- if (m_plugins.size() == 0)
- return NULL;
- else
- return m_plugins.at(rand() % m_plugins.size());
-}
-
-
-PatchModel*
-DemolitionModel::patch(const Path& path)
-{
- for (vector<PatchModel*>::iterator i = m_patches.begin(); i != m_patches.end(); ++i) {
- if ((*i)->path() == path)
- return (*i);
- }
- return NULL;
-}
-
-
-NodeModel*
-DemolitionModel::node(const Path& path)
-{
- NodeModel* ret = NULL;
-
- for (vector<PatchModel*>::iterator i = m_patches.begin(); i != m_patches.end(); ++i) {
- ret = (*i)->get_node(path.name()).get();
- if (ret != NULL)
- break;
- }
- return ret;
-}
-
-
-void
-DemolitionModel::remove_object(const Path& path)
-{
- // Patch
- for (vector<PatchModel*>::iterator i = m_patches.begin(); i != m_patches.end(); ++i) {
- if ((*i)->path() == path) {
- delete (*i);
- m_patches.erase(i);
- break;
- }
- }
-
- // Node
- PatchModel* parent = patch(path.parent());
- if (parent != NULL)
- parent->remove_node(path.name());
-}
-
-
-void
-DemolitionModel::add_node(CountedPtr<NodeModel> nm)
-{
- PatchModel* parent = patch(nm->path().parent());
- if (parent == NULL) {
- cout << "**** ERROR: Parent for new Node does not exist." << endl;
- } else {
- parent->add_node(nm);
- }
-}
-
-
-void
-DemolitionModel::add_port(PortModel* pm)
-{
-}
-
-
-void
-DemolitionModel::add_connection(ConnectionModel* cm)
-{
-}
-
-
-void
-DemolitionModel::remove_connection(const Path& src_port_path, const Path& dst_port_path)
-{
-}
-
-void
-DemolitionModel::object_renamed(const Path& old_path, const Path& new_path)
-{
- /* FIXME: broken, does not rename children
- assert(Path::parent(old_path) == Path::parent(new_path));
-
- // Rename node
- NodeModel* nm = get_node(old_path);
- if (nm != NULL) {
- if (nm->parent() != NULL) {
- nm->parent()->remove_node(Path::name(old_path));
- nm->path(new_path);
- nm->parent()->add_node(Path::name(new_path));
- }
- }
-
- // Rename patch
- for (vector<PatchModel*>::iterator i = m_patches.begin(); i != m_patches.end(); ++i) {
- if ((*i)->path() == path) {
- delete (*i);
- m_patches.erase(i);
- return;
- }
- }
- */
-}
-
diff --git a/src/progs/demolition/DemolitionModel.h b/src/progs/demolition/DemolitionModel.h
deleted file mode 100644
index 6ae8c0ec..00000000
--- a/src/progs/demolition/DemolitionModel.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* This file is part of Ingen. Copyright (C) 2006 Dave Robillard.
- *
- * Ingen 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.
- *
- * Ingen 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 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 St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef DEMOLITIONMODEL_H
-#define DEMOLITIONMODEL_H
-
-#include <vector>
-#include "PatchModel.h"
-#include "util/Path.h"
-using std::vector;
-
-using namespace Ingen::Client;
-
-class DemolitionModel {
-public:
- ~DemolitionModel();
-
- PatchModel* random_patch();
- NodeModel* random_node();
- NodeModel* random_node_in_patch(PatchModel* patch);
- PortModel* random_port();
- PortModel* random_port_in_node(NodeModel* node);
- PluginModel* random_plugin();
-
- PatchModel* patch(const Path& path);
- NodeModel* node(const Path& path);
-
- void add_patch(PatchModel* pm) { m_patches.push_back(pm); }
- void add_node(CountedPtr<NodeModel> nm);
- void add_port(PortModel* pm);
- void remove_object(const Path& path);
- void add_connection(ConnectionModel* cm);
- void remove_connection(const Path& src_port_path, const Path& dst_port_path);
- void add_plugin(PluginModel* pi) { m_plugins.push_back(pi); }
-
- void object_renamed(const Path& old_path, const Path& new_path);
-
- int num_patches() { return m_patches.size(); }
-
-private:
- vector<PluginModel*> m_plugins;
- vector<PatchModel*> m_patches;
-};
-
-
-#endif // DEMOLITIONMODEL_H
diff --git a/src/progs/demolition/Makefile.am b/src/progs/demolition/Makefile.am
index 07caff5b..b01b062b 100644
--- a/src/progs/demolition/Makefile.am
+++ b/src/progs/demolition/Makefile.am
@@ -8,10 +8,6 @@ bin_PROGRAMS = om_demolition
om_demolition_DEPENDENCIES = ../../libs/client/libomclient.la
om_demolition_SOURCES = \
- DemolitionClientInterface.h \
- DemolitionClientInterface.cpp \
- DemolitionModel.h \
- DemolitionModel.cpp \
demolition.cpp \
cmdline.h \
cmdline.c
diff --git a/src/progs/demolition/demolition.cpp b/src/progs/demolition/demolition.cpp
index 27da5dd9..3015200e 100644
--- a/src/progs/demolition/demolition.cpp
+++ b/src/progs/demolition/demolition.cpp
@@ -17,8 +17,11 @@
#include "interface/ClientInterface.h"
#include "interface/ClientKey.h"
#include "OSCModelEngineInterface.h"
+#include "OSCClientReceiver.h"
+#include "SigClientInterface.h"
+#include "Store.h"
#include "PatchLibrarian.h"
-#include "DemolitionClientInterface.h"
+#include "PluginModel.h"
#include "util/CountedPtr.h"
#include <iostream>
#include <unistd.h>
@@ -46,9 +49,21 @@ void rename_object();
// Yay globals!
-DemolitionModel* model;
-OSCModelEngineInterface* engine;
-
+CountedPtr<OSCModelEngineInterface> engine;
+CountedPtr<Store> store;
+
+
+// OSC listening non-threaded signal emitter
+struct OSCSigEmitter : public OSCClientReceiver, public SigClientInterface {
+public:
+ OSCSigEmitter(int listen_port)
+ : Ingen::Shared::ClientInterface()
+ , OSCClientReceiver(listen_port)
+ , SigClientInterface()
+ {
+ }
+};
+
int
main(int argc, char** argv)
@@ -73,18 +88,16 @@ main(int argc, char** argv)
else
client_port = 0; // will choose a free port automatically
- model = new DemolitionModel();
+ engine = CountedPtr<ModelEngineInterface>(new OSCModelEngineInterface(engine_url));
+ CountedPtr<SigClientInterface> emitter(new OSCSigEmitter(16182));
- // Create this first so engine interface (liblo) uses the port
- CountedPtr<DemolitionClientInterface> client
- = CountedPtr<DemolitionClientInterface>(new DemolitionClientInterface(model));
-
- engine = new OSCModelEngineInterface(engine_url);
+ store = CountedPtr<Store>(new Store(engine, emitter));
+
engine->activate();
/* Connect to engine */
//engine->attach(engine_url);
- engine->register_client(ClientKey(), (CountedPtr<ClientInterface>)client);
+ engine->register_client(ClientKey(), emitter);
engine->load_plugins();
engine->request_plugins();
@@ -106,9 +119,6 @@ main(int argc, char** argv)
engine->unregister_client(ClientKey());
//engine->detach();
- delete engine;
- delete model;
-
return 0;
}
@@ -157,36 +167,70 @@ random_name()
}
+Path
+random_object()
+{
+ typedef map<Path, CountedPtr<ObjectModel> > ObjectMap;
+
+ const ObjectMap& objects = store->objects();
+
+ // Return a crap path every once in a while
+ if (rand() % 30)
+ return "/DEAD/BEEF";
+
+ // "random" is a bit of a generous label...
+ for (ObjectMap::const_iterator i = objects.begin(); i != objects.end(); ++i)
+ if (rand() % objects.size())
+ return i->second->path();
+
+ return "/";
+}
+
+
+string
+random_plugin()
+{
+ typedef map<string, CountedPtr<PluginModel> > PluginMap;
+
+ const PluginMap& plugins = store->plugins();
+
+ // Return a crap path every once in a while
+ if (rand() % 30)
+ return "DEAD:BEEF";
+
+ // "random" is a bit of a generous label...
+ for (PluginMap::const_iterator i = plugins.begin(); i != plugins.end(); ++i)
+ if (rand() % plugins.size())
+ return i->second->uri();
+
+ return "DEAD:BEEF2";
+}
+
+
void
create_patch()
{
// Make the probability of this happening inversely proportionate to the number
- // of patches to keep the # in a sane range
- //if (model->num_patches() > 0 && (rand() % model->num_patches()))
- // return;
+ // of objects to keep the # in a sane range
+ if (store->objects().size() > 0 && (rand() % store->objects().size()))
+ return;
bool subpatch = rand()%2;
- PatchModel* parent = NULL;
+ Path parent = "/";
string name = random_name();
- PatchModel* pm = NULL;
if (subpatch)
- parent = model->random_patch();
+ parent = random_object(); // very likely invalid parent error
- if (parent != NULL)
- pm = new PatchModel(parent->path() +"/"+ name, (rand()%8)+1);
- else
- pm = new PatchModel(string("/") + name, (rand()%8)+1);
+ const Path path = parent.base() + name;
- cout << "Creating patch " << pm->path() << endl;
+ cout << "Creating patch " << path << endl;
- engine->create_patch_from_model(pm);
+ engine->create_patch(path, (rand()%8)+1);
// Spread them out a bit for easier monitoring with ingenuity
- engine->set_metadata(pm->path(), "module-x", 1600 + rand()%800 - 400);
- engine->set_metadata(pm->path(), "module-y", 1200 + rand()%700 - 350);
-
- delete pm;
+ engine->set_metadata(path, "module-x", 1600 + rand()%800 - 400);
+ engine->set_metadata(path, "module-y", 1200 + rand()%700 - 350);
}
@@ -195,38 +239,24 @@ destroy()
{
// Make the probability of this happening proportionate to the number
// of patches to keep the # in a sane range
- if (model->num_patches() == 0 || !(rand() % model->num_patches()))
+ if (store->objects().size() > 0 && !(rand() % store->objects().size()))
return;
- NodeModel* nm = NULL;
-
- if (rand()%2)
- nm = model->random_patch();
- else
- nm = model->random_node();
-
- if (nm != NULL) {
- cout << "Destroying " << nm->path() << endl;
- engine->destroy(nm->path());
- }
+ engine->destroy(random_object());
}
void
add_node()
{
- PatchModel* parent = model->random_patch();
- PluginModel* plugin = model->random_plugin();
-
- if (parent != NULL && plugin != NULL) {
- NodeModel* nm = new NodeModel(plugin, parent->path() +"/"+ random_name());
- cout << "Adding node " << nm->path() << endl;
- engine->create_node_from_model(nm);
-
- // Spread them out a bit for easier monitoring with ingenuity
- engine->set_metadata(pm->path(), "module-x", 1600 + rand()%800 - 400);
- engine->set_metadata(pm->path(), "module-y", 1200 + rand()%700 - 350);
- }
+ const Path path = random_object().base() + random_name();
+
+ cout << "Adding node " << path << endl;
+ engine->create_node(path, random_plugin(), rand()%2);
+
+ // Spread them out a bit for easier monitoring with ingenuity
+ engine->set_metadata(path, "module-x", 1600 + rand()%800 - 400);
+ engine->set_metadata(path, "module-y", 1200 + rand()%700 - 350);
}
@@ -234,11 +264,11 @@ void
connect()
{
if (!(rand() % 10)) { // Attempt a connection between two nodes in the same patch
- PatchModel* parent = model->random_patch();
- NodeModel* n1 = model->random_node_in_patch(parent);
- NodeModel* n2 = model->random_node_in_patch(parent);
- PortModel* p1 = model->random_port_in_node(n1);
- PortModel* p2 = model->random_port_in_node(n2);
+ PatchModel* parent = store->random_patch();
+ NodeModel* n1 = store->random_node_in_patch(parent);
+ NodeModel* n2 = store->random_node_in_patch(parent);
+ PortModel* p1 = store->random_port_in_node(n1);
+ PortModel* p2 = store->random_port_in_node(n2);
if (p1 != NULL && p2 != NULL) {
cout << "Connecting " << p1->path() << " -> " << p2->path() << endl;
@@ -246,8 +276,8 @@ connect()
}
} else { // Attempt a connection between two truly random nodes
- PortModel* p1 = model->random_port();
- PortModel* p2 = model->random_port();
+ PortModel* p1 = store->random_port();
+ PortModel* p2 = store->random_port();
if (p1 != NULL && p2 != NULL) {
cout << "Connecting " << p1->path() << " -> " << p2->path() << endl;
@@ -260,8 +290,8 @@ connect()
void
disconnect()
{
- PortModel* p1 = model->random_port();
- PortModel* p2 = model->random_port();
+ PortModel* p1 = store->random_port();
+ PortModel* p2 = store->random_port();
if (p1 != NULL && p2 != NULL) {
cout << "Disconnecting " << p1->path() << " -> " << p2->path() << endl;
@@ -273,7 +303,7 @@ disconnect()
void
disconnect_all()
{
- PortModel* p = model->random_port();
+ PortModel* p = store->random_port();
if (p != NULL) {
cout << "Disconnecting all from" << p->path() << endl;
@@ -285,7 +315,7 @@ disconnect_all()
void
set_port_value()
{
- PortModel* pm = model->random_port();
+ PortModel* pm = store->random_port();
float val = (float)rand() / (float)RAND_MAX;
if (pm != NULL) {
@@ -298,7 +328,7 @@ set_port_value()
void
set_port_value_queued()
{
- PortModel* pm = model->random_port();
+ PortModel* pm = store->random_port();
float val = (float)rand() / (float)RAND_MAX;
if (pm != NULL) {
@@ -315,11 +345,11 @@ rename_object()
/*int type = rand()%6;
if (type == 0) {
- NodeModel* n = model->random_node();
+ NodeModel* n = store->random_node();
if (n != NULL)
engine->rename(n->path(), random_name());
} else {
- PatchModel* p = model->random_patch();
+ PatchModel* p = store->random_patch();
if (p != NULL)
engine->rename(p->path(), random_name());
}*/
diff --git a/src/progs/ingenuity/ConnectWindow.cpp b/src/progs/ingenuity/ConnectWindow.cpp
index 64d611e2..256be92f 100644
--- a/src/progs/ingenuity/ConnectWindow.cpp
+++ b/src/progs/ingenuity/ConnectWindow.cpp
@@ -44,11 +44,10 @@ namespace Ingenuity {
struct OSCSigEmitter : public OSCClientReceiver, public ThreadedSigClientInterface {
-public:
OSCSigEmitter(size_t queue_size, int listen_port)
- : Ingen::Shared::ClientInterface()
- , OSCClientReceiver(listen_port)
- , ThreadedSigClientInterface(queue_size)
+ : Ingen::Shared::ClientInterface()
+ , OSCClientReceiver(listen_port)
+ , ThreadedSigClientInterface(queue_size)
{
}
};
@@ -56,8 +55,8 @@ public:
struct QueuedModelEngineInterface : public QueuedEngineInterface, public ModelEngineInterface {
QueuedModelEngineInterface(CountedPtr<Ingen::Engine> engine)
- : Ingen::Shared::EngineInterface()
- , Ingen::QueuedEngineInterface(engine, Ingen::event_queue_size, Ingen::event_queue_size)
+ : Ingen::Shared::EngineInterface()
+ , Ingen::QueuedEngineInterface(engine, Ingen::event_queue_size, Ingen::event_queue_size)
{
QueuedEventSource::start();
}
@@ -348,7 +347,7 @@ ConnectWindow::gtk_callback()
App::instance().engine()->request_all_objects();
++stage;
} else if (stage == 7) {
- if (App::instance().store()->num_objects() > 0) {
+ if (App::instance().store()->objects().size() > 0) {
CountedPtr<PatchModel> root = PtrCast<PatchModel>(App::instance().store()->object("/"));
assert(root);
App::instance().window_factory()->present_patch(root);