aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-09-27 02:12:53 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-09-27 02:12:53 +0200
commit26a1e2f3faecde5cc868b00ed08209c4a32eef3a (patch)
treefb6da34d91067c45fe1997eb6091ca0f4c9e3326
parent857dee414b4e14d5053a659820ad0832bcd81668 (diff)
downloadosc-graphics-26a1e2f3faecde5cc868b00ed08209c4a32eef3a.tar.gz
support command line arguments
don't use getopt() since it's not in msvcrt
-rw-r--r--main.cpp119
-rw-r--r--osc_server.cpp3
-rw-r--r--osc_server.h3
3 files changed, 112 insertions, 13 deletions
diff --git a/main.cpp b/main.cpp
index 1123c54..62d6b97 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,4 +1,3 @@
-#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -6,8 +5,6 @@
#include <SDL.h>
#include <SDL_framerate.h>
-#include <lo/lo.h>
-
#include "osc_graphics.h"
#include "osc_server.h"
@@ -19,17 +16,23 @@
/*
* Default values
*/
-#define SCREEN_WIDTH 640
-#define SCREEN_HEIGHT 480
-#define FRAMERATE 20 /* Hz */
-#define PORT "7770"
+#define DEFAULT_SCREEN_WIDTH 640 /* pixels */
+#define DEFAULT_SCREEN_HEIGHT 480 /* pixels */
+#define DEFAULT_SCREEN_BPP 32 /* bits */
+#define DEFAULT_SDL_FLAGS (SDL_HWSURFACE | SDL_DOUBLEBUF)
+#define DEFAULT_SHOW_CURSOR SDL_ENABLE
+#define DEFAULT_FRAMERATE 20 /* Hz */
+#define DEFAULT_PORT "7770" /* port number/service/UNIX socket */
+
+#define BOOL2STR(X) \
+ ((X) ? "on" : "off")
/*
* Declarations
*/
SDL_Surface *screen;
-OSCServer osc_server(PORT);
+OSCServer osc_server;
LayerList layers;
int config_dump_osc = 0;
@@ -75,6 +78,85 @@ sdl_process_events(void)
}
}
+static void
+print_help(void)
+{
+ printf("osc-server [-h] [-p <port>] [-f] [-c] "
+ "[-W <width>] [-H <height>] "
+ "[-B <bpp>] [-F <framerate>]\n"
+ "Options:\n"
+ "\t-h Show this help\n"
+ "\t-p <port> Listen on port <port> (default: %s)\n"
+ "\t-f Toggle fullscreen (default: %s)\n"
+ "\t-c Toggle cursor displaying (default: %s)\n"
+ "\t-W <width> Set screen width (default: %d)\n"
+ "\t-H <height> Set screen height (default: %d)\n"
+ "\t-B <bpp> Set screen Bits per Pixel (default: %d)\n"
+ "\t-F <framerate> Set framerate in Hz (default: %d)\n",
+ DEFAULT_PORT,
+ BOOL2STR(DEFAULT_SDL_FLAGS & SDL_FULLSCREEN),
+ BOOL2STR(DEFAULT_SHOW_CURSOR),
+ DEFAULT_SCREEN_WIDTH, DEFAULT_SCREEN_HEIGHT,
+ DEFAULT_SCREEN_BPP,
+ DEFAULT_FRAMERATE);
+}
+
+static inline void
+parse_options(int argc, char **argv,
+ const char *&port, Uint32 &flags, int &show_cursor,
+ int &width, int &height, int &bpp, int &framerate)
+{
+ for (int i = 1; i < argc; i++) {
+ if (strlen(argv[i]) != 2 || argv[i][0] != '-')
+ goto error;
+
+ switch (argv[i][1]) {
+ case 'h':
+ print_help();
+ exit(EXIT_SUCCESS);
+ case 'p':
+ if (++i == argc)
+ goto error;
+ port = argv[i];
+ break;
+ case 'f':
+ flags ^= SDL_FULLSCREEN;
+ break;
+ case 'c':
+ show_cursor = !show_cursor;
+ break;
+ case 'W':
+ if (++i == argc)
+ goto error;
+ width = atoi(argv[i]);
+ break;
+ case 'H':
+ if (++i == argc)
+ goto error;
+ height = atoi(argv[i]);
+ break;
+ case 'B':
+ if (++i == argc)
+ goto error;
+ bpp = atoi(argv[i]);
+ break;
+ case 'F':
+ if (++i == argc)
+ goto error;
+ framerate = atoi(argv[i]);
+ break;
+ default:
+ goto error;
+ }
+ }
+
+ return;
+
+error:
+ print_help();
+ exit(EXIT_FAILURE);
+}
+
#define REGISTER_LAYER(CLASS) \
osc_server.register_layer(CLASS::ctor_info.name, \
CLASS::ctor_info.types, \
@@ -85,6 +167,18 @@ main(int argc, char **argv)
{
FPSmanager fpsm;
+ const char *port = DEFAULT_PORT;
+ Uint32 sdl_flags = DEFAULT_SDL_FLAGS;
+ int show_cursor = DEFAULT_SHOW_CURSOR;
+ int width = DEFAULT_SCREEN_WIDTH;
+ int height = DEFAULT_SCREEN_HEIGHT;
+ int bpp = DEFAULT_SCREEN_BPP;
+ int framerate = DEFAULT_FRAMERATE;
+
+ parse_options(argc, argv,
+ port, sdl_flags, show_cursor,
+ width, height, bpp, framerate);
+
if (SDL_Init(SDL_INIT_VIDEO)) {
SDL_ERROR("SDL_Init");
return EXIT_FAILURE;
@@ -93,13 +187,16 @@ main(int argc, char **argv)
SDL_WM_SetCaption("OSC Graphics", NULL);
- screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32,
- SDL_HWSURFACE | SDL_DOUBLEBUF);
+ screen = SDL_SetVideoMode(width, height, bpp, sdl_flags);
if (screen == NULL) {
SDL_ERROR("SDL_SetVideoMode");
return EXIT_FAILURE;
}
+ SDL_ShowCursor(show_cursor);
+
+ osc_server.open(port);
+
REGISTER_LAYER(LayerImage);
REGISTER_LAYER(LayerVideo);
REGISTER_LAYER(LayerBox);
@@ -107,7 +204,7 @@ main(int argc, char **argv)
osc_server.start();
SDL_initFramerate(&fpsm);
- SDL_setFramerate(&fpsm, FRAMERATE);
+ SDL_setFramerate(&fpsm, framerate);
for (;;) {
sdl_process_events();
diff --git a/osc_server.cpp b/osc_server.cpp
index d7c76d5..2178303 100644
--- a/osc_server.cpp
+++ b/osc_server.cpp
@@ -61,7 +61,8 @@ generic_handler(const char *path, const char *types, lo_arg **argv,
return 1;
}
-OSCServer::OSCServer(const char *port)
+void
+OSCServer::open(const char *port)
{
server = lo_server_thread_new(port, error_handler);
diff --git a/osc_server.h b/osc_server.h
index 2380028..3244096 100644
--- a/osc_server.h
+++ b/osc_server.h
@@ -45,9 +45,10 @@ public:
typedef Layer *(*CtorHandlerCb)(const char *name, SDL_Rect geo,
float alpha, lo_arg **argv);
- OSCServer(const char *port);
~OSCServer();
+ void open(const char *port);
+
inline void
start()
{