summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-12-18 17:25:11 +0000
committerDavid Robillard <d@drobilla.net>2009-12-18 17:25:11 +0000
commit4613a2e15f1122ecf6830171de0ab18dc22fefff (patch)
tree1155e554fa930ee5d32964a208ed3442af3fefce
parentc9150118609fd6304af284b1dbd60e673c5de8fa (diff)
downloadingen-4613a2e15f1122ecf6830171de0ab18dc22fefff.tar.gz
ingen-4613a2e15f1122ecf6830171de0ab18dc22fefff.tar.bz2
ingen-4613a2e15f1122ecf6830171de0ab18dc22fefff.zip
Only load network engine interface modules when needed.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2311 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--src/ingen/main.cpp69
-rw-r--r--src/shared/runtime_paths.hpp6
2 files changed, 36 insertions, 39 deletions
diff --git a/src/ingen/main.cpp b/src/ingen/main.cpp
index 8155e133..850c398a 100644
--- a/src/ingen/main.cpp
+++ b/src/ingen/main.cpp
@@ -19,11 +19,9 @@
#include <iostream>
#include <string>
#include <signal.h>
-#include <dlfcn.h>
#include <boost/optional.hpp>
#include <glibmm/convert.h>
#include <glibmm/miscutils.h>
-#include <glibmm/spawn.h>
#include <glibmm/thread.h>
#include "raul/Path.hpp"
#include "raul/SharedPtr.hpp"
@@ -37,24 +35,21 @@
#include "engine/JackAudioDriver.hpp"
#include "serialisation/Parser.hpp"
#include "cmdline.h"
-
#ifdef HAVE_LIBLO
#include "engine/OSCEngineReceiver.hpp"
#endif
#ifdef HAVE_SOUP
#include "engine/HTTPEngineReceiver.hpp"
#endif
-
#ifdef WITH_BINDINGS
#include "bindings/ingen_bindings.hpp"
#endif
using namespace std;
-using namespace Ingen;
-using namespace Ingen::Shared;
using namespace Raul;
+using namespace Ingen;
-SharedPtr<Engine> engine;
+SharedPtr<Ingen::Engine> engine;
void
catch_int(int)
@@ -69,15 +64,15 @@ catch_int(int)
int
main(int argc, char** argv)
{
- /* Parse command line options */
+ // Parse command line options
gengetopt_args_info args;
if (cmdline_parser (argc, argv, &args) != 0)
return 1;
if (argc <= 1) {
cmdline_parser_print_help();
- cerr << endl << "*** Ingen requires at least one command line parameter" << endl;
- cerr << "*** Just want a graphical application? Try 'ingen -eg'" << endl;
+ cerr << endl << "*** Ingen requires at least one command line parameter" << endl;
+ cerr << "*** Just want a graphical application? Try 'ingen -eg'" << endl;
return 1;
} else if (args.connect_given && args.engine_flag) {
cerr << "\n*** Nonsense arguments, can't both run a local engine "
@@ -86,7 +81,7 @@ main(int argc, char** argv)
return 1;
}
- /* Set bundle path from executable location so resources/modules can be found */
+ // Set bundle path from executable location so resources/modules can be found
Shared::set_bundle_path_from_code((void*)&main);
SharedPtr<Glib::Module> engine_module;
@@ -107,7 +102,7 @@ main(int argc, char** argv)
Ingen::Shared::World* world = Ingen::Shared::get_world();
- /* Set up RDF world */
+ // Set up RDF namespaces
world->rdf_world->add_prefix("dc", "http://purl.org/dc/elements/1.1/");
world->rdf_world->add_prefix("doap", "http://usefulinc.com/ns/doap#");
world->rdf_world->add_prefix("ingen", "http://drobilla.net/ns/ingen#");
@@ -120,12 +115,10 @@ main(int argc, char** argv)
world->rdf_world->add_prefix("sp", "http://lv2plug.in/ns/dev/string-port#");
world->rdf_world->add_prefix("xsd", "http://www.w3.org/2001/XMLSchema#");
- /* Run engine */
+ // Run engine
if (args.engine_flag) {
- engine_module = Ingen::Shared::load_module("ingen_engine");
- engine_http_module = Ingen::Shared::load_module("ingen_engine_http");
- engine_osc_module = Ingen::Shared::load_module("ingen_engine_osc");
- engine_jack_module = Ingen::Shared::load_module("ingen_engine_jack");
+ engine_module = Ingen::Shared::load_module("ingen_engine");
+ engine_jack_module = Ingen::Shared::load_module("ingen_engine_jack");
engine_queued_module = Ingen::Shared::load_module("ingen_engine_queued");
if (!engine_queued_module) {
@@ -139,7 +132,8 @@ main(int argc, char** argv)
if (engine_module->get_symbol("new_engine", (void*&)new_engine)) {
engine = SharedPtr<Engine>(new_engine(world));
world->local_engine = engine;
- /* Load queued (direct in-process) engine interface */
+
+ // Load queued (direct in-process) engine interface
if (args.gui_given && engine_queued_module) {
Ingen::QueuedEngineInterface* (*new_interface)(Ingen::Engine& engine);
if (engine_queued_module->get_symbol("new_queued_interface", (void*&)new_interface)) {
@@ -148,25 +142,27 @@ main(int argc, char** argv)
engine_interface = interface;
world->engine = engine_interface;
}
+
+ // Load network engine interfaces
} else {
#ifdef HAVE_LIBLO
- if (engine_osc_module) {
+ if ((engine_osc_module = Ingen::Shared::load_module("ingen_engine_osc"))) {
Ingen::OSCEngineReceiver* (*new_receiver)(
Ingen::Engine& engine, size_t queue_size, uint16_t port);
if (engine_osc_module->get_symbol("new_osc_receiver", (void*&)new_receiver)) {
static const size_t queue_size = 1024; // FIXME
- SharedPtr<EventSource> source(new_receiver(*engine,
- queue_size, args.engine_port_arg));
- world->local_engine->add_event_source(source);
+ SharedPtr<EventSource> receiver(new_receiver(
+ *engine, queue_size, args.engine_port_arg));
+ world->local_engine->add_event_source(receiver);
}
}
#endif
#ifdef HAVE_SOUP
- if (engine_http_module) {
- // FIXE: leak
- Ingen::HTTPEngineReceiver* (*new_receiver)(Ingen::Engine& engine, uint16_t port);
+ if ((engine_http_module = Ingen::Shared::load_module("ingen_engine_http"))) {
+ Ingen::HTTPEngineReceiver* (*new_receiver)(
+ Ingen::Engine& engine, uint16_t port);
if (engine_http_module->get_symbol("new_http_receiver", (void*&)new_receiver)) {
- boost::shared_ptr<HTTPEngineReceiver> receiver(new_receiver(
+ SharedPtr<EventSource> receiver(new_receiver(
*world->local_engine, args.engine_port_arg));
world->local_engine->add_event_source(receiver);
}
@@ -181,14 +177,14 @@ main(int argc, char** argv)
}
}
- /* Load client library */
+ // Load client library
if (args.load_given || args.gui_given) {
client_module = Ingen::Shared::load_module("ingen_client");
if (!client_module)
cerr << "Unable to load client module." << endl;
}
- /* If we don't have a local engine interface (for GUI), use network */
+ // If we don't have a local engine interface (for GUI), use network
if (client_module && ! engine_interface) {
SharedPtr<Shared::EngineInterface> (*new_remote_interface)
(Ingen::Shared::World*, const std::string&) = NULL;
@@ -202,7 +198,7 @@ main(int argc, char** argv)
}
}
- /* Activate the engine, if we have one */
+ // Activate the engine, if we have one
if (engine) {
Ingen::JackAudioDriver* (*new_driver)(
Ingen::Engine& engine,
@@ -210,7 +206,7 @@ main(int argc, char** argv)
const std::string client_name,
void* jack_client) = NULL;
if (engine_jack_module->get_symbol("new_jack_audio_driver", (void*&)new_driver)) {
- engine->set_driver(PortType::AUDIO, SharedPtr<Driver>(new_driver(
+ engine->set_driver(Shared::PortType::AUDIO, SharedPtr<Driver>(new_driver(
*engine, "default", args.engine_name_arg, NULL)));
} else {
cerr << Glib::Module::get_last_error() << endl;
@@ -223,7 +219,7 @@ main(int argc, char** argv)
void (*gui_run)() = NULL;
- /* Load GUI */
+ // Load GUI
bool run_gui = false;
if (args.gui_given) {
gui_module = Ingen::Shared::load_module("ingen_gui");
@@ -243,7 +239,7 @@ main(int argc, char** argv)
}
}
- /* Load a patch */
+ // Load a patch
if (args.load_given && engine_interface) {
boost::optional<Path> data_path = Path("/");
boost::optional<Path> parent;
@@ -295,11 +291,11 @@ main(int argc, char** argv)
}
}
- /* Run GUI (if applicable) */
+ // Run GUI (if applicable)
if (run_gui)
gui_run();
- /* Run a script */
+ // Run a script
if (args.run_given) {
#ifdef WITH_BINDINGS
bool (*run_script)(Ingen::Shared::World*, const char*) = NULL;
@@ -321,13 +317,14 @@ main(int argc, char** argv)
cerr << "This build of ingen does not support scripting." << endl;
#endif
- /* Listen to OSC and do our own main thing. */
+ // Listen to OSC and run main loop
} else if (engine && !run_gui) {
signal(SIGINT, catch_int);
signal(SIGTERM, catch_int);
- engine->main();
+ engine->main(); // Block here
}
+ // Shut down
if (engine) {
engine->deactivate();
engine.reset();
diff --git a/src/shared/runtime_paths.hpp b/src/shared/runtime_paths.hpp
index e7ee6b6e..c832f087 100644
--- a/src/shared/runtime_paths.hpp
+++ b/src/shared/runtime_paths.hpp
@@ -15,8 +15,8 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#ifndef INGEN_DATA_FILE_HPP
-#define INGEN_DATA_FILE_HPP
+#ifndef INGEN_RUNTIME_PATHS_HPP
+#define INGEN_RUNTIME_PATHS_HPP
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
@@ -35,4 +35,4 @@ std::string module_path(const std::string& name);
} // namespace Ingen
} // namespace Shared
-#endif // INGEN_DATA_FILE_HPP
+#endif // INGEN_RUNTIME_PATHS_HPP