From 47246db7e9d71ba694b719001033fba1766a58c4 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 10 Jun 2006 02:43:54 +0000 Subject: More juggling git-svn-id: http://svn.drobilla.net/lad/grauph@16 a436a847-0d15-0410-975c-d299462d15a1 --- src/progs/patch_loader/Makefile.am | 13 +++ src/progs/patch_loader/README | 5 + src/progs/patch_loader/cmdline.c | 163 ++++++++++++++++++++++++++++ src/progs/patch_loader/cmdline.ggo | 7 ++ src/progs/patch_loader/cmdline.h | 47 ++++++++ src/progs/patch_loader/new_patch_loader.cpp | 76 +++++++++++++ src/progs/patch_loader/patch_loader.cpp | 82 ++++++++++++++ 7 files changed, 393 insertions(+) create mode 100644 src/progs/patch_loader/Makefile.am create mode 100644 src/progs/patch_loader/README create mode 100644 src/progs/patch_loader/cmdline.c create mode 100644 src/progs/patch_loader/cmdline.ggo create mode 100644 src/progs/patch_loader/cmdline.h create mode 100644 src/progs/patch_loader/new_patch_loader.cpp create mode 100644 src/progs/patch_loader/patch_loader.cpp (limited to 'src/progs/patch_loader') diff --git a/src/progs/patch_loader/Makefile.am b/src/progs/patch_loader/Makefile.am new file mode 100644 index 00000000..15e0c503 --- /dev/null +++ b/src/progs/patch_loader/Makefile.am @@ -0,0 +1,13 @@ +EXTRA_DIST = README + +om_patch_loader_CXXFLAGS = -I$(top_srcdir)/src/clients -I$(top_srcdir)/src/common -DPKGDATADIR=\"$(pkgdatadir)\" $(LXML2_CFLAGS) $(LOSC_CFLAGS) +om_patch_loader_LDADD = ../libomclient.a $(LOSC_LIBS) $(LXML2_LIBS) + +bin_PROGRAMS = om_patch_loader + +om_patch_loader_DEPENDENCIES = ../libomclient.a + +om_patch_loader_SOURCES = \ + patch_loader.cpp \ + cmdline.h \ + cmdline.c diff --git a/src/progs/patch_loader/README b/src/progs/patch_loader/README new file mode 100644 index 00000000..9f3b6f4b --- /dev/null +++ b/src/progs/patch_loader/README @@ -0,0 +1,5 @@ +This is a stand-alone patch loader for Om. It has no user interface, it +just launches, loads the patch(es) passed as a parameter, and exits. + +Useful for loading patches from scripts, other apps, etc. or just using +Om patches without loading the GUI. diff --git a/src/progs/patch_loader/cmdline.c b/src/progs/patch_loader/cmdline.c new file mode 100644 index 00000000..0606cb7b --- /dev/null +++ b/src/progs/patch_loader/cmdline.c @@ -0,0 +1,163 @@ +/* + File autogenerated by gengetopt version 2.10 + generated with the following command: + gengetopt -u + + The developers of gengetopt consider the fixed text that goes in all + gengetopt output files to be in the public domain: + we make no copyright claims on it. +*/ + + +#include +#include +#include + +/* If we use autoconf. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "getopt.h" + +#include "cmdline.h" + +void +cmdline_parser_print_version (void) +{ + printf ("%s %s\n", CMDLINE_PARSER_PACKAGE, CMDLINE_PARSER_VERSION); +} + +void +cmdline_parser_print_help (void) +{ + cmdline_parser_print_version (); + printf("\n" + "Usage: %s [OPTIONS]... [FILES]...\n", CMDLINE_PARSER_PACKAGE); + printf(" -h --help Print help and exit\n"); + printf(" -V --version Print version and exit\n"); + printf(" -uSTRING --engine-url=STRING Om engine URL to connect to\n"); + printf(" -pINT --client-port=INT Client port to listen on\n"); +} + + +static char *gengetopt_strdup (const char *s); + +/* gengetopt_strdup() */ +/* strdup.c replacement of strdup, which is not standard */ +char * +gengetopt_strdup (const char *s) +{ + char *result = (char*)malloc(strlen(s) + 1); + if (result == (char*)0) + return (char*)0; + strcpy(result, s); + return result; +} + +int +cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info) +{ + int c; /* Character of the parsed option. */ + int missing_required_options = 0; + + args_info->help_given = 0 ; + args_info->version_given = 0 ; + args_info->engine_url_given = 0 ; + args_info->client_port_given = 0 ; +#define clear_args() { \ + args_info->engine_url_arg = NULL; \ +} + + clear_args(); + + args_info->inputs = NULL; + args_info->inputs_num = 0; + + optarg = 0; + optind = 1; + opterr = 1; + optopt = '?'; + + while (1) + { + int option_index = 0; + char *stop_char; + + static struct option long_options[] = { + { "help", 0, NULL, 'h' }, + { "version", 0, NULL, 'V' }, + { "engine-url", 1, NULL, 'u' }, + { "client-port", 1, NULL, 'p' }, + { NULL, 0, NULL, 0 } + }; + + stop_char = 0; + c = getopt_long (argc, argv, "hVu:p:", long_options, &option_index); + + if (c == -1) break; /* Exit from `while (1)' loop. */ + + switch (c) + { + case 'h': /* Print help and exit. */ + clear_args (); + cmdline_parser_print_help (); + exit (EXIT_SUCCESS); + + case 'V': /* Print version and exit. */ + clear_args (); + cmdline_parser_print_version (); + exit (EXIT_SUCCESS); + + case 'u': /* Om engine URL to connect to. */ + if (args_info->engine_url_given) + { + fprintf (stderr, "%s: `--engine-url' (`-u') option given more than once\n", CMDLINE_PARSER_PACKAGE); + clear_args (); + exit (EXIT_FAILURE); + } + args_info->engine_url_given = 1; + args_info->engine_url_arg = gengetopt_strdup (optarg); + break; + + case 'p': /* Client port to listen on. */ + if (args_info->client_port_given) + { + fprintf (stderr, "%s: `--client-port' (`-p') option given more than once\n", CMDLINE_PARSER_PACKAGE); + clear_args (); + exit (EXIT_FAILURE); + } + args_info->client_port_given = 1; + args_info->client_port_arg = strtol (optarg,&stop_char,0); + break; + + + case 0: /* Long option with no short option */ + + case '?': /* Invalid option. */ + /* `getopt_long' already printed an error message. */ + exit (EXIT_FAILURE); + + default: /* bug: option not considered. */ + fprintf (stderr, "%s: option unknown: %c\n", CMDLINE_PARSER_PACKAGE, c); + abort (); + } /* switch */ + } /* while */ + + + if ( missing_required_options ) + exit (EXIT_FAILURE); + + if (optind < argc) + { + int i = 0 ; + + args_info->inputs_num = argc - optind ; + args_info->inputs = + (char **)(malloc ((args_info->inputs_num)*sizeof(char *))) ; + while (optind < argc) + args_info->inputs[ i++ ] = gengetopt_strdup (argv[optind++]) ; + } + + return 0; +} diff --git a/src/progs/patch_loader/cmdline.ggo b/src/progs/patch_loader/cmdline.ggo new file mode 100644 index 00000000..5acd6737 --- /dev/null +++ b/src/progs/patch_loader/cmdline.ggo @@ -0,0 +1,7 @@ +# Process this file with gengetopt -u to generate the necessary code (in cmdline.h, cmdline.c) + +package "om_patch_loader - A command line patch loading client for Om" + +option "engine-url" u "Om engine URL to connect to" string no +option "client-port" p "Client port to listen on" int no + diff --git a/src/progs/patch_loader/cmdline.h b/src/progs/patch_loader/cmdline.h new file mode 100644 index 00000000..b417c664 --- /dev/null +++ b/src/progs/patch_loader/cmdline.h @@ -0,0 +1,47 @@ +/* cmdline.h */ + +/* File autogenerated by gengetopt version 2.10 */ + +#ifndef CMDLINE_H +#define CMDLINE_H + +/* If we use autoconf. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifndef CMDLINE_PARSER_PACKAGE +#define CMDLINE_PARSER_PACKAGE "om_patch_loader - A command line patch loading client for the Om realtime modular synthesizer" +#endif + +#ifndef CMDLINE_PARSER_VERSION +#define CMDLINE_PARSER_VERSION VERSION +#endif + +struct gengetopt_args_info +{ + char * engine_url_arg; /* Om engine URL to connect to. */ + int client_port_arg; /* Client port to listen on. */ + + int help_given ; /* Whether help was given. */ + int version_given ; /* Whether version was given. */ + int engine_url_given ; /* Whether engine-url was given. */ + int client_port_given ; /* Whether client-port was given. */ + + char **inputs ; /* unamed options */ + unsigned inputs_num ; /* unamed options number */ +} ; + +int cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info); + +void cmdline_parser_print_help(void); +void cmdline_parser_print_version(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* CMDLINE_H */ diff --git a/src/progs/patch_loader/new_patch_loader.cpp b/src/progs/patch_loader/new_patch_loader.cpp new file mode 100644 index 00000000..8884e85b --- /dev/null +++ b/src/progs/patch_loader/new_patch_loader.cpp @@ -0,0 +1,76 @@ +/* This file is part of Om. Copyright (C) 2005 Dave Robillard. + * + * Om 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. + * + * Om 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., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include "cmdline.h" // generated by gengetopt +#include "util/Path.h" +#include "OSCEngineInterface.h" +#include "PatchLibrarian.h" + +using std::cout; using std::cerr; using std::endl; +using Om::Path; + +using namespace LibOmClient; + + +int +main(int argc, char** argv) +{ + const char* engine_url = NULL; + int client_port = 0; + + /* Parse command line options */ + gengetopt_args_info args_info; + if (cmdline_parser (argc, argv, &args_info) != 0) + return 1; + + if (args_info.engine_url_given) { + engine_url = args_info.engine_url_arg; + } else { + cout << "[Main] No engine URL specified. Attempting to use osc.udp://localhost:16180" << endl; + engine_url = "osc.udp://localhost:16180"; + } + + if (args_info.client_port_given) + client_port = args_info.client_port_arg; + else + client_port = 0; // will choose a free port automatically + + OSCEngineInterface engine(engine_url); + + /* Connect to engine */ + if (!engine.attach()) { + cerr << "Unable to connect to engine" << endl; + return 1; + } + + engine.activate(); + engine.register_client(); + + /*int id = engine.get_next_request_id(); + engine.set_wait_response_id(id); + engine.load_plugins(id); + engine.wait_for_response(); + */ + engine.load_plugins(); + + // Load patches + for (uint i=0; i < args_info.inputs_num; ++i) + PatchLibrarian::load_patch(&engine, args_info.inputs[i]); + + return 0; +} diff --git a/src/progs/patch_loader/patch_loader.cpp b/src/progs/patch_loader/patch_loader.cpp new file mode 100644 index 00000000..e8579ed7 --- /dev/null +++ b/src/progs/patch_loader/patch_loader.cpp @@ -0,0 +1,82 @@ +/* This file is part of Om. Copyright (C) 2005 Dave Robillard. + * + * Om 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. + * + * Om 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., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "OSCModelEngineInterface.h" +#include "PatchLibrarian.h" +#include "PatchModel.h" +#include "util/Path.h" +#include +#include +#include "cmdline.h" // generated by gengetopt + +using std::cout; using std::endl; +using Om::Path; + +using namespace LibOmClient; + +int main(int argc, char** argv) +{ + const char* engine_url = NULL; + int client_port = 0; + + /* **** Parse command line options **** */ + + gengetopt_args_info args_info; + if (cmdline_parser (argc, argv, &args_info) != 0) + return 1; + + if (args_info.engine_url_given) { + engine_url = args_info.engine_url_arg; + } else { + cout << "[Main] No engine URL specified. Attempting to use osc.udp://localhost:16180" << endl; + engine_url = "osc.udp://localhost:16180"; + } + + if (args_info.client_port_given) + client_port = args_info.client_port_arg; + + + /* **** Mr. Spock.. Engage **** */ + + + OSCModelEngineInterface osc_controller(engine_url); + PatchLibrarian librarian(&osc_controller); + + /* Connect to engine */ + osc_controller.attach(client_port); + osc_controller.activate(); + //osc_controller.register_client(NULL); // FIXME + + //int id = osc_controller.get_next_request_id(); + //osc_controller.set_wait_response_id(id); + //osc_controller.load_plugins(id); + //osc_controller.wait_for_response(); + /* FIXME: Make this work like this: + * osc_controller.load_plugins(); + * osc_controller.wait_for_response(); + */ + + // Load patches + for (uint i=0; i < args_info.inputs_num; ++i) { + PatchModel* pm = new PatchModel("", 0); + pm->filename(args_info.inputs[i]); + librarian.load_patch(pm, true); + delete pm; + } + + return 0; +} -- cgit v1.2.1