diff options
Diffstat (limited to 'src/progs/ingenuity/ConnectWindow.cpp')
-rw-r--r-- | src/progs/ingenuity/ConnectWindow.cpp | 94 |
1 files changed, 50 insertions, 44 deletions
diff --git a/src/progs/ingenuity/ConnectWindow.cpp b/src/progs/ingenuity/ConnectWindow.cpp index 6e5b6c67..322750ea 100644 --- a/src/progs/ingenuity/ConnectWindow.cpp +++ b/src/progs/ingenuity/ConnectWindow.cpp @@ -21,25 +21,24 @@ #include <stdlib.h> #include <sys/time.h> #include <sys/resource.h> -#include "raul/Process.h" +#include <raul/Process.h> #include "config.h" -#include "ConnectWindow.h" #include "interface/ClientKey.h" -#include "OSCModelEngineInterface.h" -#include "OSCClientReceiver.h" -#include "ThreadedSigClientInterface.h" -#include "Store.h" -#include "PatchModel.h" +#include "interface/EngineInterface.h" +#include "engine/tuning.h" +#include "engine/Engine.h" +#include "engine/DirectResponder.h" +#include "engine/QueuedEngineInterface.h" +#include "client/OSCClientReceiver.h" +#include "client/OSCEngineSender.h" +#include "client/ThreadedSigClientInterface.h" +#include "client/Store.h" +#include "client/PatchModel.h" +#include "module/Module.h" #include "App.h" #include "WindowFactory.h" -#ifdef MONOLITHIC_INGENUITY - #include "engine/Engine.h" - #include "engine/JackAudioDriver.h" - #include "engine/QueuedEngineInterface.h" - #include "engine/DirectResponder.h" - #include "engine/tuning.h" +#include "ConnectWindow.h" using Ingen::QueuedEngineInterface; -#endif using Ingen::Client::ThreadedSigClientInterface; namespace Ingenuity { @@ -58,18 +57,6 @@ struct OSCSigEmitter : public OSCClientReceiver, public ThreadedSigClientInterfa }; -#ifdef MONOLITHIC_INGENUITY -struct QueuedModelEngineInterface : public QueuedEngineInterface, public ModelEngineInterface { - QueuedModelEngineInterface(SharedPtr<Ingen::Engine> engine) - : Ingen::Shared::EngineInterface() - , Ingen::QueuedEngineInterface(engine, Ingen::event_queue_size, Ingen::event_queue_size) - { - QueuedEventSource::start(); - } -}; -#endif - - // ConnectWindow @@ -79,6 +66,8 @@ ConnectWindow::ConnectWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome:: , _ping_id(-1) , _attached(false) , _connect_stage(0) + , _new_engine(NULL) + , _new_queued_engine_interface(NULL) { xml->get_widget("connect_icon", _icon); xml->get_widget("connect_progress_bar", _progress_bar); @@ -91,13 +80,29 @@ ConnectWindow::ConnectWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome:: xml->get_widget("connect_disconnect_button", _disconnect_button); xml->get_widget("connect_connect_button", _connect_button); xml->get_widget("connect_quit_button", _quit_button); - + _server_radio->signal_toggled().connect(sigc::mem_fun(this, &ConnectWindow::server_toggled)); _launch_radio->signal_toggled().connect(sigc::mem_fun(this, &ConnectWindow::launch_toggled)); _internal_radio->signal_clicked().connect(sigc::mem_fun(this, &ConnectWindow::internal_toggled)); _disconnect_button->signal_clicked().connect(sigc::mem_fun(this, &ConnectWindow::disconnect)); _connect_button->signal_clicked().connect(sigc::mem_fun(this, &ConnectWindow::connect)); _quit_button->signal_clicked().connect(sigc::mem_fun(this, &ConnectWindow::quit)); + + _engine_module = Ingen::Shared::load_module("ingen_engine"); + + if (!_engine_module) { + cerr << "Unable to load ingen_engine module, internal engine unavailable." << endl; + cerr << "If you are running from the source tree, run ingenuity_dev." << endl; + } + + bool found1 = _engine_module->get_symbol("new_engine", (void*&)_new_engine); + bool found2 = _engine_module->get_symbol("new_queued_engine_interface", + (void*&)_new_queued_engine_interface); + + if (!found1 || !found2) { + cerr << "Unable to find module entry point, internal engine unavailable." << endl; + _engine_module.reset(); + } } @@ -121,11 +126,10 @@ 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 + if (_new_engine) + _internal_radio->set_sensitive(true); + else + _internal_radio->set_sensitive(false); server_toggled(); _progress_label->set_text(string("Disconnected")); @@ -151,8 +155,8 @@ ConnectWindow::connect() _connect_stage = 0; if (_mode == CONNECT_REMOTE) { - SharedPtr<ModelEngineInterface> engine( - new OSCModelEngineInterface(_url_entry->get_text())); + SharedPtr<EngineInterface> engine( + new OSCEngineSender(_url_entry->get_text())); OSCSigEmitter* ose = new OSCSigEmitter(1024, 16181); // FIXME: args SharedPtr<SigClientInterface> client(ose); @@ -172,8 +176,8 @@ ConnectWindow::connect() const string cmd = string("ingen --port=").append(port_str); if (Raul::Process::launch(cmd)) { - SharedPtr<ModelEngineInterface> engine( - new OSCModelEngineInterface(string("osc.udp://localhost:").append(port_str))); + SharedPtr<EngineInterface> engine( + new OSCEngineSender(string("osc.udp://localhost:").append(port_str))); OSCSigEmitter* ose = new OSCSigEmitter(1024, 16181); // FIXME: args SharedPtr<SigClientInterface> client(ose); @@ -189,13 +193,14 @@ ConnectWindow::connect() cerr << "Failed to launch ingen process." << endl; } -#ifdef MONOLITHIC_INGENUITY } else if (_mode == INTERNAL) { - SharedPtr<Ingen::Engine> engine(new Ingen::Engine()); - SharedPtr<Ingen::AudioDriver> audio_driver( - new Ingen::JackAudioDriver(*engine.get()) ); - SharedPtr<QueuedModelEngineInterface> engine_interface( - new QueuedModelEngineInterface(engine) ); + assert(_new_engine); + SharedPtr<Ingen::Engine> engine(_new_engine()); + engine->start_jack_driver(); + + assert(_new_queued_engine_interface); + SharedPtr<Ingen::QueuedEngineInterface> engine_interface(_new_queued_engine_interface(*engine.get())); + ThreadedSigClientInterface* tsci = new ThreadedSigClientInterface(Ingen::event_queue_size); SharedPtr<SigClientInterface> client(tsci); @@ -203,7 +208,9 @@ ConnectWindow::connect() engine_interface->set_responder(SharedPtr<Ingen::Responder>(new Ingen::DirectResponder(client, 1))); - engine->activate(audio_driver, engine_interface); + engine->set_event_source(engine_interface); + + engine->activate(); Glib::signal_timeout().connect( sigc::mem_fun(engine.get(), &Ingen::Engine::main_iteration), 1000); @@ -213,7 +220,6 @@ ConnectWindow::connect() Glib::signal_timeout().connect( sigc::mem_fun(tsci, &ThreadedSigClientInterface::emit_signals), 2, G_PRIORITY_HIGH_IDLE); -#endif } } |