From a6fb6a0289ea47692d87f3e0200532a426f8e60d Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 28 Jul 2008 21:56:03 +0000 Subject: Simply global memory management crap by using shared_ptr in the World struct (it's not C anyway, might as well). Properly support LV2 events from plugin UIs over OSC and directly (w/ monolithic UI/engine). Fix crashes on node destruction with monolithic UI/engine. Resolves ticket #177. git-svn-id: http://svn.drobilla.net/lad/ingen@1293 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/gui/ConnectWindow.cpp | 59 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 29 deletions(-) (limited to 'src/libs/gui/ConnectWindow.cpp') diff --git a/src/libs/gui/ConnectWindow.cpp b/src/libs/gui/ConnectWindow.cpp index 7bf34c01..288b30cc 100644 --- a/src/libs/gui/ConnectWindow.cpp +++ b/src/libs/gui/ConnectWindow.cpp @@ -106,15 +106,14 @@ ConnectWindow::ConnectWindow(BaseObjectType* cobject, const Glib::RefPtr engine, SharedPtr interface) +ConnectWindow::start(Ingen::Shared::World* world) { - set_connected_to(interface); - - if (engine) { - _engine = engine; + if (world->local_engine) { _mode = INTERNAL; _internal_radio->set_active(true); } + + set_connected_to(world->engine); show(); connect(); @@ -156,7 +155,7 @@ ConnectWindow::set_connected_to(SharedPtr engine) _progress_label->set_text(string("Disconnected")); } - App::instance().world()->engine = engine.get(); + App::instance().world()->engine = engine; } @@ -169,7 +168,6 @@ void ConnectWindow::connect() { assert(!_attached); - assert(!App::instance().engine()); assert(!App::instance().client()); _connect_button->set_sensitive(false); @@ -184,14 +182,16 @@ ConnectWindow::connect() _port_spinbutton->set_sensitive(false); _connect_stage = 0; + + Ingen::Shared::World* world = App::instance().world(); if (_mode == CONNECT_REMOTE) { - SharedPtr engine( - new OSCEngineSender(_url_entry->get_text())); + world->engine = SharedPtr( + new OSCEngineSender(_url_entry->get_text())); OSCSigEmitter* ose = new OSCSigEmitter(1024, 16181); // FIXME: args SharedPtr client(ose); - App::instance().attach(engine, client); + App::instance().attach(client); Glib::signal_timeout().connect( sigc::mem_fun(App::instance(), &App::gtk_main_iteration), 40, G_PRIORITY_DEFAULT); @@ -207,36 +207,38 @@ ConnectWindow::connect() const string cmd = string("ingen -e --engine-port=").append(port_str); if (Raul::Process::launch(cmd)) { - SharedPtr engine( - new OSCEngineSender(string("osc.udp://localhost:").append(port_str))); + world->engine = SharedPtr( + new OSCEngineSender(string("osc.udp://localhost:").append(port_str))); - OSCSigEmitter* ose = new OSCSigEmitter(1024, 16181); // FIXME: args - SharedPtr client(ose); - App::instance().attach(engine, client); - - Glib::signal_timeout().connect( - sigc::mem_fun(App::instance(), &App::gtk_main_iteration), 40, G_PRIORITY_DEFAULT); + OSCSigEmitter* ose = new OSCSigEmitter(1024, 16181); // FIXME: args + SharedPtr client(ose); + App::instance().attach(client); - Glib::signal_timeout().connect( - sigc::mem_fun(this, &ConnectWindow::gtk_callback), 100); + Glib::signal_timeout().connect( + sigc::mem_fun(App::instance(), &App::gtk_main_iteration), 40, G_PRIORITY_DEFAULT); + + Glib::signal_timeout().connect( + sigc::mem_fun(this, &ConnectWindow::gtk_callback), 100); } else { cerr << "Failed to launch ingen process." << endl; } } else if (_mode == INTERNAL) { + Ingen::Shared::World* world = App::instance().world(); assert(_new_engine); - _engine = SharedPtr(_new_engine(App::instance().world())); - App::instance().world()->local_engine = _engine.get(); + if ( ! world->local_engine) + world->local_engine = SharedPtr(_new_engine(world)); + + if ( ! world->engine) + world->engine = world->local_engine->new_queued_interface(); - SharedPtr engine_interface = _engine->new_queued_interface(); - SharedPtr client(new SigClientInterface()); - _engine->start_jack_driver(); - _engine->activate(1); // FIXME: parallelism + world->local_engine->start_jack_driver(); + world->local_engine->activate(1); // FIXME: parallelism - App::instance().attach(engine_interface, client); + App::instance().attach(client); Glib::signal_timeout().connect( sigc::mem_fun(App::instance(), &App::gtk_main_iteration), 40, G_PRIORITY_DEFAULT); @@ -258,8 +260,7 @@ ConnectWindow::disconnect() _disconnect_button->set_sensitive(false); App::instance().detach(); - - set_connected_to(); + set_connected_to(SharedPtr()); _connect_button->set_sensitive(true); _disconnect_button->set_sensitive(false); -- cgit v1.2.1