diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-09-27 02:12:53 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-09-27 02:12:53 +0200 |
commit | 26a1e2f3faecde5cc868b00ed08209c4a32eef3a (patch) | |
tree | fb6da34d91067c45fe1997eb6091ca0f4c9e3326 | |
parent | 857dee414b4e14d5053a659820ad0832bcd81668 (diff) | |
download | osc-graphics-26a1e2f3faecde5cc868b00ed08209c4a32eef3a.tar.gz |
support command line arguments
don't use getopt() since it's not in msvcrt
-rw-r--r-- | main.cpp | 119 | ||||
-rw-r--r-- | osc_server.cpp | 3 | ||||
-rw-r--r-- | osc_server.h | 3 |
3 files changed, 112 insertions, 13 deletions
@@ -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() { |