diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-09-26 21:09:43 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-09-26 21:09:43 +0200 |
commit | 7110cea433b6aa4ce973b5c89c9ff9721e64ef55 (patch) | |
tree | 9ad43d1c7430ec938dd5f9cfb1279bb43c7083b6 | |
parent | 6179c8f8f1a32c430a496176a03c8a04f50fc160 (diff) | |
download | osc-graphics-7110cea433b6aa4ce973b5c89c9ff9721e64ef55.tar.gz |
moved layer registration from OSCServer into main.cpp using new OSCServer::register_layer() method
also use a static CtorInfo structure in every layer class instead of macros
-rw-r--r-- | layer.h | 9 | ||||
-rw-r--r-- | layer_box.cpp | 4 | ||||
-rw-r--r-- | layer_box.h | 8 | ||||
-rw-r--r-- | layer_image.cpp | 2 | ||||
-rw-r--r-- | layer_image.h | 8 | ||||
-rw-r--r-- | layer_video.cpp | 2 | ||||
-rw-r--r-- | layer_video.h | 8 | ||||
-rw-r--r-- | main.cpp | 9 | ||||
-rw-r--r-- | osc_server.cpp | 86 | ||||
-rw-r--r-- | osc_server.h | 7 |
10 files changed, 79 insertions, 64 deletions
@@ -18,6 +18,15 @@ class Layer { SDL_mutex *mutex; public: + /* + * Every derived class must have a static CtorInfo struct "ctor_info" + * and a static "ctor_osc" method + */ + struct CtorInfo { + const char *name; + const char *types; + }; + SLIST_ENTRY(Layer) layers; char *name; diff --git a/layer_box.cpp b/layer_box.cpp index a05e971..b720d5c 100644 --- a/layer_box.cpp +++ b/layer_box.cpp @@ -6,10 +6,12 @@ #include "osc_graphics.h" #include "layer_box.h" +Layer::CtorInfo LayerBox::ctor_info = {"box", COLOR_TYPES}; + LayerBox::LayerBox(const char *name, SDL_Rect geo, float opacity, SDL_Color color) : Layer(name) { - color_osc_id = register_method("color", "iii", + color_osc_id = register_method("color", COLOR_TYPES, (OSCServer::MethodHandlerCb)color_osc); LayerBox::geo(geo); diff --git a/layer_box.h b/layer_box.h index 413ee07..1e4e5e3 100644 --- a/layer_box.h +++ b/layer_box.h @@ -7,18 +7,17 @@ #include "osc_server.h" #include "layer.h" -#define LayerBox_Info_Name "box" -#define LayerBox_Info_Types "iii" /* r, g, b */ +#define COLOR_TYPES "iii" /* r, g, b */ class LayerBox : public Layer { Sint16 x1, y1, x2, y2; Uint8 r, g, b, a; public: - static void register_layer() {} - LayerBox(const char *name, SDL_Rect geo, float opacity, SDL_Color color); + + static CtorInfo ctor_info; static Layer * ctor_osc(const char *name, SDL_Rect geo, float opacity, lo_arg **argv) { @@ -27,6 +26,7 @@ public: }; return new LayerBox(name, geo, opacity, color); } + ~LayerBox(); void frame(SDL_Surface *target); diff --git a/layer_image.cpp b/layer_image.cpp index 8f49471..897175a 100644 --- a/layer_image.cpp +++ b/layer_image.cpp @@ -8,6 +8,8 @@ #include "osc_graphics.h" #include "layer_image.h" +Layer::CtorInfo LayerImage::ctor_info = {"image", "s" /* file */}; + #if 0 static inline void diff --git a/layer_image.h b/layer_image.h index e374053..5f2271f 100644 --- a/layer_image.h +++ b/layer_image.h @@ -9,9 +9,6 @@ #include "osc_graphics.h" #include "layer.h" -#define LayerImage_Info_Name "image" -#define LayerImage_Info_Types "s" /* file */ - class LayerImage : public Layer { SDL_Surface *surf_alpha; /* with per-surface alpha */ SDL_Surface *surf_scaled; /* scaled image */ @@ -21,17 +18,18 @@ class LayerImage : public Layer { float alphav; public: - static void register_layer() {} - LayerImage(const char *name, SDL_Rect geo = (SDL_Rect){0, 0, 0, 0}, float opacity = 1., const char *file = NULL); + + static CtorInfo ctor_info; static Layer * ctor_osc(const char *name, SDL_Rect geo, float opacity, lo_arg **argv) { return new LayerImage(name, geo, opacity, &argv[0]->s); } + ~LayerImage(); void frame(SDL_Surface *target); diff --git a/layer_video.cpp b/layer_video.cpp index 15108bf..57ab4b9 100644 --- a/layer_video.cpp +++ b/layer_video.cpp @@ -11,6 +11,8 @@ #include "osc_graphics.h" #include "layer_video.h" +Layer::CtorInfo LayerVideo::ctor_info = {"video", "s" /* url */}; + static void * lock_cb(void *data, void **p_pixels) { diff --git a/layer_video.h b/layer_video.h index 880f88c..9b864d2 100644 --- a/layer_video.h +++ b/layer_video.h @@ -11,9 +11,6 @@ #include "osc_graphics.h" #include "layer.h" -#define LayerVideo_Info_Name "video" -#define LayerVideo_Info_Types "s" /* url */ - class LayerVideo : public Layer { libvlc_instance_t *vlcinst; libvlc_media_player_t *mp; @@ -28,17 +25,18 @@ class LayerVideo : public Layer { bool pausedv; public: - static void register_layer() {} - LayerVideo(const char *name, SDL_Rect geo = (SDL_Rect){0, 0, 0, 0}, float opacity = 1., const char *url = NULL); + + static CtorInfo ctor_info; static Layer * ctor_osc(const char *name, SDL_Rect geo, float opacity, lo_arg **argv) { return new LayerVideo(name, geo, opacity, &argv[0]->s); } + ~LayerVideo(); inline void * @@ -75,6 +75,11 @@ sdl_process_events(void) } } +#define REGISTER_LAYER(CLASS) \ + osc_server.register_layer(CLASS::ctor_info.name, \ + CLASS::ctor_info.types, \ + CLASS::ctor_osc) + int main(int argc, char **argv) { @@ -95,6 +100,10 @@ main(int argc, char **argv) return EXIT_FAILURE; } + REGISTER_LAYER(LayerImage); + REGISTER_LAYER(LayerVideo); + REGISTER_LAYER(LayerBox); + osc_server.start(); SDL_initFramerate(&fpsm); diff --git a/osc_server.cpp b/osc_server.cpp index 59ead72..ea7c939 100644 --- a/osc_server.cpp +++ b/osc_server.cpp @@ -6,11 +6,7 @@ #include <lo/lo.h> #include "osc_graphics.h" - #include "layer.h" -#include "layer_image.h" -#include "layer_video.h" -#include "layer_box.h" #include "osc_server.h" @@ -58,6 +54,39 @@ generic_handler(const char *path, const char *types, lo_arg **argv, return 1; } +OSCServer::OSCServer(const char *port) +{ + server = lo_server_thread_new(port, error_handler); + + add_method(NULL, generic_handler, NULL, ""); +} + +void +OSCServer::add_method_v(MethodHandlerId **hnd, const char *types, + lo_method_handler handler, void *data, + const char *fmt, va_list ap) +{ + char buf[255]; + + vsnprintf(buf, sizeof(buf), fmt, ap); + lo_server_thread_add_method(server, buf, types, handler, data); + + if (hnd) + *hnd = new MethodHandlerId(types, buf, data); +} + +void +OSCServer::del_method(const char *types, const char *fmt, ...) +{ + char buf[255]; + va_list ap; + + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + lo_server_thread_del_method(server, buf, types); + va_end(ap); +} + static int dtor_generic_handler(const char *path, const char *types __attribute__((unused)), @@ -83,8 +112,7 @@ ctor_generic_handler(const char *path __attribute__((unused)), void *data __attribute__((unused)), void *user_data) { - OSCServer::ConstructorHandlerCb const_cb = - (OSCServer::ConstructorHandlerCb)user_data; + OSCServer::CtorHandlerCb const_cb = (OSCServer::CtorHandlerCb)user_data; Layer *layer; SDL_Rect geo = { @@ -101,51 +129,15 @@ ctor_generic_handler(const char *path __attribute__((unused)), return 0; } -#define REGISTER_LAYER(CLASS) \ - do { \ - CLASS::register_layer(); \ - add_method(NEW_LAYER_TYPES CLASS##_Info_Types, \ - ctor_generic_handler, (void *)CLASS::ctor_osc, \ - "/layer/new/%s", CLASS##_Info_Name); \ - } while (0) - -OSCServer::OSCServer(const char *port) -{ - server = lo_server_thread_new(port, error_handler); - - add_method(NULL, generic_handler, NULL, ""); - - REGISTER_LAYER(LayerImage); - REGISTER_LAYER(LayerVideo); - REGISTER_LAYER(LayerBox); -} - -#undef REGISTER_LAYER - -void -OSCServer::add_method_v(MethodHandlerId **hnd, const char *types, - lo_method_handler handler, void *data, - const char *fmt, va_list ap) -{ - char buf[255]; - - vsnprintf(buf, sizeof(buf), fmt, ap); - lo_server_thread_add_method(server, buf, types, handler, data); - - if (hnd) - *hnd = new MethodHandlerId(types, buf, data); -} - void -OSCServer::del_method(const char *types, const char *fmt, ...) +OSCServer::register_layer(const char *name, const char *types, + CtorHandlerCb ctor_cb) { char buf[255]; - va_list ap; - va_start(ap, fmt); - vsnprintf(buf, sizeof(buf), fmt, ap); - lo_server_thread_del_method(server, buf, types); - va_end(ap); + snprintf(buf, sizeof(buf), "%s%s", NEW_LAYER_TYPES, types); + add_method(buf, ctor_generic_handler, (void *)ctor_cb, + "/layer/new/%s", name); } struct OscMethodDefaultCtx { diff --git a/osc_server.h b/osc_server.h index 7df4e88..b14dfa8 100644 --- a/osc_server.h +++ b/osc_server.h @@ -41,8 +41,8 @@ private: public: typedef void (*MethodHandlerCb)(Layer *obj, lo_arg **argv); - typedef Layer *(*ConstructorHandlerCb)(const char *name, SDL_Rect geo, - float alpha, lo_arg **argv); + typedef Layer *(*CtorHandlerCb)(const char *name, SDL_Rect geo, + float alpha, lo_arg **argv); OSCServer(const char *port); ~OSCServer(); @@ -87,6 +87,9 @@ public: delete hnd; } + void register_layer(const char *name, const char *types, + CtorHandlerCb ctor_cb); + MethodHandlerId *register_method(Layer *layer, const char *method, const char *types, MethodHandlerCb method_cb); |