summaryrefslogtreecommitdiffstats
path: root/src/progs/ingen/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/progs/ingen/main.cpp')
-rw-r--r--src/progs/ingen/main.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/src/progs/ingen/main.cpp b/src/progs/ingen/main.cpp
new file mode 100644
index 00000000..1ca1311a
--- /dev/null
+++ b/src/progs/ingen/main.cpp
@@ -0,0 +1,194 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * 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 <iostream>
+#include <string>
+#include <signal.h>
+#include <boost/optional.hpp>
+#include <raul/Path.h>
+#include <raul/RDFWorld.h>
+#include "config.h"
+#include "module/Module.h"
+#include "engine/Engine.h"
+#include "engine/QueuedEngineInterface.h"
+#include "serialisation/Loader.h"
+#include "cmdline.h"
+
+using namespace std;
+using namespace Ingen;
+
+SharedPtr<Engine> engine;
+
+
+void
+catch_int(int)
+{
+ signal(SIGINT, catch_int);
+ signal(SIGTERM, catch_int);
+
+ cout << "[Main] Ingen interrupted." << endl;
+ engine->quit();
+}
+
+
+int
+main(int argc, char** argv)
+{
+ /* Parse command line options */
+ gengetopt_args_info args;
+ if (cmdline_parser (argc, argv, &args) != 0)
+ return 1;
+
+ if (argc <= 1) {
+ cout << "No arguments provided. Try something like:" << endl << endl;
+ cout << "Run an engine: ingen -e" << endl;
+ cout << "Run the GUI: ingen -g" << endl;
+ cout << "Pring full help: ingen -h" << endl << endl;
+ cmdline_parser_print_help();
+ return 0;
+ }
+
+ SharedPtr<Glib::Module> engine_module;
+ SharedPtr<Glib::Module> gui_module;
+
+ SharedPtr<Shared::EngineInterface> engine_interface;
+
+ /* Run engine */
+ if (args.engine_flag) {
+
+ engine_module = Ingen::Shared::load_module("ingen_engine");
+
+ if (engine_module) {
+ /*if (args.engine_port_given) {
+ bool (*launch_engine)(int) = NULL;
+ if ( ! module->get_symbol("launch_osc_engine", (void*&)launch_engine))
+ module.reset();
+ else
+ launch_engine(args.engine_port_arg);
+
+ } else if (args.gui_given || args.load_given) {*/
+ Engine* (*new_engine)() = NULL;
+ if (engine_module->get_symbol("new_engine", (void*&)new_engine)) {
+ engine = SharedPtr<Engine>(new_engine());
+ engine->start_jack_driver();
+ //engine->launch_osc_interface(args.engine_port_arg);
+ } else {
+ engine_module.reset();
+ }
+ engine_interface = engine->new_queued_interface();
+ /*} else {
+ cerr << "Nonsense command line parameters, engine not loaded." << endl;
+ }*/
+ } else {
+ cerr << "Unable to load engine module, engine not loaded." << endl;
+ cerr << "Try running ingen_dev or setting INGEN_MODULE_PATH." << endl;
+ }
+
+ }
+
+
+ /* Connect to remote engine */
+ if (args.connect_given || (args.load_given && !engine_interface)) {
+ bool found = false;
+ SharedPtr<Glib::Module> client_module
+ = Ingen::Shared::load_module("ingen_client");
+
+ SharedPtr<Shared::EngineInterface> (*new_osc_interface)(const std::string&) = NULL;
+
+ if (client_module)
+ found = client_module->get_symbol("new_osc_interface", (void*&)new_osc_interface);
+
+ if (client_module && found) {
+ engine_interface = new_osc_interface(args.connect_arg);
+ } else {
+ cerr << "Unable to load ingen_client module, aborting." << endl;
+ return -1;
+ }
+ }
+
+
+ /* Load a patch */
+ if (args.load_given) {
+
+ Raul::RDF::World rdf_world;
+ rdf_world.add_prefix("xsd", "http://www.w3.org/2001/XMLSchema#");
+ rdf_world.add_prefix("ingen", "http://drobilla.net/ns/ingen#");
+ rdf_world.add_prefix("ingenuity", "http://drobilla.net/ns/ingenuity#");
+ rdf_world.add_prefix("lv2", "http://lv2plug.in/ontology#");
+ rdf_world.add_prefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#");
+ rdf_world.add_prefix("doap", "http://usefulinc.com/ns/doap#");
+
+ boost::optional<Raul::Path> parent_path;
+ if (args.path_given)
+ parent_path = args.path_arg;
+
+ bool found = false;
+ SharedPtr<Glib::Module> serialisation_module
+ = Ingen::Shared::load_module("ingen_serialisation");
+
+ Serialisation::Loader* (*new_loader)() = NULL;
+
+ if (serialisation_module)
+ found = serialisation_module->get_symbol("new_loader", (void*&)new_loader);
+
+ if (serialisation_module && found) {
+ SharedPtr<Serialisation::Loader> loader(new_loader());
+ loader->load(engine_interface, &rdf_world,
+ string("file:") + args.load_arg, parent_path, "");
+ } else {
+ cerr << "Unable to load serialisation module, aborting." << endl;
+ return -1;
+ }
+ }
+
+
+ /* Run GUI */
+ bool ran_gui = false;
+ if (args.gui_given) {
+ gui_module = Ingen::Shared::load_module("ingen_gui");
+ void (*run)(int, char**) = NULL;
+ bool found = gui_module->get_symbol("run", (void*&)run);
+
+ if (found) {
+ ran_gui = true;
+ run(argc, argv);
+ } else {
+ cerr << "Unable to find GUI module, GUI not loaded." << endl;
+ cerr << "Try running ingen_dev or setting INGEN_MODULE_PATH." << endl;
+ }
+ }
+
+
+ /* Didn't run the GUI, do our own main thing. */
+ if (engine && !ran_gui) {
+
+ signal(SIGINT, catch_int);
+ signal(SIGTERM, catch_int);
+
+ engine->start_jack_driver();
+ engine->start_osc_driver(args.engine_port_arg);
+
+ engine->activate();
+
+ engine->main();
+
+ engine.reset();
+ }
+
+ return 0;
+}
+