From 0b1c17f08f8eab4ada52ee98ba7353ec0260d3eb Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 11 Jun 2006 23:33:00 +0000 Subject: New nodes in gtk client working through Store signal interface git-svn-id: http://svn.drobilla.net/lad/grauph@26 a436a847-0d15-0410-975c-d299462d15a1 --- src/common/util/CountedPtr.h | 19 ++- src/libs/client/Makefile.am | 2 +- src/libs/client/ModelClientInterface.cpp | 7 +- src/libs/client/NodeModel.cpp | 26 +++-- src/libs/client/NodeModel.h | 22 ++-- src/libs/client/PatchLibrarian.cpp | 24 ++-- src/libs/client/PatchModel.cpp | 20 ++-- src/libs/client/PatchModel.h | 7 +- src/libs/client/PortModel.h | 3 +- src/libs/client/ThreadedSigClientInterface.cpp | 3 - src/progs/demolition/DemolitionModel.cpp | 8 +- src/progs/demolition/Makefile.am | 4 +- src/progs/demolition/demolition.cpp | 3 +- src/progs/gtk/ControlInterface.cpp | 2 +- src/progs/gtk/DSSIController.cpp | 2 +- src/progs/gtk/DSSIController.h | 2 +- src/progs/gtk/LoadPluginWindow.cpp | 26 ++--- src/progs/gtk/LoadPluginWindow.h | 10 +- src/progs/gtk/NodeController.cpp | 23 ++-- src/progs/gtk/NodeController.h | 5 +- src/progs/gtk/NodePropertiesWindow.cpp | 2 +- src/progs/gtk/OmFlowCanvas.cpp | 5 +- src/progs/gtk/PatchController.cpp | 47 ++++---- src/progs/gtk/PatchController.h | 8 +- src/progs/gtk/PortController.cpp | 4 +- src/progs/gtk/PortController.h | 2 +- src/progs/gtk/Store.cpp | 156 +++++++++++++++++-------- src/progs/gtk/Store.h | 26 +++-- src/progs/patch_loader/Makefile.am | 4 +- 29 files changed, 291 insertions(+), 181 deletions(-) (limited to 'src') diff --git a/src/common/util/CountedPtr.h b/src/common/util/CountedPtr.h index f2079c7c..5c2a48f0 100644 --- a/src/common/util/CountedPtr.h +++ b/src/common/util/CountedPtr.h @@ -52,6 +52,14 @@ public: _counter = new Counter(p); } + /** Make a NULL CountedPtr. + * It would be best if this didn't exist, but it makes these storable + * in STL containers :/ + */ + CountedPtr() + : _counter(NULL) + {} + ~CountedPtr() { release(); @@ -61,9 +69,10 @@ public: CountedPtr(const CountedPtr& copy) : _counter(NULL) { - assert(copy); assert(this != ©); - retain(copy._counter); + + if (copy) + retain(copy._counter); } /** Copy a CountedPtr to a valid base class. @@ -76,7 +85,11 @@ public: // Fail if this is not a valid cast if (y) { - T* const unused_variable = static_cast(y._counter->ptr); +#ifdef WITH_RTTI + T* const unused_variable = dynamic_cast(y._counter->ptr); +#else + T* const unused_variable = static_cast(y._counter->ptr); +#endif assert(unused_variable == y._counter->ptr); // shuts up gcc } diff --git a/src/libs/client/Makefile.am b/src/libs/client/Makefile.am index ada22522..4378d789 100644 --- a/src/libs/client/Makefile.am +++ b/src/libs/client/Makefile.am @@ -3,7 +3,7 @@ AM_CXXFLAGS = -I$(top_srcdir)/src/common -fno-exceptions -fno-rtti if BUILD_CLIENT_LIB noinst_LTLIBRARIES = libomclient.la -libomclient_la_CXXFLAGS = -I$(top_srcdir)/src/common -DPKGDATADIR=\"$(pkgdatadir)\" $(LIBGLADEMM_CFLAGS) $(GNOMECANVASMM_CFLAGS) $(JACK_CFLAGS) $(LXML2_CFLAGS) +libomclient_la_CXXFLAGS = -I$(top_srcdir)/src/common -DPKGDATADIR=\"$(pkgdatadir)\" $(LXML2_CFLAGS) $(LSIGCPP_CFLAGS) libomclient_la_SOURCES = \ ClientInterface.h \ diff --git a/src/libs/client/ModelClientInterface.cpp b/src/libs/client/ModelClientInterface.cpp index 46754161..33f2cb2f 100644 --- a/src/libs/client/ModelClientInterface.cpp +++ b/src/libs/client/ModelClientInterface.cpp @@ -77,8 +77,8 @@ void ModelClientInterface::new_patch(const string& path, uint32_t poly) { PatchModel* pm = new PatchModel(path, poly); - PluginModel* pi = new PluginModel(PluginModel::Patch); - pm->plugin(pi); + //PluginModel* pi = new PluginModel(PluginModel::Patch); + //pm->plugin(pi); new_patch_model(pm); } @@ -95,8 +95,7 @@ ModelClientInterface::new_node(const string& plugin_type, PluginModel* plugin = new PluginModel(plugin_type, plugin_uri); - NodeModel* nm = new NodeModel(node_path); - nm->plugin(plugin); + NodeModel* nm = new NodeModel(plugin, node_path); new_node_model(nm); } diff --git a/src/libs/client/NodeModel.cpp b/src/libs/client/NodeModel.cpp index efdae494..3e060401 100644 --- a/src/libs/client/NodeModel.cpp +++ b/src/libs/client/NodeModel.cpp @@ -21,6 +21,15 @@ namespace LibOmClient { +NodeModel::NodeModel(CountedPtr plugin, const Path& path) +: ObjectModel(path), + m_polyphonic(false), + m_plugin(plugin), + m_x(0.0f), + m_y(0.0f) +{ +} + NodeModel::NodeModel(const Path& path) : ObjectModel(path), m_polyphonic(false), @@ -30,10 +39,11 @@ NodeModel::NodeModel(const Path& path) { } + NodeModel::~NodeModel() { - for (PortModelList::iterator i = m_ports.begin(); i != m_ports.end(); ++i) - delete(*i); + /*for (PortModelList::iterator i = m_ports.begin(); i != m_ports.end(); ++i) + delete(*i);*/ } @@ -52,8 +62,8 @@ NodeModel::remove_port(const string& port_path) void NodeModel::clear() { - for (PortModelList::iterator i = m_ports.begin(); i != m_ports.end(); ++i) - delete (*i); + /*for (PortModelList::iterator i = m_ports.begin(); i != m_ports.end(); ++i) + delete (*i);*/ m_ports.clear(); @@ -77,20 +87,22 @@ NodeModel::set_path(const Path& p) void -NodeModel::add_port(PortModel* pm) +NodeModel::add_port(CountedPtr pm) { assert(pm->name() != ""); assert(pm->path().length() > m_path.length()); assert(pm->path().substr(0, m_path.length()) == m_path); assert(pm->parent() == NULL); - assert(get_port(pm->name()) == NULL); + assert(!get_port(pm->name())); m_ports.push_back(pm); pm->set_parent(this); + + new_port_sig.emit(pm); } -PortModel* +CountedPtr NodeModel::get_port(const string& port_name) { assert(port_name.find("/") == string::npos); diff --git a/src/libs/client/NodeModel.h b/src/libs/client/NodeModel.h index af4171ed..05df5ed5 100644 --- a/src/libs/client/NodeModel.h +++ b/src/libs/client/NodeModel.h @@ -21,9 +21,12 @@ #include #include #include +#include #include "ObjectModel.h" #include "PortModel.h" #include "util/Path.h" +#include "util/CountedPtr.h" +#include "PluginModel.h" using std::string; using std::map; using std::find; using std::cout; using std::cerr; using std::endl; @@ -41,11 +44,11 @@ class PluginModel; class NodeModel : public ObjectModel { public: - NodeModel(const Path& node_path); + NodeModel(CountedPtr plugin, const Path& path); virtual ~NodeModel(); - PortModel* get_port(const string& port_name); - void add_port(PortModel* pm); + CountedPtr get_port(const string& port_name); + void add_port(CountedPtr pm); void remove_port(const string& port_path); virtual void clear(); @@ -54,8 +57,8 @@ public: void add_program(int bank, int program, const string& name); void remove_program(int bank, int program); - const PluginModel* plugin() const { return m_plugin; } - void plugin(const PluginModel* const pi) { m_plugin = pi; } + CountedPtr plugin() const { return m_plugin; } + //void plugin(CountedPtr p) { m_plugin = p; } virtual void set_path(const Path& p); @@ -70,10 +73,15 @@ public: PatchModel* parent_patch() const { return (PatchModel*)m_parent; } + // Signals + sigc::signal > new_port_sig; + protected: + NodeModel(const Path& path); + bool m_polyphonic; PortModelList m_ports; ///< List of ports (instead of map to preserve order) - const PluginModel* m_plugin; ///< The plugin this node is an instance of + CountedPtr m_plugin; ///< The plugin this node is an instance of float m_x; ///< Just metadata, here as an optimization for OmGtk float m_y; ///< Just metadata, here as an optimization for OmGtk map > m_banks; ///< DSSI banks @@ -85,7 +93,7 @@ private: }; -typedef map NodeModelMap; +typedef map > NodeModelMap; } // namespace LibOmClient diff --git a/src/libs/client/PatchLibrarian.cpp b/src/libs/client/PatchLibrarian.cpp index 65323435..5c8619f5 100644 --- a/src/libs/client/PatchLibrarian.cpp +++ b/src/libs/client/PatchLibrarian.cpp @@ -167,10 +167,10 @@ PatchLibrarian::save_patch(PatchModel* patch_model, const string& filename, bool // Save nodes and subpatches for (NodeModelMap::const_iterator i = patch_model->nodes().begin(); i != patch_model->nodes().end(); ++i) { - nm = i->second; + nm = i->second.get(); if (nm->plugin()->type() == PluginModel::Patch) { // Subpatch - spm = (PatchModel*)i->second; + spm = (PatchModel*)i->second.get(); xml_node = xmlNewChild(xml_root_node, NULL, (xmlChar*)"subpatch", NULL); xml_child_node = xmlNewChild(xml_node, NULL, (xmlChar*)"name", (xmlChar*)spm->name().c_str()); @@ -216,7 +216,7 @@ PatchLibrarian::save_patch(PatchModel* patch_model, const string& filename, bool xml_child_node = xmlNewChild(xml_node, NULL, (xmlChar*)"name", (xmlChar*)nm->name().c_str()); - if (nm->plugin() == NULL) break; + if (!nm->plugin()) break; xml_child_node = xmlNewChild(xml_node, NULL, (xmlChar*)"polyphonic", (xmlChar*)((nm->polyphonic()) ? "true" : "false")); @@ -255,10 +255,9 @@ PatchLibrarian::save_patch(PatchModel* patch_model, const string& filename, bool } } - PortModel* pm = NULL; // Write port metadata, if necessary - for (list::const_iterator i = nm->ports().begin(); i != nm->ports().end(); ++i) { - pm = (*i); + for (PortModelList::const_iterator i = nm->ports().begin(); i != nm->ports().end(); ++i) { + const PortModel* const pm = (*i).get(); if (pm->is_input() && pm->user_min() != pm->min_val() || pm->user_max() != pm->max_val()) { xml_child_node = xmlNewChild(xml_node, NULL, (xmlChar*)"port", NULL); xml_grandchild_node = xmlNewChild(xml_child_node, NULL, (xmlChar*)"name", @@ -299,9 +298,9 @@ PatchLibrarian::save_patch(PatchModel* patch_model, const string& filename, bool // Save node port controls for (NodeModelMap::const_iterator n = patch_model->nodes().begin(); n != patch_model->nodes().end(); ++n) { - nm = n->second; + nm = n->second.get(); for (PortModelList::const_iterator p = nm->ports().begin(); p != nm->ports().end(); ++p) { - pm = *p; + pm = (*p).get(); if (pm->is_input() && pm->is_control()) { float val = pm->value(); xml_node = xmlNewChild(xml_preset_node, NULL, (xmlChar*)"control", NULL); @@ -319,7 +318,7 @@ PatchLibrarian::save_patch(PatchModel* patch_model, const string& filename, bool // Save patch port controls for (PortModelList::const_iterator p = patch_model->ports().begin(); p != patch_model->ports().end(); ++p) { - pm = *p; + pm = (*p).get(); if (pm->is_input() && pm->is_control()) { float val = pm->value(); xml_node = xmlNewChild(xml_preset_node, NULL, (xmlChar*)"control", NULL); @@ -480,8 +479,7 @@ PatchLibrarian::load_patch(PatchModel* pm, bool wait, bool existing) if (nm != NULL) { m_osc_model_engine_interface->create_node_from_model(nm); m_osc_model_engine_interface->set_all_metadata(nm); - for (list::const_iterator j = nm->ports().begin(); - j != nm->ports().end(); ++j) { + for (PortModelList::const_iterator j = nm->ports().begin(); j != nm->ports().end(); ++j) { // FIXME: ew snprintf(temp_buf, temp_buf_length, "%f", (*j)->user_min()); m_osc_model_engine_interface->set_metadata((*j)->path(), "user-min", temp_buf); @@ -550,8 +548,8 @@ PatchLibrarian::load_patch(PatchModel* pm, bool wait, bool existing) NodeModel* PatchLibrarian::parse_node(const PatchModel* parent, xmlDocPtr doc, const xmlNodePtr node) { - NodeModel* nm = new NodeModel("/UNINITIALIZED"); // FIXME: ew PluginModel* plugin = new PluginModel(); + NodeModel* nm = new NodeModel(plugin, "/UNINITIALIZED"); // FIXME: ew xmlChar* key; xmlNodePtr cur = node->xmlChildrenNode; @@ -667,7 +665,7 @@ PatchLibrarian::parse_node(const PatchModel* parent, xmlDocPtr doc, const xmlNod delete nm; return NULL; } else { - nm->plugin(plugin); + //nm->plugin(plugin); return nm; } } diff --git a/src/libs/client/PatchModel.cpp b/src/libs/client/PatchModel.cpp index 829c9ca5..4257dd30 100644 --- a/src/libs/client/PatchModel.cpp +++ b/src/libs/client/PatchModel.cpp @@ -54,19 +54,21 @@ PatchModel::get_node(const string& name) { assert(name.find("/") == string::npos); NodeModelMap::iterator i = m_nodes.find(name); - return ((i != m_nodes.end()) ? (*i).second : NULL); + return ((i != m_nodes.end()) ? (*i).second.get() : NULL); } void -PatchModel::add_node(NodeModel* nm) +PatchModel::add_node(CountedPtr nm) { - assert(nm != NULL); + assert(nm); assert(nm->name().find("/") == string::npos); assert(nm->parent() == NULL); - m_nodes[nm->name()] = nm; + m_nodes[nm->name()] = CountedPtr(nm); nm->set_parent(this); + + new_node_sig.emit(nm); } @@ -76,7 +78,7 @@ PatchModel::remove_node(const string& name) assert(name.find("/") == string::npos); NodeModelMap::iterator i = m_nodes.find(name); if (i != m_nodes.end()) { - delete i->second; + //delete i->second; m_nodes.erase(i); return; } @@ -93,7 +95,7 @@ PatchModel::clear() for (NodeModelMap::iterator i = m_nodes.begin(); i != m_nodes.end(); ++i) { (*i).second->clear(); - delete (*i).second; + //delete (*i).second; } m_nodes.clear(); @@ -122,7 +124,7 @@ PatchModel::rename_node(const Path& old_path, const Path& new_path) NodeModel* nm = NULL; if (i != m_nodes.end()) { - nm = (*i).second; + nm = (*i).second.get(); for (list::iterator j = m_connections.begin(); j != m_connections.end(); ++j) { if ((*j)->src_port_path().parent() == old_path) (*j)->src_port_path(new_path.base_path() + (*j)->src_port_path().name()); @@ -172,9 +174,9 @@ PatchModel::add_connection(ConnectionModel* cm) } NodeModel* src_node = get_node(cm->src_port_path().parent().name()); - PortModel* src_port = (src_node == NULL) ? NULL : src_node->get_port(cm->src_port_path().name()); + PortModel* src_port = (src_node == NULL) ? NULL : src_node->get_port(cm->src_port_path().name()).get(); NodeModel* dst_node = get_node(cm->dst_port_path().parent().name()); - PortModel* dst_port = (dst_node == NULL) ? NULL : dst_node->get_port(cm->dst_port_path().name()); + PortModel* dst_port = (dst_node == NULL) ? NULL : dst_node->get_port(cm->dst_port_path().name()).get(); assert(src_port != NULL); assert(dst_port != NULL); diff --git a/src/libs/client/PatchModel.h b/src/libs/client/PatchModel.h index 12871933..15677c50 100644 --- a/src/libs/client/PatchModel.h +++ b/src/libs/client/PatchModel.h @@ -21,7 +21,9 @@ #include #include #include +#include #include "NodeModel.h" +#include "util/CountedPtr.h" using std::list; using std::string; using std::map; @@ -49,7 +51,7 @@ public: virtual void set_path(const Path& path); NodeModel* get_node(const string& node_name); - void add_node(NodeModel* nm); + void add_node(CountedPtr nm); void remove_node(const string& name); void rename_node(const Path& old_path, const Path& new_path); @@ -68,6 +70,9 @@ public: void enabled(bool b) { m_enabled = b; } bool polyphonic() const; + // Signals + sigc::signal > new_node_sig; + private: // Prevent copies (undefined) PatchModel(const PatchModel& copy); diff --git a/src/libs/client/PortModel.h b/src/libs/client/PortModel.h index 6d0895cf..9847bb1e 100644 --- a/src/libs/client/PortModel.h +++ b/src/libs/client/PortModel.h @@ -21,6 +21,7 @@ #include #include #include "ObjectModel.h" +#include "util/CountedPtr.h" using std::string; using std::list; namespace LibOmClient { @@ -110,7 +111,7 @@ private: bool m_connected; }; -typedef list PortModelList; +typedef list > PortModelList; } // namespace LibOmClient diff --git a/src/libs/client/ThreadedSigClientInterface.cpp b/src/libs/client/ThreadedSigClientInterface.cpp index 860d91f6..4af7d805 100644 --- a/src/libs/client/ThreadedSigClientInterface.cpp +++ b/src/libs/client/ThreadedSigClientInterface.cpp @@ -26,8 +26,6 @@ namespace LibOmClient { void ThreadedSigClientInterface::push_sig(Closure ev) { - cerr << "-- pushing event\n"; - bool success = false; bool first = true; @@ -58,7 +56,6 @@ ThreadedSigClientInterface::emit_signals() // thread indefinitely while processing continually arriving events size_t num_processed = 0; while (!_sigs.is_empty() && num_processed++ < _sigs.capacity()/2) { - cerr << "-- emitting event\n"; Closure& ev = _sigs.pop(); ev(); ev.disconnect(); diff --git a/src/progs/demolition/DemolitionModel.cpp b/src/progs/demolition/DemolitionModel.cpp index 786c08cd..b4faa533 100644 --- a/src/progs/demolition/DemolitionModel.cpp +++ b/src/progs/demolition/DemolitionModel.cpp @@ -64,7 +64,7 @@ DemolitionModel::random_node() if (i == pm->nodes().end()) return NULL; } - return (*i).second; + return (*i).second.get(); } } //cout << "***************************** Not returning node *********" << endl; @@ -89,7 +89,7 @@ DemolitionModel::random_node_in_patch(PatchModel* pm) if (i == pm->nodes().end()) return NULL; } - return (*i).second; + return (*i).second.get(); } @@ -108,7 +108,7 @@ DemolitionModel::random_port() for (PortModelList::iterator p = ports.begin(); p != ports.end(); ++p, ++i) if (i == index) - return (*p); + return (*p).get(); return NULL; // shouldn't happen } @@ -128,7 +128,7 @@ DemolitionModel::random_port_in_node(NodeModel* node) for (PortModelList::iterator p = ports.begin(); p != ports.end(); ++p, ++i) if (i == index) - return (*p); + return (*p).get(); return NULL; // shouldn't happen } diff --git a/src/progs/demolition/Makefile.am b/src/progs/demolition/Makefile.am index 64fb3315..07caff5b 100644 --- a/src/progs/demolition/Makefile.am +++ b/src/progs/demolition/Makefile.am @@ -1,7 +1,7 @@ EXTRA_DIST = README -om_demolition_CXXFLAGS = -I$(top_srcdir)/src/libs/client -I$(top_srcdir)/src/common -DPKGDATADIR=\"$(pkgdatadir)\" $(LXML2_CFLAGS) $(LOSC_CFLAGS) -om_demolition_LDADD = ../../libs/client/libomclient.la $(LOSC_LIBS) $(LXML2_LIBS) +om_demolition_CXXFLAGS = -I$(top_srcdir)/src/libs/client -I$(top_srcdir)/src/common -DPKGDATADIR=\"$(pkgdatadir)\" $(LXML2_CFLAGS) $(LOSC_CFLAGS) $(LSIGCPP_CFLAGS) +om_demolition_LDADD = ../../libs/client/libomclient.la $(LOSC_LIBS) $(LXML2_LIBS) $(LSIGCPP_LIBS) bin_PROGRAMS = om_demolition diff --git a/src/progs/demolition/demolition.cpp b/src/progs/demolition/demolition.cpp index 84a08c84..93a37414 100644 --- a/src/progs/demolition/demolition.cpp +++ b/src/progs/demolition/demolition.cpp @@ -223,8 +223,7 @@ add_node() PluginModel* plugin = model->random_plugin(); if (parent != NULL && plugin != NULL) { - NodeModel* nm = new NodeModel(parent->path() +"/"+ random_name()); - nm->plugin(plugin); + 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 om_gtk diff --git a/src/progs/gtk/ControlInterface.cpp b/src/progs/gtk/ControlInterface.cpp index f1fc44d9..eb5eee1b 100644 --- a/src/progs/gtk/ControlInterface.cpp +++ b/src/progs/gtk/ControlInterface.cpp @@ -45,7 +45,7 @@ void ControlInterface::new_plugin_model(PluginModel* pm) { cerr << "NEW PLUGIN\n"; - Store::instance().add_plugin(pm); + //Store::instance().add_plugin(pm); } diff --git a/src/progs/gtk/DSSIController.cpp b/src/progs/gtk/DSSIController.cpp index 570211c7..dedcbceb 100644 --- a/src/progs/gtk/DSSIController.cpp +++ b/src/progs/gtk/DSSIController.cpp @@ -27,7 +27,7 @@ namespace OmGtk { -DSSIController::DSSIController(NodeModel* model) +DSSIController::DSSIController(CountedPtr model) : NodeController(model), m_banks_dirty(true) { diff --git a/src/progs/gtk/DSSIController.h b/src/progs/gtk/DSSIController.h index 53f6fc8b..ca8da578 100644 --- a/src/progs/gtk/DSSIController.h +++ b/src/progs/gtk/DSSIController.h @@ -49,7 +49,7 @@ class DSSIModule; class DSSIController : public NodeController { public: - DSSIController(NodeModel* model); + DSSIController(CountedPtr model); virtual ~DSSIController() {} diff --git a/src/progs/gtk/LoadPluginWindow.cpp b/src/progs/gtk/LoadPluginWindow.cpp index b84ae39e..bd11320a 100644 --- a/src/progs/gtk/LoadPluginWindow.cpp +++ b/src/progs/gtk/LoadPluginWindow.cpp @@ -133,7 +133,7 @@ void LoadPluginWindow::on_show() { if (!m_has_shown) { - set_plugin_model(Store::instance().plugins()); + set_plugin_list(Store::instance().plugins()); // Center on patch window int m_w, m_h; @@ -161,12 +161,12 @@ LoadPluginWindow::on_hide() void -LoadPluginWindow::set_plugin_model(const std::map& m) +LoadPluginWindow::set_plugin_list(const std::map >& m) { m_plugins_liststore->clear(); - const PluginModel* plugin = NULL; - for (std::map::const_iterator i = m.begin(); i != m.end(); ++i) { + CountedPtr plugin = NULL; + for (std::map >::const_iterator i = m.begin(); i != m.end(); ++i) { plugin = (*i).second; Gtk::TreeModel::iterator iter = m_plugins_liststore->append(); @@ -186,7 +186,7 @@ LoadPluginWindow::set_plugin_model(const std::map& m void -LoadPluginWindow::add_plugin(const PluginModel* const plugin) +LoadPluginWindow::add_plugin(CountedPtr plugin) { Gtk::TreeModel::iterator iter = m_plugins_liststore->append(); Gtk::TreeModel::Row row = *iter; @@ -240,7 +240,7 @@ LoadPluginWindow::generate_module_name(int offset) if (iter) { Gtk::TreeModel::Row row = *iter; - const PluginModel* const plugin = row.get_value(m_plugins_columns.m_col_plugin_model); + CountedPtr plugin = row.get_value(m_plugins_columns.m_col_plugin_model); char num_buf[3]; for (uint i=0; i < 99; ++i) { name = plugin->plug_label(); @@ -270,7 +270,7 @@ LoadPluginWindow::add_clicked() if (iter) { // If anything is selected Gtk::TreeModel::Row row = *iter; - const PluginModel* const plugin = row.get_value(m_plugins_columns.m_col_plugin_model); + CountedPtr plugin = row.get_value(m_plugins_columns.m_col_plugin_model); string name = m_node_name_entry->get_text(); if (name == "") { name = generate_module_name(); @@ -283,8 +283,7 @@ LoadPluginWindow::add_clicked() dialog.run(); } else { const string path = m_patch_controller->model()->base_path() + name; - NodeModel* nm = new NodeModel(path); - nm->plugin(plugin); + NodeModel* nm = new NodeModel(plugin, path); nm->polyphonic(polyphonic); if (m_new_module_x == 0 && m_new_module_y == 0) { @@ -340,10 +339,11 @@ LoadPluginWindow::filter_changed() Gtk::TreeModel::iterator model_iter; size_t num_visible = 0; - const PluginModel* plugin = NULL; - for (std::map::const_iterator i = Store::instance().plugins().begin(); + + for (std::map >::const_iterator i = Store::instance().plugins().begin(); i != Store::instance().plugins().end(); ++i) { - plugin = (*i).second; + + const CountedPtr plugin = (*i).second; switch (criteria) { case CriteriaColumns::NAME: @@ -389,7 +389,7 @@ void LoadPluginWindow::clear_clicked() { m_search_entry->set_text(""); - set_plugin_model(Store::instance().plugins()); + set_plugin_list(Store::instance().plugins()); } bool diff --git a/src/progs/gtk/LoadPluginWindow.h b/src/progs/gtk/LoadPluginWindow.h index adf11ab4..4bf302c2 100644 --- a/src/progs/gtk/LoadPluginWindow.h +++ b/src/progs/gtk/LoadPluginWindow.h @@ -23,7 +23,7 @@ #include #include #include - +#include "util/CountedPtr.h" using LibOmClient::PluginModel; @@ -55,8 +55,8 @@ public: Gtk::TreeModelColumn m_col_uri; // Not displayed: - Gtk::TreeModelColumn m_col_label; - Gtk::TreeModelColumn m_col_plugin_model; + Gtk::TreeModelColumn m_col_label; + Gtk::TreeModelColumn > m_col_plugin_model; }; @@ -88,12 +88,12 @@ public: LoadPluginWindow(BaseObjectType* cobject, const Glib::RefPtr& xml); void patch_controller(PatchController* pc); - void set_plugin_model(const std::map& m); + void set_plugin_list(const std::map >& m); void set_next_module_location(int x, int y) { m_new_module_x = x; m_new_module_y = y; } - void add_plugin(const PluginModel* info); + void add_plugin(CountedPtr plugin); bool has_shown() const { return m_has_shown; } protected: diff --git a/src/progs/gtk/NodeController.cpp b/src/progs/gtk/NodeController.cpp index ae3e5a9e..63994c00 100644 --- a/src/progs/gtk/NodeController.cpp +++ b/src/progs/gtk/NodeController.cpp @@ -46,11 +46,11 @@ NodeController::NodeController(CountedPtr model) m_properties_window(NULL), m_bridge_port(NULL) { - assert(model->controller() == NULL); + assert(!model->controller()); model->set_controller(this); // Create port controllers - cerr << "FIXME: node" << endl; + cerr << "FIXME: NodeController()" << endl; /* for (list::const_iterator i = node_model()->ports().begin(); i != node_model()->ports().end(); ++i) { @@ -90,6 +90,8 @@ NodeController::NodeController(CountedPtr model) sigc::mem_fun(this, &NodeController::on_menu_learn))); } */ + + model->new_port_sig.connect(sigc::mem_fun(this, &NodeController::add_port)); } @@ -104,10 +106,13 @@ NodeController::create_module(OmFlowCanvas* canvas) //cerr << "Creating node module " << m_model->path() << endl; // If this is a DSSI plugin, DSSIController should be doing this + /*assert(node_model()->plugin()); assert(node_model()->plugin()->type() != PluginModel::DSSI); assert(canvas != NULL); - assert(m_module == NULL); + assert(m_module == NULL);*/ + assert(canvas); + assert(node_model()); m_module = new OmModule(canvas, this); create_all_ports(); @@ -184,7 +189,8 @@ NodeController::destroy() assert(pc != NULL); //remove_from_store(); - pc->remove_node(m_model->path().name()); + //pc->remove_node(m_model->path().name()); + cerr << "FIXME: remove node\n"; if (m_bridge_port != NULL) m_bridge_port->destroy(); @@ -219,7 +225,7 @@ NodeController::metadata_update(const string& key, const string& value) void -NodeController::add_port(PortModel* pm) +NodeController::add_port(CountedPtr pm) { assert(pm->parent() == NULL); @@ -317,8 +323,7 @@ NodeController::on_menu_clone() clone_name = clone_name + clone_postfix; const string path = node_model()->parent_patch()->base_path() + clone_name; - NodeModel* nm = new NodeModel(path); - nm->plugin(node_model()->plugin()); + NodeModel* nm = new NodeModel(node_model()->plugin(), path); nm->polyphonic(node_model()->polyphonic()); nm->x(node_model()->x() + 20); nm->y(node_model()->y() + 20); @@ -369,7 +374,9 @@ NodeController::create_all_ports() for (PortModelList::const_iterator i = node_model()->ports().begin(); i != node_model()->ports().end(); ++i) { pc = dynamic_cast((*i)->controller()); - assert(pc != NULL); + // FIXME: leak + if (pc == NULL) + pc = new PortController(*i); pc->create_port(m_module); } diff --git a/src/progs/gtk/NodeController.h b/src/progs/gtk/NodeController.h index 7d732d2f..2199a9d5 100644 --- a/src/progs/gtk/NodeController.h +++ b/src/progs/gtk/NodeController.h @@ -64,7 +64,6 @@ public: void set_path(const Path& new_path); - virtual void add_port(PortModel* pm); virtual void remove_port(const Path& path, bool resize_module) {} virtual void program_add(int bank, int program, const string& name) {} @@ -75,7 +74,7 @@ public: void bridge_port(PortController* port) { m_bridge_port = port; } PortController* as_port() { return m_bridge_port; } - CountedPtr node_model() { return CountedPtr((NodeModel*)m_model.get()); } + CountedPtr node_model() { return m_model; } NodeControlWindow* control_window() { return m_control_window; } void control_window(NodeControlWindow* cw) { m_control_window = cw; } @@ -93,6 +92,8 @@ public: virtual void disable_controls_menuitem(); protected: + virtual void add_port(CountedPtr pm); + void create_all_ports(); void on_menu_destroy(); diff --git a/src/progs/gtk/NodePropertiesWindow.cpp b/src/progs/gtk/NodePropertiesWindow.cpp index 000fa6ac..b0028864 100644 --- a/src/progs/gtk/NodePropertiesWindow.cpp +++ b/src/progs/gtk/NodePropertiesWindow.cpp @@ -51,7 +51,7 @@ NodePropertiesWindow::set_node(CountedPtr node_model) m_node_path_label->set_text(node_model->path()); m_node_polyphonic_toggle->set_active(node_model->polyphonic()); - const PluginModel* const pm = node_model->plugin(); + CountedPtr pm = node_model->plugin(); m_plugin_type_label->set_text(pm->type_string()); m_plugin_uri_label->set_text(pm->uri()); diff --git a/src/progs/gtk/OmFlowCanvas.cpp b/src/progs/gtk/OmFlowCanvas.cpp index a7e41ea2..cac5b87d 100644 --- a/src/progs/gtk/OmFlowCanvas.cpp +++ b/src/progs/gtk/OmFlowCanvas.cpp @@ -64,10 +64,9 @@ OmFlowCanvas::connect(const Port* src_port, const Port* dst_port) dst->model()->type() == PortModel::CONTROL) { // FIXME: leaks? - NodeModel* nm = new NodeModel(m_patch_controller->model()->base_path() - + src->name() + "-" + dst->name()); PluginModel* pm = new PluginModel(PluginModel::Internal, "", "midi_control_in", ""); - nm->plugin(pm); + NodeModel* nm = new NodeModel(pm, m_patch_controller->model()->base_path() + + src->name() + "-" + dst->name()); nm->x(dst->module()->property_x() - dst->module()->width() - 20); nm->y(dst->module()->property_y()); Controller::instance().create_node_from_model(nm); diff --git a/src/progs/gtk/PatchController.cpp b/src/progs/gtk/PatchController.cpp index cbdf1472..90ffe005 100644 --- a/src/progs/gtk/PatchController.cpp +++ b/src/progs/gtk/PatchController.cpp @@ -70,6 +70,8 @@ PatchController::PatchController(CountedPtr model) else cerr << "[PatchController] " << path() << " ERROR: Parent not found." << endl; }*/ + + model->new_node_sig.connect(sigc::mem_fun(this, &PatchController::add_node)); } @@ -194,7 +196,7 @@ PatchController::set_path(const Path& new_path) // Rename nodes for (NodeModelMap::const_iterator i = patch_model()->nodes().begin(); i != patch_model()->nodes().end(); ++i) { - const NodeModel* const nm = (*i).second; + const NodeModel* const nm = (*i).second.get(); assert(nm != NULL); NodeController* const nc = ((NodeController*)nm->controller()); assert(nc != NULL); @@ -203,7 +205,7 @@ PatchController::set_path(const Path& new_path) #ifdef DEBUG // Be sure ports were renamed by their bridge nodes - for (list::const_iterator i = node_model()->ports().begin(); + for (PortModelList::const_iterator i = node_model()->ports().begin(); i != node_model()->ports().end(); ++i) { GtkObjectController* const pc = (GtkObjectController*)((*i)->controller()); assert(pc != NULL); @@ -308,7 +310,7 @@ PatchController::create_view() for (NodeModelMap::const_iterator i = patch_model()->nodes().begin(); i != patch_model()->nodes().end(); ++i) { - NodeModel* const nm = (*i).second; + NodeModel* const nm = (*i).second.get(); string val = nm->get_metadata("module-x"); if (val != "") @@ -326,7 +328,9 @@ PatchController::create_view() } NodeController* nc = ((NodeController*)nm->controller()); - assert(nc != NULL); + if (!nc) + nc = new NodeController(nm); // this should set nm->controller() + if (nc->module() == NULL); nc->create_module(m_patch_view->canvas()); assert(nc->module() != NULL); @@ -409,16 +413,19 @@ PatchController::add_subpatch(PatchController* patch) void -PatchController::add_node(NodeModel* nm) +PatchController::add_node(CountedPtr nm) { - assert(nm != NULL); - assert(nm->parent() == NULL); - assert(nm->path().parent() == m_model->path()); + cerr << "ADD NODE\n"; + + assert(nm); + assert(nm->parent() == m_patch_model.get()); + assert(nm->path().parent() == m_patch_model->path()); - if (patch_model()->get_node(nm->name()) != NULL) { + /*if (patch_model()->get_node(nm->name()) != NULL) { + cerr << "Ignoring existing\n"; // Node already exists, ignore - delete nm; - } else { + //delete nm; + } else {*/ // FIXME: Should PatchController really be responsible for creating these? NodeController* nc = NULL; @@ -431,8 +438,8 @@ PatchController::add_node(NodeModel* nm) assert(nm->controller() == nc); // Check if this is a bridge node - PortModel* const pm = patch_model()->get_port(nm->path().name()); - if (pm != NULL) { + CountedPtr pm = patch_model()->get_port(nm->path().name()); + if (pm) { cerr << "Bridge node." << endl; PortController* pc = ((PortController*)pm->controller()); assert(pc != NULL); @@ -440,10 +447,9 @@ PatchController::add_node(NodeModel* nm) } //nc->add_to_store(); - patch_model()->add_node(nm); + //patch_model()->add_node(nm); if (m_patch_view != NULL) { - int x, y; get_new_module_location(x, y); nm->x(x); @@ -465,7 +471,7 @@ PatchController::add_node(NodeModel* nm) m_patch_view->canvas()->zoom(old_zoom); nc->module()->zoom(old_zoom); } - } + // } } } @@ -496,17 +502,16 @@ PatchController::remove_node(const string& name) * exist. */ void -PatchController::add_port(PortModel* pm) +PatchController::add_port(CountedPtr pm) { - assert(pm != NULL); + assert(pm); assert(pm->parent() == NULL); //cerr << "[PatchController] Adding port " << pm->path() << endl; - if (patch_model()->get_port(pm->name()) != NULL) { + if (patch_model()->get_port(pm->name())) { cerr << "[PatchController] Ignoring duplicate port " << pm->path() << endl; - delete pm; return; } @@ -561,7 +566,7 @@ PatchController::remove_port(const Path& path, bool resize_module) } patch_model()->remove_port(path); - assert(patch_model()->get_port(path.name()) == NULL); + assert(patch_model()->get_port(path.name())); // Disable "Controls" menuitem on module and patch window, if necessary if (!has_control_inputs()) diff --git a/src/progs/gtk/PatchController.h b/src/progs/gtk/PatchController.h index d9491571..553a35e1 100644 --- a/src/progs/gtk/PatchController.h +++ b/src/progs/gtk/PatchController.h @@ -71,10 +71,7 @@ public: virtual void metadata_update(const string& key, const string& value); - void add_node(NodeModel* nm); - void remove_node(const string& name); - - virtual void add_port(PortModel* pm); + virtual void add_port(CountedPtr pm); virtual void remove_port(const Path& path, bool resize_module); void connection(ConnectionModel* const cm); @@ -111,6 +108,9 @@ public: void disable_controls_menuitem(); private: + void add_node(CountedPtr nm); + void remove_node(const string& name); + void create_connection(const ConnectionModel* cm); PatchWindow* m_window; ///< Window currently showing this patch diff --git a/src/progs/gtk/PortController.cpp b/src/progs/gtk/PortController.cpp index 1e840583..eaad6efe 100644 --- a/src/progs/gtk/PortController.cpp +++ b/src/progs/gtk/PortController.cpp @@ -24,12 +24,12 @@ namespace OmGtk { -PortController::PortController(PortModel* model) +PortController::PortController(CountedPtr model) : GtkObjectController(model), m_port(NULL), m_control_panel(NULL) { - assert(model != NULL); + assert(model); assert(model->parent() != NULL); assert(model->controller() == NULL); diff --git a/src/progs/gtk/PortController.h b/src/progs/gtk/PortController.h index 6172025f..ee4dc41f 100644 --- a/src/progs/gtk/PortController.h +++ b/src/progs/gtk/PortController.h @@ -44,7 +44,7 @@ class OmModule; class PortController : public GtkObjectController { public: - PortController(PortModel* model); + PortController(CountedPtr model); virtual ~PortController() {} virtual void destroy(); diff --git a/src/progs/gtk/Store.cpp b/src/progs/gtk/Store.cpp index c68bdc75..8f74e3c7 100644 --- a/src/progs/gtk/Store.cpp +++ b/src/progs/gtk/Store.cpp @@ -37,7 +37,7 @@ Store::Store(SigClientInterface& emitter) void -Store::add_object(ObjectModel* object) +Store::add_object(CountedPtr object) { assert(object->path() != ""); assert(m_objects.find(object->path()) == m_objects.end()); @@ -48,32 +48,41 @@ Store::add_object(ObjectModel* object) } -void -Store::remove_object(ObjectModel* object) +CountedPtr +Store::remove_object(const string& path) { - if (!object) - return; - - map::iterator i - = m_objects.find(object->path()); + map >::iterator i = m_objects.find(path); if (i != m_objects.end()) { - assert((*i).second == object); + assert((*i).second->path() == path); + CountedPtr result = (*i).second; m_objects.erase(i); + cout << "[Store] Removed " << path << endl; + return result; } else { - cerr << "[App] Unable to find object " << object->path() - << " to remove." << endl; + cerr << "[Store] Unable to find object " << path << " to remove." << endl; + return NULL; } - - cout << "[Store] Removed " << object->path() << endl; +} + + +CountedPtr +Store::plugin(const string& uri) +{ + assert(uri.length() > 0); + map >::iterator i = m_plugins.find(uri); + if (i == m_plugins.end()) + return NULL; + else + return (*i).second; } CountedPtr -Store::object(const string& path) const +Store::object(const string& path) { assert(path.length() > 0); - map::const_iterator i = m_objects.find(path); + map >::iterator i = m_objects.find(path); if (i == m_objects.end()) return NULL; else @@ -82,41 +91,43 @@ Store::object(const string& path) const CountedPtr -Store::patch(const string& path) const +Store::patch(const string& path) { assert(path.length() > 0); - map::const_iterator i = m_objects.find(path); + map >::iterator i = m_objects.find(path); if (i == m_objects.end()) return NULL; else - return dynamic_cast((*i).second); + //return dynamic_cast((*i).second.get()); + return (CountedPtr)(*i).second; // FIXME } CountedPtr -Store::node(const string& path) const +Store::node(const string& path) { assert(path.length() > 0); - map::const_iterator i = m_objects.find(path); + map >::iterator i = m_objects.find(path); if (i == m_objects.end()) return NULL; else - return dynamic_cast((*i).second); + return (*i).second; } CountedPtr -Store::port(const string& path) const +Store::port(const string& path) { assert(path.length() > 0); - map::const_iterator i = m_objects.find(path); + map >::iterator i = m_objects.find(path); if (i == m_objects.end()) { return NULL; } else { // Normal port - PortModel* const pc = dynamic_cast((*i).second); + /*PortModel* const pc = dynamic_cast((*i).second); if (pc) - return pc; + return pc;*/ + return (*i).second; // Patch port (corresponding Node is in store) // FIXME @@ -133,14 +144,13 @@ Store::port(const string& path) const void -Store::add_plugin(const PluginModel* pm) +Store::add_plugin(CountedPtr pm) { if (m_plugins.find(pm->uri()) != m_plugins.end()) { - cerr << "DUPE! " << pm->uri() << endl; - delete m_plugins[pm->uri()]; + cerr << "DUPE PLUGIN: " << pm->uri() << endl; + } else { + m_plugins[pm->uri()] = pm; } - - m_plugins[pm->uri()] = pm; } @@ -151,7 +161,8 @@ Store::add_plugin(const PluginModel* pm) void Store::destruction_event(const string& path) { - remove_object(object(path).get()); + remove_object(path); + // FIXME: emit signals } void @@ -166,19 +177,41 @@ Store::new_plugin_event(const string& type, const string& uri, const string& nam void Store::new_patch_event(const string& path, uint32_t poly) { - PatchModel* const p = new PatchModel(path, poly); - add_object(p); + // FIXME: What to do with a conflict? + + if (m_objects.find(path) == m_objects.end()) { + PatchModel* const p = new PatchModel(path, poly); + add_object(p); + } } + void Store::new_node_event(const string& plugin_type, const string& plugin_uri, const string& node_path, bool is_polyphonic, uint32_t num_ports) { + // FIXME: What to do with a conflict? // FIXME: resolve plugin here - NodeModel* const n = new NodeModel(node_path); - n->polyphonic(is_polyphonic); - // FIXME: num_ports unused - add_object(n); + + if (m_objects.find(node_path) == m_objects.end()) { + + CountedPtr plug = plugin(plugin_uri); + assert(plug); + + CountedPtr n(new NodeModel(plug, node_path)); + n->polyphonic(is_polyphonic); + // FIXME: num_ports unused + add_object(n); + + std::map >::iterator pi = m_objects.find(n->path().parent()); + if (pi != m_objects.end()) { + PatchModel* parent = dynamic_cast((*pi).second.get()); + if (parent) + parent->add_node(n); + else + cerr << "ERROR: new node with no parent" << endl; + } + } } @@ -186,18 +219,43 @@ void Store::new_port_event(const string& path, const string& type, bool is_output) { // FIXME: this sucks - - PortModel::Type ptype = PortModel::CONTROL; - if (type == "AUDIO") ptype = PortModel::AUDIO; - else if (type == "CONTROL") ptype = PortModel::CONTROL; - else if (type== "MIDI") ptype = PortModel::MIDI; - else cerr << "[OSCListener] WARNING: Unknown port type received (" << type << ")" << endl; - - PortModel::Direction pdir = is_output ? PortModel::OUTPUT : PortModel::INPUT; - - PortModel* const p = new PortModel(path, ptype, pdir); - add_object(p); - + /* + if (m_objects.find(path) == m_objects.end()) { + PortModel::Type ptype = PortModel::CONTROL; + if (type == "AUDIO") ptype = PortModel::AUDIO; + else if (type == "CONTROL") ptype = PortModel::CONTROL; + else if (type== "MIDI") ptype = PortModel::MIDI; + else cerr << "[OSCListener] WARNING: Unknown port type received (" << type << ")" << endl; + + PortModel::Direction pdir = is_output ? PortModel::OUTPUT : PortModel::INPUT; + + PortModel* const p = new PortModel(path, ptype, pdir); + + add_object(p); + } else + */ + if (m_objects.find(path) == m_objects.end()) { + + PortModel::Type ptype = PortModel::CONTROL; + if (type == "AUDIO") ptype = PortModel::AUDIO; + else if (type == "CONTROL") ptype = PortModel::CONTROL; + else if (type== "MIDI") ptype = PortModel::MIDI; + else cerr << "[OSCListener] WARNING: Unknown port type received (" << type << ")" << endl; + + PortModel::Direction pdir = is_output ? PortModel::OUTPUT : PortModel::INPUT; + + CountedPtr p(new PortModel(path, ptype, pdir)); + add_object(p); + + std::map >::iterator pi = m_objects.find(p->path().parent()); + if (pi != m_objects.end()) { + NodeModel* parent = dynamic_cast((*pi).second.get()); + if (parent) + parent->add_port(p); + else + cerr << "ERROR: new port with no parent" << endl; + } + } } diff --git a/src/progs/gtk/Store.h b/src/progs/gtk/Store.h index d3bcbf94..c3e465c0 100644 --- a/src/progs/gtk/Store.h +++ b/src/progs/gtk/Store.h @@ -17,6 +17,9 @@ #ifndef STORE_H #define STORE_H +// FIXME: for CountedPtr +#define WITH_RTTI + #include #include #include @@ -43,15 +46,16 @@ namespace OmGtk { */ class Store { public: - CountedPtr object(const string& path) const; - CountedPtr patch(const string& path) const; - CountedPtr node(const string& path) const; - CountedPtr port(const string& path) const; + CountedPtr plugin(const string& uri); + CountedPtr object(const string& path); + CountedPtr patch(const string& path); + CountedPtr node(const string& path); + CountedPtr port(const string& path); size_t num_objects() { return m_objects.size(); } - void add_plugin(const PluginModel* pm); - const map& plugins() const { return m_plugins; } + + const map >& plugins() const { return m_plugins; } static void instantiate(SigClientInterface& emitter) { if (!_instance) _instance = new Store(emitter); } @@ -63,8 +67,10 @@ private: static Store* _instance; - void add_object(ObjectModel* object); - void remove_object(ObjectModel* object); + void add_object(CountedPtr object); + CountedPtr remove_object(const string& path); + + void add_plugin(CountedPtr plugin); // Slots for SigClientInterface signals void destruction_event(const string& path); @@ -73,8 +79,8 @@ private: void new_node_event(const string& plugin_type, const string& plugin_uri, const string& node_path, bool is_polyphonic, uint32_t num_ports); void new_port_event(const string& path, const string& data_type, bool is_output); - map m_objects; ///< Keyed by Om path - map m_plugins; ///< Keyed by URI + map > m_objects; ///< Keyed by Om path + map > m_plugins; ///< Keyed by URI }; diff --git a/src/progs/patch_loader/Makefile.am b/src/progs/patch_loader/Makefile.am index 1dddefbb..c14814ff 100644 --- a/src/progs/patch_loader/Makefile.am +++ b/src/progs/patch_loader/Makefile.am @@ -1,7 +1,7 @@ EXTRA_DIST = README -om_patch_loader_CXXFLAGS = -I$(top_srcdir)/src/libs/client -I$(top_srcdir)/src/common -DPKGDATADIR=\"$(pkgdatadir)\" $(LXML2_CFLAGS) $(LOSC_CFLAGS) -om_patch_loader_LDADD = ../../libs/client/libomclient.la $(LOSC_LIBS) $(LXML2_LIBS) +om_patch_loader_CXXFLAGS = -I$(top_srcdir)/src/libs/client -I$(top_srcdir)/src/common -DPKGDATADIR=\"$(pkgdatadir)\" $(LXML2_CFLAGS) $(LOSC_CFLAGS) $(LSIGCPP_CFLAGS) +om_patch_loader_LDADD = ../../libs/client/libomclient.la $(LOSC_LIBS) $(LXML2_LIBS) $(LSIGCPP_LIBS) bin_PROGRAMS = om_patch_loader -- cgit v1.2.1