aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-09-26 21:09:43 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-09-26 21:09:43 +0200
commit7110cea433b6aa4ce973b5c89c9ff9721e64ef55 (patch)
tree9ad43d1c7430ec938dd5f9cfb1279bb43c7083b6
parent6179c8f8f1a32c430a496176a03c8a04f50fc160 (diff)
downloadosc-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.h9
-rw-r--r--layer_box.cpp4
-rw-r--r--layer_box.h8
-rw-r--r--layer_image.cpp2
-rw-r--r--layer_image.h8
-rw-r--r--layer_video.cpp2
-rw-r--r--layer_video.h8
-rw-r--r--main.cpp9
-rw-r--r--osc_server.cpp86
-rw-r--r--osc_server.h7
10 files changed, 79 insertions, 64 deletions
diff --git a/layer.h b/layer.h
index e16ce98..109535a 100644
--- a/layer.h
+++ b/layer.h
@@ -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 *
diff --git a/main.cpp b/main.cpp
index 1b3302f..1123c54 100644
--- a/main.cpp
+++ b/main.cpp
@@ -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);