diff options
author | David Robillard <d@drobilla.net> | 2006-09-09 14:24:56 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2006-09-09 14:24:56 +0000 |
commit | fca95e5d454d37bd74b98f5bce35cfcbaee86c3f (patch) | |
tree | 97fcf6e8afaf4356d46a24236e9aa2451ab55698 /src/progs/ingenuity | |
parent | b853b3dde1f7028dd275f78433a6ad9b5b9f61c7 (diff) | |
download | ingen-fca95e5d454d37bd74b98f5bce35cfcbaee86c3f.tar.gz ingen-fca95e5d454d37bd74b98f5bce35cfcbaee86c3f.tar.bz2 ingen-fca95e5d454d37bd74b98f5bce35cfcbaee86c3f.zip |
Drove 'er home! Working monolothic Ingenuity (ie. in-process engine).
Countless bugfixes.
git-svn-id: http://svn.drobilla.net/lad/ingen@123 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/progs/ingenuity')
29 files changed, 295 insertions, 488 deletions
diff --git a/src/progs/ingenuity/App.cpp b/src/progs/ingenuity/App.cpp index 1a7d7760..ecf94a92 100644 --- a/src/progs/ingenuity/App.cpp +++ b/src/progs/ingenuity/App.cpp @@ -35,7 +35,6 @@ #include "PatchWindow.h" #include "MessagesWindow.h" #include "ConfigWindow.h" -#include "Controller.h" #include "GladeFactory.h" #include "util/Path.h" #include "ObjectModel.h" @@ -44,6 +43,7 @@ #include "Configuration.h" #include "ConnectWindow.h" #include "Store.h" +#include "Loader.h" #ifdef HAVE_LASH #include "LashController.h" #endif @@ -61,9 +61,9 @@ class OmPort; App* App::_instance = 0; -App::App(CountedPtr<SigClientInterface> listener) -: _listener(listener), - _store(new Store(listener)), +App::App() +: _store(NULL), + _loader(NULL), _configuration(new Configuration()), _about_dialog(NULL), _enable_signal(true) @@ -71,16 +71,13 @@ App::App(CountedPtr<SigClientInterface> listener) Glib::RefPtr<Gnome::Glade::Xml> glade_xml = GladeFactory::new_glade_reference(); glade_xml->get_widget_derived("connect_win", _connect_window); - //glade_xml->get_widget_derived("new_patch_win", _new_patch_window); - //glade_xml->get_widget_derived("load_patch_win", _load_patch_window); - glade_xml->get_widget_derived("config_win", _config_window); + glade_xml->get_widget_derived("messages_win", _messages_window); glade_xml->get_widget_derived("patch_tree_win", _patch_tree_window); -// glade_xml->get_widget_derived("main_patches_treeview", _objects_treeview); + glade_xml->get_widget_derived("config_win", _config_window); glade_xml->get_widget("about_win", _about_dialog); + _config_window->configuration(_configuration); - - glade_xml->get_widget_derived("messages_win", _messages_window); } @@ -89,12 +86,28 @@ App::~App() } void -App::instantiate(CountedPtr<SigClientInterface>& listener) +App::instantiate() { if (!_instance) - _instance = new App(listener); + _instance = new App(); } + +void +App::attach(CountedPtr<ModelEngineInterface>& engine, CountedPtr<SigClientInterface>& client) +{ + assert( ! _engine); + assert( ! _client); + assert( ! _store); + assert( ! _loader); + + _engine = engine; + _client = client; + _store = new Store(client); + _loader = new Loader(engine); +} + + void App::error_message(const string& str) { diff --git a/src/progs/ingenuity/App.h b/src/progs/ingenuity/App.h index 2d56e445..06d52ca3 100644 --- a/src/progs/ingenuity/App.h +++ b/src/progs/ingenuity/App.h @@ -34,6 +34,7 @@ namespace Ingen { namespace Client { class PluginModel; class Store; class SigClientInterface; + class ModelEngineInterface; } } using namespace Ingen::Client; @@ -59,6 +60,7 @@ class PatchTreeView; class PatchTreeWindow; class ConnectWindow; class Configuration; +class Loader; /** Singleton master class most everything is contained within. @@ -81,7 +83,9 @@ public: void add_patch_window(PatchWindow* pw); void remove_patch_window(PatchWindow* pw); - int num_open_patch_windows(); + int num_open_patch_windows(); + + void attach(CountedPtr<ModelEngineInterface>& engine, CountedPtr<SigClientInterface>& client); ConnectWindow* connect_window() const { return _connect_window; } Gtk::Dialog* about_dialog() const { return _about_dialog; } @@ -90,22 +94,23 @@ public: PatchTreeWindow* patch_tree() const { return _patch_tree_window; } Configuration* configuration() const { return _configuration; } Store* store() const { return _store; } + Loader* loader() const { return _loader; } - const CountedPtr<SigClientInterface>& client() const { return _listener; } - - static void instantiate(CountedPtr<SigClientInterface>& listener); + const CountedPtr<ModelEngineInterface>& engine() const { return _engine; } + const CountedPtr<SigClientInterface>& client() const { return _client; } static inline App& instance() { assert(_instance); return *_instance; } + static void instantiate(); protected: - App(CountedPtr<SigClientInterface> listener); + App(); static App* _instance; - //bool connect_callback(); - //bool idle_callback(); - - CountedPtr<SigClientInterface> _listener; - Store* _store; + CountedPtr<ModelEngineInterface> _engine; + CountedPtr<SigClientInterface> _client; + + Store* _store; + Loader* _loader; Configuration* _configuration; @@ -116,7 +121,6 @@ protected: PatchTreeWindow* _patch_tree_window; ConfigWindow* _config_window; Gtk::Dialog* _about_dialog; - Gtk::Button* _engine_error_close_button; /** Used to avoid feedback loops with (eg) process checkbutton * FIXME: Maybe this should be globally implemented at the Controller level, diff --git a/src/progs/ingenuity/Configuration.cpp b/src/progs/ingenuity/Configuration.cpp index 4cb473cb..e383cf87 100644 --- a/src/progs/ingenuity/Configuration.cpp +++ b/src/progs/ingenuity/Configuration.cpp @@ -25,7 +25,8 @@ #include "PatchController.h" #include "PatchModel.h" #include "OmFlowCanvas.h" -#include "Controller.h" +#include "Loader.h" +#include "App.h" using std::cerr; using std::cout; using std::endl; using std::map; using std::string; @@ -131,7 +132,8 @@ Configuration::save_settings(string filename) void Configuration::apply_settings() { - Controller::instance().set_patch_path(m_patch_path); + cerr << "FIXME: patch path" << endl; + //App::instance().loader()->set_patch_path(m_patch_path); } diff --git a/src/progs/ingenuity/ConnectWindow.cpp b/src/progs/ingenuity/ConnectWindow.cpp index d4027e20..16b2adea 100644 --- a/src/progs/ingenuity/ConnectWindow.cpp +++ b/src/progs/ingenuity/ConnectWindow.cpp @@ -14,26 +14,62 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "ConnectWindow.h" #include <string> #include <time.h> #include <sys/time.h> #include <stdlib.h> +#include "config.h" +#include "ConnectWindow.h" #include "interface/ClientKey.h" +#include "OSCModelEngineInterface.h" +#include "OSCClientReceiver.h" #include "ThreadedSigClientInterface.h" -#include "Controller.h" #include "Store.h" #include "PatchController.h" #include "PatchModel.h" #include "App.h" +#ifdef MONOLITHIC_INGENUITY + #include "engine/QueuedEngineInterface.h" + #include "engine/Engine.h" + #include "engine/DirectResponder.h" + #include "engine/tuning.h" +#endif using Ingen::Client::ThreadedSigClientInterface; +using Ingen::QueuedEngineInterface; namespace Ingenuity { +// Paste together some interfaces to get the combination we want + + +struct OSCSigEmitter : public OSCClientReceiver, public ThreadedSigClientInterface { +public: + OSCSigEmitter(size_t queue_size, int listen_port) + : Ingen::Shared::ClientInterface() + , OSCClientReceiver(listen_port) + , ThreadedSigClientInterface(queue_size) + { + } +}; + + +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) + { + QueuedEventSource::start(); + } +}; + + +// ConnectWindow + + ConnectWindow::ConnectWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& xml) : Gtk::Dialog(cobject) -, _client(NULL) +, _mode(CONNECT_REMOTE) , _ping_id(-1) , _attached(false) { @@ -61,9 +97,8 @@ ConnectWindow::ConnectWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome:: void ConnectWindow::start() { - _client = App::instance().client(); - assert(_client); resize(100, 100); + init(); show(); } @@ -78,38 +113,82 @@ ConnectWindow::init() _disconnect_button->set_sensitive(false); _port_spinbutton->set_sensitive(false); _launch_radio->set_sensitive(true); +#ifdef MONOLITHIC_INGENUITY + _internal_radio->set_sensitive(true); +#else _internal_radio->set_sensitive(false); +#endif server_toggled(); _progress_label->set_text(string("Disconnected")); } +/** Launch (if applicable) and connect to the Engine. + * + * This will create the EngineInterface and ClientInterface and initialize + * the App with them. + */ void ConnectWindow::connect() { + assert(!_attached); + assert(!App::instance().engine()); + assert(!App::instance().client()); + _connect_button->set_sensitive(false); - if (_server_radio->get_active()) { - Controller::instance().set_engine_url(_url_entry->get_text()); + if (_mode == CONNECT_REMOTE) { + CountedPtr<ModelEngineInterface> engine(new OSCModelEngineInterface(_url_entry->get_text())); + OSCSigEmitter* ose = new OSCSigEmitter(1024, 16181); // FIXME: args + CountedPtr<SigClientInterface> client(ose); + App::instance().attach(engine, client); + Glib::signal_timeout().connect( sigc::mem_fun(this, &ConnectWindow::gtk_callback), 100); + + Glib::signal_timeout().connect( + sigc::mem_fun(ose, &ThreadedSigClientInterface::emit_signals), 2, G_PRIORITY_HIGH_IDLE); - } else if (_launch_radio->get_active()) { + } else if (_mode == LAUNCH_REMOTE) { + /* int port = _port_spinbutton->get_value_as_int(); char port_str[6]; snprintf(port_str, 6, "%u", port); const string port_arg = string("--port=").append(port_str); - Controller::instance().set_engine_url( + App::instance().engine()->set_engine_url( string("osc.udp://localhost:").append(port_str)); if (fork() == 0) { // child - cerr << "Executing 'om " << port_arg << "' ..." << endl; - execlp("om", port_arg.c_str(), 0); + cerr << "Executing 'ingen " << port_arg << "' ..." << endl; + execlp("ingen", port_arg.c_str(), (char*)NULL); } else { Glib::signal_timeout().connect( sigc::mem_fun(this, &ConnectWindow::gtk_callback), 100); - } + }*/ + throw; +#ifdef MONOLITHIC_INGENUITY + } else if (_mode == INTERNAL) { + CountedPtr<Ingen::Engine> engine(new Ingen::Engine()); + QueuedModelEngineInterface* qmei = new QueuedModelEngineInterface(engine); + CountedPtr<ModelEngineInterface> engine_interface(qmei); + ThreadedSigClientInterface* tsci = new ThreadedSigClientInterface(Ingen::event_queue_size); + CountedPtr<SigClientInterface> client(tsci); + + App::instance().attach(engine_interface, client); + + qmei->set_responder(CountedPtr<Ingen::Responder>(new Ingen::DirectResponder(client, 1))); + engine->set_event_source(qmei); + + Glib::signal_timeout().connect( + sigc::mem_fun(engine.get(), &Ingen::Engine::main_iteration), 1000); + + Glib::signal_timeout().connect( + sigc::mem_fun(this, &ConnectWindow::gtk_callback), 100); + + Glib::signal_timeout().connect( + sigc::mem_fun(tsci, &ThreadedSigClientInterface::emit_signals), 2, G_PRIORITY_HIGH_IDLE); +#endif } } @@ -152,6 +231,7 @@ ConnectWindow::server_toggled() { _url_entry->set_sensitive(true); _port_spinbutton->set_sensitive(false); + _mode = CONNECT_REMOTE; } @@ -160,15 +240,16 @@ ConnectWindow::launch_toggled() { _url_entry->set_sensitive(false); _port_spinbutton->set_sensitive(true); + _mode = LAUNCH_REMOTE; } void ConnectWindow::internal_toggled() { - // Not quite yet... _url_entry->set_sensitive(false); _port_spinbutton->set_sensitive(false); + _mode = INTERNAL; } @@ -188,44 +269,47 @@ ConnectWindow::gtk_callback() /* Connecting to engine */ if (stage == 0) { + assert(!_attached); - assert(_client); + assert(App::instance().engine()); + assert(App::instance().client()); // FIXME - //assert(!Controller::instance().is_attached()); - _progress_label->set_text(string("Connecting to engine at ").append( - Controller::instance().engine_url()).append("...")); + //assert(!App::instance().engine()->is_attached()); + _progress_label->set_text("Connecting to engine..."); present(); - _client->response_sig.connect(sigc::mem_fun(this, &ConnectWindow::response_received)); + App::instance().client()->response_sig.connect(sigc::mem_fun(this, &ConnectWindow::response_received)); _ping_id = rand(); while (_ping_id == -1) _ping_id = rand(); - Controller::instance().attach(_ping_id); + App::instance().engine()->set_next_response_id(_ping_id); + App::instance().engine()->ping(); ++stage; } else if (stage == 1) { if (_attached) { - Controller::instance().activate(); + App::instance().engine()->activate(); ++stage; } else { const float ms_since_last = (now.tv_sec - last.tv_sec) * 1000.0f + (now.tv_usec - last.tv_usec) * 0.001f; if (ms_since_last > 1000) { - Controller::instance().attach(_ping_id); + App::instance().engine()->set_next_response_id(_ping_id); + App::instance().engine()->ping(); last = now; } } } else if (stage == 2) { _progress_label->set_text(string("Registering as client...")); - //Controller::instance().register_client(Controller::instance().client_hooks()); + //App::instance().engine()->register_client(App::instance().engine()->client_hooks()); // FIXME //auto_ptr<ClientInterface> client(new ThreadedSigClientInterface(); - Controller::instance().register_client(ClientKey(), _client); - Controller::instance().load_plugins(); + App::instance().engine()->register_client(ClientKey(), App::instance().client()); + App::instance().engine()->load_plugins(); ++stage; } else if (stage == 3) { // Register idle callback to process events and whatnot @@ -238,7 +322,7 @@ ConnectWindow::gtk_callback() 5, G_PRIORITY_DEFAULT_IDLE);*/ _progress_label->set_text(string("Requesting plugins...")); - Controller::instance().request_plugins(); + App::instance().engine()->request_plugins(); ++stage; } else if (stage == 4) { // Wait for first plugins message @@ -261,7 +345,7 @@ ConnectWindow::gtk_callback() //} } else if (stage == 6) { _progress_label->set_text(string("Waiting for root patch...")); - Controller::instance().request_all_objects(); + App::instance().engine()->request_all_objects(); ++stage; } else if (stage == 7) { if (App::instance().store()->num_objects() > 0) { @@ -272,8 +356,7 @@ ConnectWindow::gtk_callback() ++stage; } } else if (stage == 8) { - _progress_label->set_text(string("Connected to engine at ").append( - Controller::instance().engine_url())); + _progress_label->set_text("Connected to engine"); ++stage; } else if (stage == 9) { stage = -1; diff --git a/src/progs/ingenuity/ConnectWindow.h b/src/progs/ingenuity/ConnectWindow.h index fba6b9d8..d74f6032 100644 --- a/src/progs/ingenuity/ConnectWindow.h +++ b/src/progs/ingenuity/ConnectWindow.h @@ -46,6 +46,8 @@ public: void response_received(int32_t id, bool, string) { if ((id) == _ping_id) _attached = true; } private: + enum Mode { CONNECT_REMOTE, LAUNCH_REMOTE, INTERNAL }; + void server_toggled(); void launch_toggled(); void internal_toggled(); @@ -57,8 +59,7 @@ private: bool gtk_callback(); - CountedPtr<SigClientInterface> _client; - + Mode _mode; int32_t _ping_id; bool _attached; diff --git a/src/progs/ingenuity/ControlGroups.cpp b/src/progs/ingenuity/ControlGroups.cpp index 7c84d898..93a1cb5b 100644 --- a/src/progs/ingenuity/ControlGroups.cpp +++ b/src/progs/ingenuity/ControlGroups.cpp @@ -14,12 +14,14 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include <cmath> +#include <iostream> +#include "ModelEngineInterface.h" #include "ControlGroups.h" #include "ControlPanel.h" #include "PortModel.h" -#include "Controller.h" -#include <cmath> -#include <iostream> +#include "App.h" + using std::cerr; using std::cout; using std::endl; using namespace Ingen::Client; @@ -53,9 +55,10 @@ ControlGroup::ControlGroup(ControlPanel* panel, CountedPtr<PortModel> pm, bool s void ControlGroup::metadata_update(const string& key, const string& value) { - if (key == "user-min") + // FIXME: this isn't right + if (key == "user-min" || key == "min") set_min(atof(value.c_str())); - else if (key == "user-max") + else if (key == "user-max" || key == "max") set_max(atof(value.c_str())); } @@ -79,10 +82,12 @@ SliderControlGroup::SliderControlGroup(ControlPanel* panel, CountedPtr<PortModel m_slider.set_increments(1.0, 10.0); // Compensate for crazy plugins + // FIXME + /* if (m_port_model->user_max() <= m_port_model->user_min()) { m_port_model->user_max(m_port_model->user_min() + 1.0); m_slider.set_range(m_port_model->user_min(), m_port_model->user_max()); - } + }*/ m_slider.property_draw_value() = false; set_name(pm->name()); @@ -205,7 +210,7 @@ SliderControlGroup::min_changed() if (m_enable_signal) { char temp_buf[16]; snprintf(temp_buf, 16, "%f", min); - Controller::instance().set_metadata(m_port_model->path(), "user-min", temp_buf); + App::instance().engine()->set_metadata(m_port_model->path(), "user-min", temp_buf); } } @@ -226,7 +231,7 @@ SliderControlGroup::max_changed() if (m_enable_signal) { char temp_buf[16]; snprintf(temp_buf, 16, "%f", max); - Controller::instance().set_metadata(m_port_model->path(), "user-max", temp_buf); + App::instance().engine()->set_metadata(m_port_model->path(), "user-max", temp_buf); } } @@ -281,11 +286,11 @@ SliderControlGroup::slider_pressed(GdkEvent* ev) //cerr << "Pressed: " << ev->type << endl; if (ev->type == GDK_BUTTON_PRESS) { m_enabled = false; - cerr << "SLIDER FIXME\n"; + //cerr << "SLIDER FIXME\n"; //GtkClientInterface::instance()->set_ignore_port(m_port_model->path()); } else if (ev->type == GDK_BUTTON_RELEASE) { m_enabled = true; - cerr << "SLIDER FIXME\n"; + //cerr << "SLIDER FIXME\n"; //GtkClientInterface::instance()->clear_ignore_port(); } diff --git a/src/progs/ingenuity/ControlPanel.cpp b/src/progs/ingenuity/ControlPanel.cpp index 82d2beba..0841a818 100644 --- a/src/progs/ingenuity/ControlPanel.cpp +++ b/src/progs/ingenuity/ControlPanel.cpp @@ -14,13 +14,14 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "App.h" +#include "ModelEngineInterface.h" #include "ControlPanel.h" #include "PatchModel.h" #include "NodeModel.h" #include "PortModel.h" #include "ControlGroups.h" #include "PatchController.h" -#include "Controller.h" namespace Ingenuity { @@ -124,6 +125,10 @@ ControlPanel::add_port(PortController* port) cg->disable(); else cg->enable(); + + cerr << "FIXME: Control panel add port\n"; + // pm->connection_sig.connect(bind(sigc::mem_fun(this, &ControlPanel::connection), pm)) + // pm->disconnection_sig.connect(bind(sigc::mem_fun(this, &ControlPanel::disconnection), pm)) } //port->set_control_panel(this); @@ -223,10 +228,10 @@ ControlPanel::value_changed(const Path& port_path, float val) // m_mirror->set_port_value(port_path, val); if (m_all_voices_radio->get_active()) { - Controller::instance().set_port_value(port_path, val); + App::instance().engine()->set_port_value(port_path, val); } else { int voice = m_voice_spinbutton->get_value_as_int(); - Controller::instance().set_port_value(port_path, voice, val); + App::instance().engine()->set_port_value(port_path, voice, val); } } } diff --git a/src/progs/ingenuity/Controller.cpp b/src/progs/ingenuity/Controller.cpp deleted file mode 100644 index a007ece8..00000000 --- a/src/progs/ingenuity/Controller.cpp +++ /dev/null @@ -1,175 +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 "PatchModel.h" -#include "PatchController.h" -#include "OSCModelEngineInterface.h" -#include "PatchLibrarian.h" -#include "Controller.h" -#include "Loader.h" -#include "interface/ClientKey.h" - -namespace Ingenuity { - - -/// Singleton instance -Controller* Controller::_instance = 0; - - -Controller::Controller(const string& engine_url) -: OSCModelEngineInterface(engine_url), - m_patch_librarian(new PatchLibrarian(this)), - m_loader(new Loader(m_patch_librarian)) -{ - m_loader->launch(); -} - - -Controller::~Controller() -{ - // FIXME - //if (is_attached()) { - unregister_client(ClientKey()); // FIXME - //detach(); - //} - - delete m_loader; - delete m_patch_librarian; -} - - -/** "Attach" to the Om engine. - * See documentation OSCModelEngineInterface::attach. - */ -void -Controller::attach(int32_t ping_id) -{ - OSCModelEngineInterface::attach(ping_id, false); -} - -/* -void -Controller::register_client_and_wait() -{ -// int id = get_next_request_id(); -// set_wait_response_id(id); - OSCModelEngineInterface::register_client(); -// wait_for_response(); - cout << "[Controller] Registered with engine. maybe. fixme." << endl; -} -*/ -void Controller::set_engine_url(const string& url) { _engine_url = url; } - -void -Controller::create_node_from_model(const NodeModel* nm) -{ - //push_added_node(nm); - OSCModelEngineInterface::create_node_from_model(nm); - char temp_buf[16]; - snprintf(temp_buf, 16, "%f", nm->x()); - set_metadata(nm->path(), "module-x", temp_buf); - snprintf(temp_buf, 16, "%f", nm->y()); - set_metadata(nm->path(), "module-y", temp_buf); -} - -void -Controller::create_patch_from_model(const PatchModel* pm) -{ - //push_added_patch(pm); - - //int id = get_next_request_id(); - //set_wait_response_id(id); - OSCModelEngineInterface::create_patch_from_model(pm); - if (pm->parent()) { - // wait_for_response(); - char temp_buf[16]; - snprintf(temp_buf, 16, "%f", pm->x()); - set_metadata(pm->path(), "module-x", temp_buf); - snprintf(temp_buf, 16, "%f", pm->y()); - set_metadata(pm->path(), "module-y", temp_buf); - } - enable_patch(pm->path()); -} - - -void -Controller::set_patch_path(const string& path) -{ - m_patch_librarian->path(path); -} - - -/** Load patch in a seperate thread. - * This will return immediately and the patch will be loaded in the background. - * FIXME: merge parameter makes no sense, always true */ -void -Controller::load_patch(PatchModel* model, bool wait, bool merge) -{ - //push_added_patch(model); - m_loader->load_patch(model, wait, merge); -} - - -/** Load patch in a seperate thread. - * This will return immediately and the patch will be saved in the background. */ -void -Controller::save_patch(PatchModel* model, const string& filename, bool recursive) -{ - m_loader->save_patch(model, filename, recursive); -} - - -#if 0 -/** Returns the added node with the given path and removes it from the cache. - */ -NodeModel* -Controller::yank_added_node(const string& path) -{ - NodeModel* nm = NULL; - - for (list<NodeModel*>::iterator i = m_added_nodes.begin(); i != m_added_nodes.end(); ++i) { - if ((*i)->path() == path) { - nm = *i; - m_added_nodes.erase(i); - break; - } - } - - return nm; -} - - -/** Returns the added patch with the given path and removes it from the cache. - */ -PatchModel* -Controller::yank_added_patch(const string& path) -{ - PatchModel* pm = NULL; - - for (list<PatchModel*>::iterator i = m_added_patches.begin(); i != m_added_patches.end(); ++i) { - if ((*i)->path() == path) { - pm = *i; - m_added_patches.erase(i); - break; - } - } - - return pm; -} -#endif - -} // namespace Ingenuity - diff --git a/src/progs/ingenuity/Controller.h b/src/progs/ingenuity/Controller.h deleted file mode 100644 index 6a855758..00000000 --- a/src/progs/ingenuity/Controller.h +++ /dev/null @@ -1,110 +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 CONTROLLER_H -#define CONTROLLER_H - -#include <cassert> -#include <string> -#include <list> -#include <glibmm.h> -#include "PluginModel.h" -#include "OSCModelEngineInterface.h" - -namespace Ingen { namespace Client { -class PatchModel; -class NodeModel; -class PatchLibrarian; -} } - -using std::string; using std::list; -using namespace Ingen::Client; - -namespace Ingenuity { - -class PatchController; -class Loader; - - -/** Singleton engine controller for the entire app. - * - * This is hardly more than a trivial wrapper for OSCModelEngineInterface, suggesting something - * needs a rethink around here.. - * - * This needs to be either eliminated or the name changed to OmController. Probably - * best to keep around in case multiple engine control support comes around? - * - * \ingroup Ingenuity - */ -class Controller : public OSCModelEngineInterface -{ -public: - ~Controller(); - - void attach(int32_t ping_id); - - //void register_client_and_wait(); - - void set_engine_url(const string& url); - - void create_node_from_model(const NodeModel* nm); - - void load_patch(PatchModel* model, bool wait = true, bool merge = false); - void save_patch(PatchModel* model, const string& filename, bool recursive); - - void create_patch_from_model(const PatchModel* pm); - - //void lash_restore_finished(); - - void set_patch_path(const string& path); - - /* - void push_added_node(NodeModel* nm) { m_added_nodes.push_back(nm); } - NodeModel* yank_added_node(const string& path); - - void push_added_patch(PatchModel* pm) { m_added_patches.push_back(pm); } - PatchModel* yank_added_patch(const string& path); - */ - - static void instantiate(const string& engine_url) - { if (!_instance) _instance = new Controller(engine_url); } - - inline static Controller& instance() { assert(_instance); return *_instance; } - -private: - Controller(const string& engine_url); - static Controller* _instance; - - PatchLibrarian* m_patch_librarian; - Loader* m_loader; - - /** Used to cache added nodes so client can remember some values when the - * new node notification comes (location, etc). Used to prevent the node - * jumping locations during the delay between new node and the module-x/y - * metadata notifications */ - //list<NodeModel*> m_added_nodes; - - /** Used to cache added patches in the same was as m_added_nodes. Used to - * rember filename so File->Save can work without prompting (filename can't - * be sent to the server as metadata, because a client on another machine - * doesn't want that information) */ - //list<PatchModel*> m_added_patches; -}; - - -} // namespace Ingenuity - -#endif // CONTROLLER_H diff --git a/src/progs/ingenuity/DSSIController.cpp b/src/progs/ingenuity/DSSIController.cpp index 7419f8c1..6bc75c70 100644 --- a/src/progs/ingenuity/DSSIController.cpp +++ b/src/progs/ingenuity/DSSIController.cpp @@ -20,9 +20,10 @@ #include <dirent.h> #include <unistd.h> #include <sys/stat.h> +#include "App.h" #include "NodeModel.h" #include "DSSIModule.h" -#include "Controller.h" +#include "ModelEngineInterface.h" namespace Ingenuity { @@ -115,7 +116,7 @@ DSSIController::update_program_menu() void DSSIController::send_program_change(int bank, int program) { - Controller::instance().set_program(node_model()->path(), bank, program); + App::instance().engine()->set_program(node_model()->path(), bank, program); } @@ -142,12 +143,14 @@ DSSIController::create_module(OmFlowCanvas* canvas) bool DSSIController::attempt_to_show_gui() { + cerr << "FIXME: DSSI GUI" << endl; +#if 0 // Shamelessley "inspired by" jack-dssi-host // Copyright 2004 Chris Cannam, Steve Harris and Sean Bolton. const bool verbose = false; - string engine_url = Controller::instance().engine_url(); + string engine_url = App::instance().engine()->engine_url(); // Hack off last character if it's a / if (engine_url[engine_url.length()-1] == '/') engine_url = engine_url.substr(0, engine_url.length()-1); @@ -263,6 +266,7 @@ DSSIController::attempt_to_show_gui() free(subpath); free(dllBase); +#endif return false; } diff --git a/src/progs/ingenuity/LoadPatchWindow.cpp b/src/progs/ingenuity/LoadPatchWindow.cpp index 81726f2a..a847e0fd 100644 --- a/src/progs/ingenuity/LoadPatchWindow.cpp +++ b/src/progs/ingenuity/LoadPatchWindow.cpp @@ -21,7 +21,8 @@ #include "Configuration.h" #include "PatchController.h" #include "PatchModel.h" -#include "Controller.h" +#include "ModelEngineInterface.h" +#include "Loader.h" namespace Ingenuity { @@ -108,14 +109,14 @@ LoadPatchWindow::ok_clicked() poly = m_poly_spinbutton->get_value_as_int(); if (m_replace) - Controller::instance().clear_patch(m_patch_controller->model()->path()); + App::instance().engine()->clear_patch(m_patch_controller->model()->path()); PatchModel* pm = new PatchModel(m_patch_controller->model()->path(), poly); pm->filename(get_filename()); pm->set_metadata("filename", get_filename()); pm->set_parent(m_patch_controller->patch_model()->parent()); - //Controller::instance().push_added_patch(pm); - Controller::instance().load_patch(pm, true, true); + //App::instance().engine()->push_added_patch(pm); + App::instance().loader()->load_patch(pm, true, true); hide(); } diff --git a/src/progs/ingenuity/LoadPluginWindow.cpp b/src/progs/ingenuity/LoadPluginWindow.cpp index 99fd4704..b6c2ca67 100644 --- a/src/progs/ingenuity/LoadPluginWindow.cpp +++ b/src/progs/ingenuity/LoadPluginWindow.cpp @@ -22,12 +22,12 @@ #include "PatchController.h" #include "PatchView.h" #include "NodeModel.h" -#include "Controller.h" #include "App.h" #include "PatchWindow.h" #include "OmFlowCanvas.h" #include "PatchModel.h" #include "Store.h" +#include "ModelEngineInterface.h" using std::cout; using std::cerr; using std::endl; @@ -294,7 +294,7 @@ LoadPluginWindow::add_clicked() nm->x(m_new_module_x); nm->y(m_new_module_y); - Controller::instance().create_node_from_model(nm); + App::instance().engine()->create_node_from_model(nm); ++m_plugin_name_offset; m_node_name_entry->set_text(generate_module_name(m_plugin_name_offset)); diff --git a/src/progs/ingenuity/LoadSubpatchWindow.cpp b/src/progs/ingenuity/LoadSubpatchWindow.cpp index 0ec98771..832c917f 100644 --- a/src/progs/ingenuity/LoadSubpatchWindow.cpp +++ b/src/progs/ingenuity/LoadSubpatchWindow.cpp @@ -23,9 +23,10 @@ #include "PatchView.h" #include "OmFlowCanvas.h" #include "NodeModel.h" -#include "Controller.h" #include "PatchModel.h" #include "Configuration.h" +#include "ModelEngineInterface.h" +#include "Loader.h" namespace Ingenuity { @@ -163,7 +164,7 @@ LoadSubpatchWindow::ok_clicked() pm->set_metadata("module-x", temp_buf); snprintf(temp_buf, 16, "%16f", m_new_module_y); pm->set_metadata("module-y", temp_buf); - Controller::instance().load_patch(pm); + App::instance().loader()->load_patch(pm, true, false); App::instance().configuration()->set_patch_folder(pm->filename().substr(0, pm->filename().find_last_of("/"))); diff --git a/src/progs/ingenuity/Loader.cpp b/src/progs/ingenuity/Loader.cpp index 13a4e896..fed49603 100644 --- a/src/progs/ingenuity/Loader.cpp +++ b/src/progs/ingenuity/Loader.cpp @@ -140,14 +140,25 @@ SaveSessionEvent::execute() //////// Loader ////////// -Loader::Loader(PatchLibrarian* const patch_librarian) -: m_patch_librarian(patch_librarian), +Loader::Loader(CountedPtr<ModelEngineInterface> engine) +: m_patch_librarian(new PatchLibrarian(engine)), m_event(NULL), m_thread_exit_flag(false) { assert(m_patch_librarian != NULL); pthread_mutex_init(&m_mutex, NULL); pthread_cond_init(&m_cond, NULL); + + // FIXME: rework this so the thread is only present when it's doing something (save mem) + launch(); +} + + +Loader::~Loader() +{ + m_thread_exit_flag = true; + pthread_join(m_thread, NULL); + delete m_patch_librarian; } diff --git a/src/progs/ingenuity/Loader.h b/src/progs/ingenuity/Loader.h index df9166d2..7ff6f189 100644 --- a/src/progs/ingenuity/Loader.h +++ b/src/progs/ingenuity/Loader.h @@ -19,18 +19,19 @@ #include <string> #include <cassert> +#include "ModelEngineInterface.h" using std::string; namespace Ingen { namespace Client { class PatchLibrarian; class PatchModel; + class ModelEngineInterface; } } -using Ingen::Client::PatchLibrarian; -using Ingen::Client::PatchModel; - +using namespace Ingen::Client; namespace Ingenuity { - + + /** Event to run in the Loader thread. * * \ingroup Ingenuity @@ -113,15 +114,17 @@ private: * * This is a seperate thread so it can send all the loading message without * blocking everything else, so the app can respond to the incoming events - * caused as a result of the patch loading. + * caused as a result of the patch loading, while the patch loads. * * \ingroup Ingenuity */ class Loader { public: - Loader(PatchLibrarian* const patch_librarian); - ~Loader() { m_thread_exit_flag = true; } + Loader(CountedPtr<ModelEngineInterface> engine); + ~Loader(); + + PatchLibrarian& librarian() { return *m_patch_librarian; } void launch(); void exit() { m_thread_exit_flag = true; } diff --git a/src/progs/ingenuity/Makefile.am b/src/progs/ingenuity/Makefile.am index aa04d3fb..a014286c 100644 --- a/src/progs/ingenuity/Makefile.am +++ b/src/progs/ingenuity/Makefile.am @@ -6,10 +6,16 @@ MAINTAINERCLEANFILES = Makefile.in sharefilesdir = $(pkgdatadir) dist_sharefiles_DATA = ingenuity.glade om-icon.png -AM_CXXFLAGS = -DGTK_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -I$(top_srcdir)/src/common -I$(top_srcdir)/src/libs/client -DPKGDATADIR=\"$(pkgdatadir)\" @GTKMM_CFLAGS@ @LIBGLADEMM_CFLAGS@ @GNOMECANVASMM_CFLAGS@ @LOSC_CFLAGS@ @LASH_CFLAGS@ @FLOWCANVAS_CFLAGS@ -DWITH_RTTI +AM_CXXFLAGS = -DGTK_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -I$(top_srcdir)/src/common -I$(top_srcdir)/src/libs/client -DPKGDATADIR=\"$(pkgdatadir)\" @GTKMM_CFLAGS@ @LIBGLADEMM_CFLAGS@ @GNOMECANVASMM_CFLAGS@ @LOSC_CFLAGS@ @LASH_CFLAGS@ @FLOWCANVAS_CFLAGS@ ingenuity_LDADD = @GTKMM_LIBS@ @LIBGLADEMM_LIBS@ @GNOMECANVASMM_LIBS@ @LOSC_LIBS@ @LASH_LIBS@ @FLOWCANVAS_LIBS@ ../../libs/client/libomclient.la ingenuity_DEPENDENCIES = ../../libs/client/libomclient.la +# FIXME: make engine have a separate include dir +if MONOLITHIC_INGENUITY +AM_CXXFLAGS += -I$(top_srcdir)/src/libs +ingenuity_LDADD += @JACK_LIBS@ @ALSA_LIBS@ @LASH_LIBS@ @SLV2_LIBS@ -lrt ../../libs/engine/libingen.la +ingenuity_DEPENDENCIES += ../../libs/engine/libingen.la +endif bin_PROGRAMS = ingenuity ingenuity_SOURCES = \ @@ -24,8 +30,6 @@ ingenuity_SOURCES = \ Configuration.cpp \ GladeFactory.h \ GladeFactory.cpp \ - Controller.h \ - Controller.cpp \ GtkObjectController.h \ GtkObjectController.cpp \ PatchController.h \ diff --git a/src/progs/ingenuity/NewSubpatchWindow.cpp b/src/progs/ingenuity/NewSubpatchWindow.cpp index 84f9bb7f..49122a21 100644 --- a/src/progs/ingenuity/NewSubpatchWindow.cpp +++ b/src/progs/ingenuity/NewSubpatchWindow.cpp @@ -14,12 +14,13 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "App.h" +#include "ModelEngineInterface.h" #include "NewSubpatchWindow.h" #include "PatchController.h" #include "PatchView.h" #include "OmFlowCanvas.h" #include "NodeModel.h" -#include "Controller.h" #include "PatchModel.h" namespace Ingenuity { @@ -98,7 +99,7 @@ NewSubpatchWindow::ok_clicked() pm->set_metadata("module-x", temp_buf); snprintf(temp_buf, 16, "%16f", m_new_module_y); pm->set_metadata("module-y", temp_buf); - Controller::instance().create_patch_from_model(pm); + App::instance().engine()->create_patch_from_model(pm); hide(); } diff --git a/src/progs/ingenuity/NodeController.cpp b/src/progs/ingenuity/NodeController.cpp index bd98346b..331a714e 100644 --- a/src/progs/ingenuity/NodeController.cpp +++ b/src/progs/ingenuity/NodeController.cpp @@ -17,6 +17,7 @@ #include "NodeController.h" #include <iostream> #include <gtkmm.h> +#include "App.h" #include "OmModule.h" #include "NodeModel.h" #include "PortModel.h" @@ -28,11 +29,11 @@ #include "OmFlowCanvas.h" #include "RenameWindow.h" #include "GladeFactory.h" -#include "Controller.h" #include "PatchWindow.h" #include "PatchModel.h" #include "NodePropertiesWindow.h" #include "Store.h" +#include "ModelEngineInterface.h" using std::cerr; using std::endl; namespace Ingenuity { @@ -199,7 +200,7 @@ NodeController::add_port(CountedPtr<PortModel> pm) assert(pm->parent() == node_model()); assert(node_model()->get_port(pm->name()) == pm); - cout << "[NodeController] Adding port " << pm->path() << endl; + //cout << "[NodeController] Adding port " << pm->path() << endl; // FIXME: leak PortController* pc = new PortController(pm); @@ -240,7 +241,7 @@ NodeController::show_control_window() void NodeController::on_menu_destroy() { - Controller::instance().destroy(node_model()->path()); + App::instance().engine()->destroy(node_model()->path()); } @@ -298,7 +299,7 @@ NodeController::on_menu_clone() nm->polyphonic(node_model()->polyphonic()); nm->x(node_model()->x() + 20); nm->y(node_model()->y() + 20); - Controller::instance().create_node_from_model(nm); + App::instance().engine()->create_node_from_model(nm); */ } @@ -306,13 +307,13 @@ NodeController::on_menu_clone() void NodeController::on_menu_learn() { - Controller::instance().midi_learn(node_model()->path()); + App::instance().engine()->midi_learn(node_model()->path()); } void NodeController::on_menu_disconnect_all() { - Controller::instance().disconnect_all(node_model()->path()); + App::instance().engine()->disconnect_all(node_model()->path()); } diff --git a/src/progs/ingenuity/OmFlowCanvas.cpp b/src/progs/ingenuity/OmFlowCanvas.cpp index 7d4bd3a4..ac5f8beb 100644 --- a/src/progs/ingenuity/OmFlowCanvas.cpp +++ b/src/progs/ingenuity/OmFlowCanvas.cpp @@ -17,7 +17,8 @@ #include "OmFlowCanvas.h" #include <cassert> #include <flowcanvas/FlowCanvas.h> -#include "Controller.h" +#include "App.h" +#include "ModelEngineInterface.h" #include "PatchController.h" #include "PatchModel.h" #include "PatchWindow.h" @@ -106,19 +107,19 @@ OmFlowCanvas::connect(const Port* src_port, const Port* dst_port) + 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); - Controller::instance().connect(src->model()->path(), nm->path() + "/MIDI_In"); - Controller::instance().connect(nm->path() + "/Out_(CR)", dst->model()->path()); - Controller::instance().midi_learn(nm->path()); + App::instance().engine()->create_node_from_model(nm); + App::instance().engine()->connect(src->model()->path(), nm->path() + "/MIDI_In"); + App::instance().engine()->connect(nm->path() + "/Out_(CR)", dst->model()->path()); + App::instance().engine()->midi_learn(nm->path()); // Set control node range to port's user range - Controller::instance().set_port_value_queued(nm->path().base_path() + "Min", + App::instance().engine()->set_port_value_queued(nm->path().base_path() + "Min", atof(dst->model()->get_metadata("user-min").c_str())); - Controller::instance().set_port_value_queued(nm->path().base_path() + "Max", + App::instance().engine()->set_port_value_queued(nm->path().base_path() + "Max", atof(dst->model()->get_metadata("user-max").c_str())); } else { - Controller::instance().connect(src->model()->path(), + App::instance().engine()->connect(src->model()->path(), dst->model()->path()); } } @@ -130,7 +131,7 @@ OmFlowCanvas::disconnect(const Port* src_port, const Port* dst_port) assert(src_port != NULL); assert(dst_port != NULL); - Controller::instance().disconnect(((OmPort*)src_port)->model()->path(), + App::instance().engine()->disconnect(((OmPort*)src_port)->model()->path(), ((OmPort*)dst_port)->model()->path()); } @@ -168,7 +169,7 @@ void OmFlowCanvas::destroy_selected() { for (list<Module*>::iterator m = m_selected_modules.begin(); m != m_selected_modules.end(); ++m) - Controller::instance().destroy(((OmModule*)(*m))->node()->path()); + App::instance().engine()->destroy(((OmModule*)(*m))->node()->path()); } @@ -193,13 +194,13 @@ void OmFlowCanvas::menu_add_port(const string& name, const string& type, bool is_output) { const Path& path = m_patch_controller->path().base_path() + generate_port_name(name); - Controller::instance().create_port(path, type, is_output); + App::instance().engine()->create_port(path, type, is_output); char temp_buf[16]; snprintf(temp_buf, 16, "%d", m_last_click_x); - Controller::instance().set_metadata(path, "module-x", temp_buf); + App::instance().engine()->set_metadata(path, "module-x", temp_buf); snprintf(temp_buf, 16, "%d", m_last_click_y); - Controller::instance().set_metadata(path, "module-y", temp_buf); + App::instance().engine()->set_metadata(path, "module-y", temp_buf); } @@ -221,7 +222,7 @@ void OmFlowCanvas::menu_add_audio_input() { string name = "audio_in"; - Controller::instance().create_port(m_patch_controller->path().base_path() + name, "AUDIO", false); + App::instance().engine()->create_port(m_patch_controller->path().base_path() + name, "AUDIO", false); } @@ -229,7 +230,7 @@ void OmFlowCanvas::menu_add_audio_output() { string name = "audio_out"; - Controller::instance().create_port(m_patch_controller->path().base_path() + name, "AUDIO", true); + App::instance().engine()->create_port(m_patch_controller->path().base_path() + name, "AUDIO", true); } @@ -237,7 +238,7 @@ void OmFlowCanvas::menu_add_control_input() { string name = "control_in"; - Controller::instance().create_port(m_patch_controller->path().base_path() + name, "CONTROL", false); + App::instance().engine()->create_port(m_patch_controller->path().base_path() + name, "CONTROL", false); } @@ -245,7 +246,7 @@ void OmFlowCanvas::menu_add_control_output() { string name = "control_out"; - Controller::instance().create_port(m_patch_controller->path().base_path() + name, "CONTROL", true); + App::instance().engine()->create_port(m_patch_controller->path().base_path() + name, "CONTROL", true); } @@ -253,7 +254,7 @@ void OmFlowCanvas::menu_add_midi_input() { string name = "midi_in"; - Controller::instance().create_port(m_patch_controller->path().base_path() + name, "MIDI", false); + App::instance().engine()->create_port(m_patch_controller->path().base_path() + name, "MIDI", false); } @@ -261,7 +262,7 @@ void OmFlowCanvas::menu_add_midi_output() { string name = "midi_out"; - Controller::instance().create_port(m_patch_controller->path().base_path() + name, "MIDI", true); + App::instance().engine()->create_port(m_patch_controller->path().base_path() + name, "MIDI", true); } */ diff --git a/src/progs/ingenuity/OmModule.cpp b/src/progs/ingenuity/OmModule.cpp index 2de109ea..e34665a7 100644 --- a/src/progs/ingenuity/OmModule.cpp +++ b/src/progs/ingenuity/OmModule.cpp @@ -16,7 +16,8 @@ #include "OmModule.h" #include <cassert> -#include "Controller.h" +#include "App.h" +#include "ModelEngineInterface.h" #include "OmFlowCanvas.h" #include "PatchModel.h" #include "NodeModel.h" @@ -64,12 +65,12 @@ OmModule::store_location() m_node->node_model()->x(property_x()); snprintf(temp_buf, 16, "%f", m_node->node_model()->x()); m_node->node_model()->set_metadata("module-x", temp_buf); // just in case? - Controller::instance().set_metadata(m_node->node_model()->path(), "module-x", temp_buf); + App::instance().engine()->set_metadata(m_node->node_model()->path(), "module-x", temp_buf); m_node->node_model()->y(property_y()); snprintf(temp_buf, 16, "%f", m_node->node_model()->y()); m_node->node_model()->set_metadata("module-y", temp_buf); // just in case? - Controller::instance().set_metadata(m_node->node_model()->path(), "module-y", temp_buf); + App::instance().engine()->set_metadata(m_node->node_model()->path(), "module-y", temp_buf); } diff --git a/src/progs/ingenuity/OmPortModule.cpp b/src/progs/ingenuity/OmPortModule.cpp index c1a54378..e5c5fca6 100644 --- a/src/progs/ingenuity/OmPortModule.cpp +++ b/src/progs/ingenuity/OmPortModule.cpp @@ -16,7 +16,8 @@ #include "OmPortModule.h" #include <cassert> -#include "Controller.h" +#include "App.h" +#include "ModelEngineInterface.h" #include "OmFlowCanvas.h" #include "PatchModel.h" #include "NodeModel.h" @@ -50,12 +51,12 @@ OmPortModule::store_location() //m_port->port_model()->x(property_x()); snprintf(temp_buf, 16, "%f", property_x().get_value()); //m_port->port_model()->set_metadata("module-x", temp_buf); // just in case? - Controller::instance().set_metadata(m_port->port_model()->path(), "module-x", temp_buf); + App::instance().engine()->set_metadata(m_port->port_model()->path(), "module-x", temp_buf); //m_port->port_model()->y(property_y()); snprintf(temp_buf, 16, "%f", property_y().get_value()); //m_port->port_model()->set_metadata("module-y", temp_buf); // just in case? - Controller::instance().set_metadata(m_port->port_model()->path(), "module-y", temp_buf); + App::instance().engine()->set_metadata(m_port->port_model()->path(), "module-y", temp_buf); } diff --git a/src/progs/ingenuity/PatchController.cpp b/src/progs/ingenuity/PatchController.cpp index 49c7491c..86e548c7 100644 --- a/src/progs/ingenuity/PatchController.cpp +++ b/src/progs/ingenuity/PatchController.cpp @@ -27,7 +27,6 @@ #include "PatchView.h" #include "flowcanvas/Module.h" #include "PluginModel.h" -#include "Controller.h" #include "SubpatchModule.h" #include "DSSIModule.h" #include "PatchWindow.h" @@ -390,34 +389,8 @@ PatchController::create_connection(CountedPtr<ConnectionModel> cm) cm->src_port_path().name(), dst_parent_name, cm->dst_port_path().name()); - - // Disable control slider from destination node control window - - cerr << "FIXME: create_connection\n"; - /*PortController* p = Store::instance().port(cm->dst_port_path()); - assert(p != NULL); - - if (p->control_panel() != NULL) - p->control_panel()->disable_port(p->path());*/ - - // FIXME: don't use canvas as a model (search object store) - /*OmModule* m = (OmModule*)m_patch_view->canvas()->find_module( - cm->dst_port_path().parent().name()); - - if (m != NULL) { - OmPort* p = m->port(cm->dst_port_path().name()); - if (p != NULL && p->connections().size() == 1) { - p->model()->connected(true); - assert(m->node_model()->controller() != NULL); - NodeControlWindow* cw = (((NodeController*) - m->node_model()->controller())->control_window()); - if (cw != NULL) - cw->control_panel()->disable_port(cm->dst_port_path()); - } - }*/ } - NodeController* PatchController::create_controller_for_node(CountedPtr<NodeModel> node) { @@ -529,8 +502,6 @@ PatchController::add_port(CountedPtr<PortModel> pm) assert(pm->parent() == m_patch_model); assert(patch_model()->get_port(pm->name())); - cerr << "ADDING PORT " << pm->name() << "TO PATCH: " << patch_model()->path() << endl; - //cerr << "[PatchController] Adding port " << pm->path() << endl; /*if (patch_model()->get_port(pm->name())) { diff --git a/src/progs/ingenuity/PatchTreeWindow.cpp b/src/progs/ingenuity/PatchTreeWindow.cpp index 0c5fdcf0..47bfc485 100644 --- a/src/progs/ingenuity/PatchTreeWindow.cpp +++ b/src/progs/ingenuity/PatchTreeWindow.cpp @@ -14,8 +14,10 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "App.h" +#include "ModelEngineInterface.h" +#include "OSCEngineSender.h" #include "PatchTreeWindow.h" -#include "Controller.h" #include "PatchController.h" #include "PatchWindow.h" #include "SubpatchModule.h" @@ -70,7 +72,8 @@ PatchTreeWindow::add_patch(PatchController* pc) Gtk::TreeModel::iterator iter = m_patch_treestore->append(); Gtk::TreeModel::Row row = *iter; if (pm->path() == "/") { - string root_name = Controller::instance().engine_url(); + CountedPtr<OSCEngineSender> osc_sender = App::instance().engine(); + string root_name = osc_sender ? osc_sender->engine_url() : "Internal"; // Hack off trailing '/' if it's there (ugly) //if (root_name.substr(root_name.length()-1,1) == "/") // root_name = root_name.substr(0, root_name.length()-1); @@ -178,12 +181,12 @@ PatchTreeWindow::event_patch_enabled_toggled(const Glib::ustring& path_str) if ( ! pc->patch_model()->enabled()) { if (m_enable_signal) - Controller::instance().enable_patch(patch_path); + App::instance().engine()->enable_patch(patch_path); //pc->enable(); row[m_patch_tree_columns.enabled_col] = true; } else { if (m_enable_signal) - Controller::instance().disable_patch(patch_path); + App::instance().engine()->disable_patch(patch_path); //pc->disable(); row[m_patch_tree_columns.enabled_col] = false; } diff --git a/src/progs/ingenuity/PatchView.cpp b/src/progs/ingenuity/PatchView.cpp index 41e74b1c..644e0253 100644 --- a/src/progs/ingenuity/PatchView.cpp +++ b/src/progs/ingenuity/PatchView.cpp @@ -19,6 +19,7 @@ #include <cassert> #include <fstream> #include "App.h" +#include "ModelEngineInterface.h" #include "OmFlowCanvas.h" #include "PatchController.h" #include "LoadPluginWindow.h" @@ -28,7 +29,6 @@ #include "NodeControlWindow.h" #include "PatchPropertiesWindow.h" #include "PatchTreeWindow.h" -#include "Controller.h" namespace Ingenuity { @@ -101,10 +101,10 @@ PatchView::process_toggled() return; if (m_process_checkbutton->get_active()) { - Controller::instance().enable_patch(m_patch->model()->path()); + App::instance().engine()->enable_patch(m_patch->model()->path()); App::instance().patch_tree()->patch_enabled(m_patch->model()->path()); } else { - Controller::instance().disable_patch(m_patch->model()->path()); + App::instance().engine()->disable_patch(m_patch->model()->path()); App::instance().patch_tree()->patch_disabled(m_patch->model()->path()); } } diff --git a/src/progs/ingenuity/PatchWindow.cpp b/src/progs/ingenuity/PatchWindow.cpp index 69e8f7de..60fa966b 100644 --- a/src/progs/ingenuity/PatchWindow.cpp +++ b/src/progs/ingenuity/PatchWindow.cpp @@ -19,6 +19,7 @@ #include <cassert> #include <fstream> #include "App.h" +#include "ModelEngineInterface.h" #include "PatchView.h" #include "OmFlowCanvas.h" #include "PatchController.h" @@ -32,10 +33,10 @@ #include "ConfigWindow.h" #include "MessagesWindow.h" #include "PatchTreeWindow.h" -#include "Controller.h" #include "BreadCrumb.h" #include "Store.h" #include "ConnectWindow.h" +#include "Loader.h" namespace Ingenuity { @@ -88,7 +89,7 @@ PatchWindow::PatchWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glad m_load_subpatch_window->set_transient_for(*this); m_menu_view_control_window->property_sensitive() = false; - //m_status_bar->push(Controller::instance().engine_url()); + //m_status_bar->push(App::instance().engine()->engine_url()); //m_status_bar->pack_start(*Gtk::manage(new Gtk::Image(Gtk::Stock::CONNECT, Gtk::ICON_SIZE_MENU)), false, false); /*m_menu_open->signal_activate().connect( @@ -397,7 +398,7 @@ PatchWindow::event_save() if (model->filename() == "") event_save_as(); else - Controller::instance().save_patch(model, model->filename(), false); + App::instance().loader()->save_patch(model, model->filename(), false); } @@ -452,7 +453,7 @@ PatchWindow::event_save_as() fin.close(); if (confirm) { - Controller::instance().save_patch(m_patch->patch_model().get(), filename, recursive); + App::instance().loader()->save_patch(m_patch->patch_model().get(), filename, recursive); m_patch->patch_model()->filename(filename); } } @@ -544,7 +545,7 @@ PatchWindow::event_quit() if (ret == 1) { App::instance().quit(); } else if (ret == 2) { - Controller::instance().quit(); + App::instance().engine()->quit(); App::instance().quit(); } // Otherwise cancelled, do nothing @@ -554,14 +555,14 @@ PatchWindow::event_quit() void PatchWindow::event_destroy() { - Controller::instance().destroy(m_patch->model()->path()); + App::instance().engine()->destroy(m_patch->model()->path()); } void PatchWindow::event_clear() { - Controller::instance().clear_patch(m_patch->model()->path()); + App::instance().engine()->clear_patch(m_patch->model()->path()); } void diff --git a/src/progs/ingenuity/PortController.cpp b/src/progs/ingenuity/PortController.cpp index a26c14eb..0668a9e0 100644 --- a/src/progs/ingenuity/PortController.cpp +++ b/src/progs/ingenuity/PortController.cpp @@ -57,7 +57,7 @@ PortController::destroy() void PortController::create_module(OmFlowCanvas* canvas) { - cerr << "Creating port module " << m_model->path() << endl; + //cerr << "Creating port module " << m_model->path() << endl; const string x_str = m_model->get_metadata("module-x"); const string y_str = m_model->get_metadata("module-y"); @@ -99,8 +99,6 @@ PortController::metadata_update(const string& key, const string& value) m_control_panel->set_range_max(m_model->path(), atof(value.c_str())); } */ - cerr << "FIXME: PortController::metadata_update" << endl; - if (m_module != NULL) { if (key == "module-x") { float x = atof(value.c_str()); diff --git a/src/progs/ingenuity/RenameWindow.cpp b/src/progs/ingenuity/RenameWindow.cpp index 52f5bc98..dfe4b07b 100644 --- a/src/progs/ingenuity/RenameWindow.cpp +++ b/src/progs/ingenuity/RenameWindow.cpp @@ -17,11 +17,11 @@ #include "RenameWindow.h" #include <cassert> #include <string> -#include "Controller.h" #include "ObjectModel.h" #include "GtkObjectController.h" #include "Store.h" #include "App.h" +#include "ModelEngineInterface.h" using std::string; namespace Ingenuity { @@ -105,7 +105,7 @@ RenameWindow::ok_clicked() assert(name.length() > 0); assert(name.find("/") == string::npos); - Controller::instance().rename(m_object->model()->path(), name); + App::instance().engine()->rename(m_object->model()->path(), name); hide(); } diff --git a/src/progs/ingenuity/SubpatchModule.cpp b/src/progs/ingenuity/SubpatchModule.cpp index 3133c7c9..36fecff3 100644 --- a/src/progs/ingenuity/SubpatchModule.cpp +++ b/src/progs/ingenuity/SubpatchModule.cpp @@ -17,6 +17,8 @@ #include "SubpatchModule.h" #include <cassert> #include <iostream> +#include "App.h" +#include "ModelEngineInterface.h" #include "OmModule.h" #include "NodeControlWindow.h" #include "PatchModel.h" @@ -24,7 +26,6 @@ #include "OmFlowCanvas.h" #include "PatchController.h" #include "OmPort.h" -#include "Controller.h" using std::cerr; using std::cout; using std::endl; namespace Ingenuity { @@ -96,7 +97,7 @@ SubpatchModule::show_dialog() void SubpatchModule::menu_remove() { - Controller::instance().destroy(m_patch->model()->path()); + App::instance().engine()->destroy(m_patch->model()->path()); } } // namespace Ingenuity diff --git a/src/progs/ingenuity/main.cpp b/src/progs/ingenuity/main.cpp index 034a1c85..d200c3d6 100644 --- a/src/progs/ingenuity/main.cpp +++ b/src/progs/ingenuity/main.cpp @@ -18,34 +18,14 @@ #include "cmdline.h" #include "ConnectWindow.h" #include "App.h" -#include "Store.h" -#include "Controller.h" #include "Configuration.h" #ifdef HAVE_LASH #include "LashController.h" #endif -#include "ThreadedSigClientInterface.h" -#include "OSCClientReceiver.h" -using Ingen::Shared::ClientInterface; using namespace Ingenuity; -class OSCSigEmitter : public OSCClientReceiver, public ThreadedSigClientInterface { -public: - OSCSigEmitter(size_t queue_size, int listen_port) - : Ingen::Shared::ClientInterface() - , OSCClientReceiver(listen_port) - , ThreadedSigClientInterface(queue_size) - { - Glib::signal_timeout().connect( - sigc::mem_fun((ThreadedSigClientInterface*)this, - &ThreadedSigClientInterface::emit_signals), - 5, G_PRIORITY_DEFAULT_IDLE); - } -}; - - int main(int argc, char** argv) { @@ -68,26 +48,22 @@ main(int argc, char** argv) Gnome::Canvas::init(); Gtk::Main gtk_main(argc, argv); - CountedPtr<SigClientInterface> emitter(new OSCSigEmitter(1024, 16181)); - /* Instantiate all singletons */ - App::instantiate(emitter); - - Controller::instantiate(engine_url); + App::instantiate(); /* Load settings */ App::instance().configuration()->load_settings(); App::instance().configuration()->apply_settings(); - #ifdef HAVE_LASH +#ifdef HAVE_LASH lash_args_t* lash_args = lash_extract_args(&argc, &argv); - #endif +#endif //gtk_main.signal_quit().connect(sigc::ptr_fun(cleanup)); - #ifdef HAVE_LASH +#ifdef HAVE_LASH LashController* lash_controller = new LashController(lash_args); - #endif +#endif App::instance().connect_window()->start(); gtk_main.run(); |