Revision: 10133 http://pure-data.svn.sourceforge.net/pure-data/?rev=10133&view=rev Author: zmoelnig Date: 2008-07-02 04:34:38 -0700 (Wed, 02 Jul 2008)
Log Message: ----------- renamed: dmxout_threaded to dmxout and dmxout to dmxout_b (blocking)
Added Paths: ----------- trunk/externals/iem/dmx512/src/dmxout.c trunk/externals/iem/dmx512/src/dmxout_b.c
Removed Paths: ------------- trunk/externals/iem/dmx512/src/dmxout.c trunk/externals/iem/dmx512/src/dmxout_threaded.c
Deleted: trunk/externals/iem/dmx512/src/dmxout.c =================================================================== --- trunk/externals/iem/dmx512/src/dmxout.c 2008-07-02 11:33:21 UTC (rev 10132) +++ trunk/externals/iem/dmx512/src/dmxout.c 2008-07-02 11:34:38 UTC (rev 10133) @@ -1,240 +0,0 @@ -/****************************************************** - * - * dmxout - implementation file - * - * copyleft (c) IOhannes m zm\xF6lnig - * - * 0603:forum::f\xFCr::uml\xE4ute:2008 - * - * institute of electronic music and acoustics (iem) - * - ****************************************************** - * - * license: GNU General Public License v.2 - * - ******************************************************/ - -#include "dmx4pd.h" - -#include <unistd.h> -#include <string.h> -#include <stdio.h> - -static t_class *dmxout_class; -static t_class *dmxout_class2; - -#define NUM_DMXVALUES 512 - -typedef struct _dmxout -{ - t_object x_obj; - - t_inlet *x_portinlet; - - int x_device; - t_float x_port; - int x_portrange; - - dmx_t x_values[NUM_DMXVALUES]; -} t_dmxout; - -static void dmxout_clearbuf(t_dmxout*x) -{ - int i=0; - for(i=0; i<NUM_DMXVALUES; i++) x->x_values[i]=0; -} - -static void dmxout_close(t_dmxout*x) -{ - if(x->x_device>=0) { - close(x->x_device); - } - x->x_device=-1; -} - - -static void dmxout_open(t_dmxout*x, t_symbol*s_devname) -{ - int argc=2; - const char *args[2] = {"--dmx", s_devname->s_name}; - const char**argv=args; - const char*devname=""; - int fd; - - dmxout_close(x); - - if(s_devname && s_devname->s_name) - devname=s_devname->s_name; - - // strncpy(args[0], "--dmx", MAXPDSTRING); - // strncpy(args[1], devname, MAXPDSTRING); - verbose(2, "[dmxout]: trying to open '%s'", args[1]); - devname=DMXdev(&argc, argv); - if(!devname){ - pd_error(x, "couldn't find DMX device"); - return; - } - verbose(1, "[dmxout] opening %s", devname); - - fd = open (devname, O_WRONLY | O_NONBLOCK); - - if(fd!=-1) { - x->x_device=fd; - dmxout_clearbuf(x); - } else { - pd_error(x, "failed to open DMX-device '%s'",devname); - } -} - -static void dmxout_doout(t_dmxout*x) { - int device = x->x_device; - if(device<=0) { - pd_error(x, "no DMX universe found"); - return; - } - - lseek (device, 0, SEEK_SET); /* set to the current channel */ - write (device, x->x_values, NUM_DMXVALUES); /* write the channel */ -} - - -static void dmxout_doout1(t_dmxout*x, short port, unsigned char value) -{ - x->x_values[port]=value; - dmxout_doout(x); -} - - -static void dmxout_float(t_dmxout*x, t_float f) -{ - unsigned char val=(unsigned char)f; - short port = (short)x->x_port; - if(f<0. || f>255.) { - pd_error(x, "value %f out of bounds [0..255]", f); - return; - } - if(x->x_port<0. || x->x_port>NUM_DMXVALUES) { - pd_error(x, "port %f out of bounds [0..%d]", x->x_port, NUM_DMXVALUES); - return; - } - - dmxout_doout1(x, port, val); -} - -static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) -{ - int count=(argc<x->x_portrange)?argc:x->x_portrange; - int i=0; - int errors=0; - - int port=x->x_port; - if((port+count)>=NUM_DMXVALUES) { - if(count>NUM_DMXVALUES)count=NUM_DMXVALUES; - port=NUM_DMXVALUES-count; - } - - for(i=0; i<count; i++) { - t_float f=atom_getfloat(argv+i); - if(f<0. || f>255.) { - errors++; - if(f<0.)f=0.; - if(f>255)f=255; - } - x->x_values[port+i]=(unsigned char)f; - } - if(errors) { - pd_error(x, "%d valu%s out of bound [0..255]", errors, (1==errors)?"e":"es"); - } - - dmxout_doout(x); -} - -static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) -{ - short baseport =(short)f_baseport; - short portrange=(short)f_portrange; - - - if(baseport<0 || baseport>=NUM_DMXVALUES) { - pd_error(x, "port %f out of bounds [0..%d]", f_baseport, NUM_DMXVALUES); - baseport =0; - } - x->x_port = baseport; - - if(portrange<0) { - pd_error(x, "portrange %f<0! setting to 1", portrange); - portrange=1; - } else if (portrange==0) { - portrange=x->x_portrange; - } - - if (baseport+portrange>NUM_DMXVALUES) { - pd_error(x, "upper port exceeds %d! clamping", NUM_DMXVALUES); - portrange=NUM_DMXVALUES-baseport; - } - x->x_portrange=portrange; -} - -static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) -{ - t_floatarg baseport=0.f, portrange=0.f; - t_dmxout *x = 0; - - switch(argc) { - case 2: - x=(t_dmxout *)pd_new(dmxout_class2); - x->x_portinlet=inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("port")); - baseport=atom_getfloat(argv); - portrange=atom_getfloat(argv+1); - dmxout_port(x, baseport, portrange); - break; - case 1: - baseport=atom_getfloat(argv); - case 0: - x=(t_dmxout *)pd_new(dmxout_class); - x->x_portinlet=floatinlet_new(&x->x_obj, &x->x_port); - x->x_port = baseport; - x->x_portrange = -1; - break; - default: - return 0; - } - x->x_device=-1; - - dmxout_open(x, gensym("")); - return (x); -} - -static void *dmxout_free(t_dmxout*x) -{ - dmxout_close(x); -} - - -void dmxout_setup(void) -{ -#ifdef DMX4PD_POSTBANNER - DMX4PD_POSTBANNER; -#endif - - dmxout_class = class_new(gensym("dmxout"), (t_newmethod)dmxout_new, (t_method)dmxout_free, - sizeof(t_dmxout), - 0, - A_GIMME, A_NULL); - - class_addfloat(dmxout_class, dmxout_float); - class_addmethod(dmxout_class, (t_method)dmxout_open, gensym("open"), A_SYMBOL, A_NULL); - - dmxout_class2 = class_new(gensym("dmxout"), (t_newmethod)dmxout_new, (t_method)dmxout_free, - sizeof(t_dmxout), - 0, - A_GIMME, A_NULL); - - class_addlist(dmxout_class2, dmxout_list); - - - class_addmethod(dmxout_class2, (t_method)dmxout_port, gensym("port"), - A_FLOAT, A_DEFFLOAT, A_NULL); - - class_addmethod(dmxout_class2, (t_method)dmxout_open, gensym("open"), A_SYMBOL, A_NULL); -}
Copied: trunk/externals/iem/dmx512/src/dmxout.c (from rev 10132, trunk/externals/iem/dmx512/src/dmxout_threaded.c) =================================================================== --- trunk/externals/iem/dmx512/src/dmxout.c (rev 0) +++ trunk/externals/iem/dmx512/src/dmxout.c 2008-07-02 11:34:38 UTC (rev 10133) @@ -0,0 +1,302 @@ +/****************************************************** + * + * dmxout_threaded - implementation file + * + * copyleft (c) IOhannes m zm\xF6lnig + * + * 0603:forum::f\xFCr::uml\xE4ute:2008 + * + * institute of electronic music and acoustics (iem) + * + ****************************************************** + * + * license: GNU General Public License v.2 + * + ******************************************************/ + +#include "dmx4pd.h" + +#include <unistd.h> +#include <string.h> +#include <stdio.h> + +#include <pthread.h> + + +static t_class *dmxout_threaded_class; +static t_class *dmxout_threaded_class2; + +#define NUM_DMXVALUES 512 + +static pthread_t g_thread_id; +static pthread_mutex_t *g_mutex; +static dmx_t g_values[NUM_DMXVALUES]; +static int g_device; +static int g_thread_running, g_thread_continue; + +typedef struct _dmxout_threaded +{ + t_object x_obj; + + t_inlet *x_portinlet; + t_float x_port; + int x_portrange; + + +} t_dmxout_threaded; + + +static void *dmxout_threaded_thread(void*you) +{ + pthread_mutex_t *mutex=g_mutex; + struct timeval timout; + + g_thread_running=1; + + while(g_thread_continue) { + timout.tv_sec = 0; + timout.tv_usec=100; + select(0,0,0,0,&timout); + + pthread_mutex_lock(g_mutex); + if(g_device>0) { + lseek (g_device, 0, SEEK_SET); /* set to the current channel */ + write (g_device, g_values, NUM_DMXVALUES); /* write the channel */ + } + pthread_mutex_unlock(g_mutex); + } + g_thread_running=0; + printf("quit thread"); + + return NULL; +} + +static void dmxout_threaded_close() +{ + if(g_device>=0) { + close(g_device); + } + g_device=-1; + + if(g_thread_running) { + /* terminate the current thread! */ + void*dummy=0; + int counter=0; + g_thread_continue=0; + pthread_join(g_thread_id, &dummy); + while(g_thread_running) { + counter++; + } + } + g_thread_id=0; + if(g_mutex) { + pthread_mutex_destroy(g_mutex); + freebytes(g_mutex, sizeof(pthread_mutex_t)); + g_mutex=NULL; + } +} + + +static void dmxout_threaded_open(t_symbol*s_devname) +{ + int argc=2; + const char *args[2] = {"--dmx", s_devname->s_name}; + const char**argv=args; + const char*devname=""; + int fd; + + dmxout_threaded_close(); + + if(s_devname && s_devname->s_name) + devname=s_devname->s_name; + + // strncpy(args[0], "--dmx", MAXPDSTRING); + // strncpy(args[1], devname, MAXPDSTRING); + verbose(2, "[dmxout_threaded]: trying to open '%s'", args[1]); + devname=DMXdev(&argc, argv); + if(!devname){ + error("couldn't find DMX device"); + return; + } + verbose(1, "[dmxout_threaded] opening %s", devname); + + fd = open (devname, O_WRONLY); + + if(fd!=-1) { + g_device=fd; + + g_thread_running=0; + g_thread_continue=0; + g_mutex=(pthread_mutex_t*) malloc(sizeof(pthread_mutex_t)); + if ( pthread_mutex_init(g_mutex, NULL) < 0 ) { + error("couldn't create mutex"); + } else { + g_thread_continue = 1; + pthread_create(&g_thread_id, 0, dmxout_threaded_thread, NULL); + } + } else { + error("failed to open DMX-device '%s'",devname); + } +} + +static void dmxout_threaded_doout(t_dmxout_threaded*x) { + if(g_device<=0) { + pd_error(x, "no DMX universe found"); + return; + } +} + + +static void dmxout_threaded_doout1(t_dmxout_threaded*x, short port, unsigned char value) +{ + g_values[port]=value; + dmxout_threaded_doout(x); +} + + +static void dmxout_threaded_float(t_dmxout_threaded*x, t_float f) +{ + unsigned char val=(unsigned char)f; + short port = (short)x->x_port; + if(f<0. || f>255.) { + pd_error(x, "value %f out of bounds [0..255]", f); + return; + } + if(x->x_port<0. || x->x_port>NUM_DMXVALUES) { + pd_error(x, "port %f out of bounds [0..%d]", x->x_port, NUM_DMXVALUES); + return; + } + + dmxout_threaded_doout1(x, port, val); +} + +static void dmxout_threaded_list(t_dmxout_threaded*x, t_symbol*s, int argc, t_atom*argv) +{ + int count=(argc<x->x_portrange)?argc:x->x_portrange; + int i=0; + int errors=0; + + int port=x->x_port; + if((port+count)>=NUM_DMXVALUES) { + if(count>NUM_DMXVALUES)count=NUM_DMXVALUES; + port=NUM_DMXVALUES-count; + } + + for(i=0; i<count; i++) { + t_float f=atom_getfloat(argv+i); + if(f<0. || f>255.) { + errors++; + if(f<0.)f=0.; + if(f>255)f=255; + } + g_values[port+i]=(unsigned char)f; + } + if(errors) { + pd_error(x, "%d valu%s out of bound [0..255]", errors, (1==errors)?"e":"es"); + } + + dmxout_threaded_doout(x); +} + +static void dmxout_threaded_port(t_dmxout_threaded*x, t_float f_baseport, t_floatarg f_portrange) +{ + short baseport =(short)f_baseport; + short portrange=(short)f_portrange; + + + if(baseport<0 || baseport>=NUM_DMXVALUES) { + pd_error(x, "port %f out of bounds [0..%d]", f_baseport, NUM_DMXVALUES); + baseport =0; + } + x->x_port = baseport; + + if(portrange<0) { + pd_error(x, "portrange %f<0! setting to 1", portrange); + portrange=1; + } else if (portrange==0) { + portrange=x->x_portrange; + } + + if (baseport+portrange>NUM_DMXVALUES) { + pd_error(x, "upper port exceeds %d! clamping", NUM_DMXVALUES); + portrange=NUM_DMXVALUES-baseport; + } + x->x_portrange=portrange; +} + +static void *dmxout_threaded_new(t_symbol*s, int argc, t_atom*argv) +{ + t_floatarg baseport=0.f, portrange=0.f; + t_dmxout_threaded *x = 0; + + switch(argc) { + case 2: + x=(t_dmxout_threaded *)pd_new(dmxout_threaded_class2); + x->x_portinlet=inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("port")); + baseport=atom_getfloat(argv); + portrange=atom_getfloat(argv+1); + dmxout_threaded_port(x, baseport, portrange); + break; + case 1: + baseport=atom_getfloat(argv); + case 0: + x=(t_dmxout_threaded *)pd_new(dmxout_threaded_class); + x->x_portinlet=floatinlet_new(&x->x_obj, &x->x_port); + x->x_port = baseport; + x->x_portrange = -1; + break; + default: + return 0; + } + return (x); +} + +static void *dmxout_threaded_free(t_dmxout_threaded*x) +{ + // dmxout_threaded_close(); +} + +static void dmxout_threaded_init(void) { + int i=0; + g_thread_id=0; + g_mutex=NULL; + for(i=0; i<NUM_DMXVALUES; i++) g_values[i]=0; + + g_device=-1; + g_thread_running=0; + g_thread_continue=0; + + dmxout_threaded_open(gensym("")); + + post("running thread %d for device %d", g_thread_id, g_device); +} + + +void dmxout_threaded_setup(void) +{ + +#ifdef DMX4PD_POSTBANNER + DMX4PD_POSTBANNER; +#endif + + dmxout_threaded_class = class_new(gensym("dmxout_threaded"), (t_newmethod)dmxout_threaded_new, (t_method)dmxout_threaded_free, + sizeof(t_dmxout_threaded), + 0, + A_GIMME, A_NULL); + + class_addfloat(dmxout_threaded_class, dmxout_threaded_float); + + dmxout_threaded_class2 = class_new(gensym("dmxout_threaded"), (t_newmethod)dmxout_threaded_new, (t_method)dmxout_threaded_free, + sizeof(t_dmxout_threaded), + 0, + A_GIMME, A_NULL); + + class_addlist(dmxout_threaded_class2, dmxout_threaded_list); + + + class_addmethod(dmxout_threaded_class2, (t_method)dmxout_threaded_port, gensym("port"), + A_FLOAT, A_DEFFLOAT, A_NULL); + + + dmxout_threaded_init(); +}
Copied: trunk/externals/iem/dmx512/src/dmxout_b.c (from rev 10131, trunk/externals/iem/dmx512/src/dmxout.c) =================================================================== --- trunk/externals/iem/dmx512/src/dmxout_b.c (rev 0) +++ trunk/externals/iem/dmx512/src/dmxout_b.c 2008-07-02 11:34:38 UTC (rev 10133) @@ -0,0 +1,240 @@ +/****************************************************** + * + * dmxout - implementation file + * + * copyleft (c) IOhannes m zm\xF6lnig + * + * 0603:forum::f\xFCr::uml\xE4ute:2008 + * + * institute of electronic music and acoustics (iem) + * + ****************************************************** + * + * license: GNU General Public License v.2 + * + ******************************************************/ + +#include "dmx4pd.h" + +#include <unistd.h> +#include <string.h> +#include <stdio.h> + +static t_class *dmxout_class; +static t_class *dmxout_class2; + +#define NUM_DMXVALUES 512 + +typedef struct _dmxout +{ + t_object x_obj; + + t_inlet *x_portinlet; + + int x_device; + t_float x_port; + int x_portrange; + + dmx_t x_values[NUM_DMXVALUES]; +} t_dmxout; + +static void dmxout_clearbuf(t_dmxout*x) +{ + int i=0; + for(i=0; i<NUM_DMXVALUES; i++) x->x_values[i]=0; +} + +static void dmxout_close(t_dmxout*x) +{ + if(x->x_device>=0) { + close(x->x_device); + } + x->x_device=-1; +} + + +static void dmxout_open(t_dmxout*x, t_symbol*s_devname) +{ + int argc=2; + const char *args[2] = {"--dmx", s_devname->s_name}; + const char**argv=args; + const char*devname=""; + int fd; + + dmxout_close(x); + + if(s_devname && s_devname->s_name) + devname=s_devname->s_name; + + // strncpy(args[0], "--dmx", MAXPDSTRING); + // strncpy(args[1], devname, MAXPDSTRING); + verbose(2, "[dmxout]: trying to open '%s'", args[1]); + devname=DMXdev(&argc, argv); + if(!devname){ + pd_error(x, "couldn't find DMX device"); + return; + } + verbose(1, "[dmxout] opening %s", devname); + + fd = open (devname, O_WRONLY | O_NONBLOCK); + + if(fd!=-1) { + x->x_device=fd; + dmxout_clearbuf(x); + } else { + pd_error(x, "failed to open DMX-device '%s'",devname); + } +} + +static void dmxout_doout(t_dmxout*x) { + int device = x->x_device; + if(device<=0) { + pd_error(x, "no DMX universe found"); + return; + } + + lseek (device, 0, SEEK_SET); /* set to the current channel */ + write (device, x->x_values, NUM_DMXVALUES); /* write the channel */ +} + + +static void dmxout_doout1(t_dmxout*x, short port, unsigned char value) +{ + x->x_values[port]=value; + dmxout_doout(x); +} + + +static void dmxout_float(t_dmxout*x, t_float f) +{ + unsigned char val=(unsigned char)f; + short port = (short)x->x_port; + if(f<0. || f>255.) { + pd_error(x, "value %f out of bounds [0..255]", f); + return; + } + if(x->x_port<0. || x->x_port>NUM_DMXVALUES) { + pd_error(x, "port %f out of bounds [0..%d]", x->x_port, NUM_DMXVALUES); + return; + } + + dmxout_doout1(x, port, val); +} + +static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) +{ + int count=(argc<x->x_portrange)?argc:x->x_portrange; + int i=0; + int errors=0; + + int port=x->x_port; + if((port+count)>=NUM_DMXVALUES) { + if(count>NUM_DMXVALUES)count=NUM_DMXVALUES; + port=NUM_DMXVALUES-count; + } + + for(i=0; i<count; i++) { + t_float f=atom_getfloat(argv+i); + if(f<0. || f>255.) { + errors++; + if(f<0.)f=0.; + if(f>255)f=255; + } + x->x_values[port+i]=(unsigned char)f; + } + if(errors) { + pd_error(x, "%d valu%s out of bound [0..255]", errors, (1==errors)?"e":"es"); + } + + dmxout_doout(x); +} + +static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) +{ + short baseport =(short)f_baseport; + short portrange=(short)f_portrange; + + + if(baseport<0 || baseport>=NUM_DMXVALUES) { + pd_error(x, "port %f out of bounds [0..%d]", f_baseport, NUM_DMXVALUES); + baseport =0; + } + x->x_port = baseport; + + if(portrange<0) { + pd_error(x, "portrange %f<0! setting to 1", portrange); + portrange=1; + } else if (portrange==0) { + portrange=x->x_portrange; + } + + if (baseport+portrange>NUM_DMXVALUES) { + pd_error(x, "upper port exceeds %d! clamping", NUM_DMXVALUES); + portrange=NUM_DMXVALUES-baseport; + } + x->x_portrange=portrange; +} + +static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) +{ + t_floatarg baseport=0.f, portrange=0.f; + t_dmxout *x = 0; + + switch(argc) { + case 2: + x=(t_dmxout *)pd_new(dmxout_class2); + x->x_portinlet=inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("port")); + baseport=atom_getfloat(argv); + portrange=atom_getfloat(argv+1); + dmxout_port(x, baseport, portrange); + break; + case 1: + baseport=atom_getfloat(argv); + case 0: + x=(t_dmxout *)pd_new(dmxout_class); + x->x_portinlet=floatinlet_new(&x->x_obj, &x->x_port); + x->x_port = baseport; + x->x_portrange = -1; + break; + default: + return 0; + } + x->x_device=-1; + + dmxout_open(x, gensym("")); + return (x); +} + +static void *dmxout_free(t_dmxout*x) +{ + dmxout_close(x); +} + + +void dmxout_setup(void) +{ +#ifdef DMX4PD_POSTBANNER + DMX4PD_POSTBANNER; +#endif + + dmxout_class = class_new(gensym("dmxout"), (t_newmethod)dmxout_new, (t_method)dmxout_free, + sizeof(t_dmxout), + 0, + A_GIMME, A_NULL); + + class_addfloat(dmxout_class, dmxout_float); + class_addmethod(dmxout_class, (t_method)dmxout_open, gensym("open"), A_SYMBOL, A_NULL); + + dmxout_class2 = class_new(gensym("dmxout"), (t_newmethod)dmxout_new, (t_method)dmxout_free, + sizeof(t_dmxout), + 0, + A_GIMME, A_NULL); + + class_addlist(dmxout_class2, dmxout_list); + + + class_addmethod(dmxout_class2, (t_method)dmxout_port, gensym("port"), + A_FLOAT, A_DEFFLOAT, A_NULL); + + class_addmethod(dmxout_class2, (t_method)dmxout_open, gensym("open"), A_SYMBOL, A_NULL); +}
Deleted: trunk/externals/iem/dmx512/src/dmxout_threaded.c =================================================================== --- trunk/externals/iem/dmx512/src/dmxout_threaded.c 2008-07-02 11:33:21 UTC (rev 10132) +++ trunk/externals/iem/dmx512/src/dmxout_threaded.c 2008-07-02 11:34:38 UTC (rev 10133) @@ -1,302 +0,0 @@ -/****************************************************** - * - * dmxout_threaded - implementation file - * - * copyleft (c) IOhannes m zm\xF6lnig - * - * 0603:forum::f\xFCr::uml\xE4ute:2008 - * - * institute of electronic music and acoustics (iem) - * - ****************************************************** - * - * license: GNU General Public License v.2 - * - ******************************************************/ - -#include "dmx4pd.h" - -#include <unistd.h> -#include <string.h> -#include <stdio.h> - -#include <pthread.h> - - -static t_class *dmxout_threaded_class; -static t_class *dmxout_threaded_class2; - -#define NUM_DMXVALUES 512 - -static pthread_t g_thread_id; -static pthread_mutex_t *g_mutex; -static dmx_t g_values[NUM_DMXVALUES]; -static int g_device; -static int g_thread_running, g_thread_continue; - -typedef struct _dmxout_threaded -{ - t_object x_obj; - - t_inlet *x_portinlet; - t_float x_port; - int x_portrange; - - -} t_dmxout_threaded; - - -static void *dmxout_threaded_thread(void*you) -{ - pthread_mutex_t *mutex=g_mutex; - struct timeval timout; - - g_thread_running=1; - - while(g_thread_continue) { - timout.tv_sec = 0; - timout.tv_usec=100; - select(0,0,0,0,&timout); - - pthread_mutex_lock(g_mutex); - if(g_device>0) { - lseek (g_device, 0, SEEK_SET); /* set to the current channel */ - write (g_device, g_values, NUM_DMXVALUES); /* write the channel */ - } - pthread_mutex_unlock(g_mutex); - } - g_thread_running=0; - printf("quit thread"); - - return NULL; -} - -static void dmxout_threaded_close() -{ - if(g_device>=0) { - close(g_device); - } - g_device=-1; - - if(g_thread_running) { - /* terminate the current thread! */ - void*dummy=0; - int counter=0; - g_thread_continue=0; - pthread_join(g_thread_id, &dummy); - while(g_thread_running) { - counter++; - } - } - g_thread_id=0; - if(g_mutex) { - pthread_mutex_destroy(g_mutex); - freebytes(g_mutex, sizeof(pthread_mutex_t)); - g_mutex=NULL; - } -} - - -static void dmxout_threaded_open(t_symbol*s_devname) -{ - int argc=2; - const char *args[2] = {"--dmx", s_devname->s_name}; - const char**argv=args; - const char*devname=""; - int fd; - - dmxout_threaded_close(); - - if(s_devname && s_devname->s_name) - devname=s_devname->s_name; - - // strncpy(args[0], "--dmx", MAXPDSTRING); - // strncpy(args[1], devname, MAXPDSTRING); - verbose(2, "[dmxout_threaded]: trying to open '%s'", args[1]); - devname=DMXdev(&argc, argv); - if(!devname){ - error("couldn't find DMX device"); - return; - } - verbose(1, "[dmxout_threaded] opening %s", devname); - - fd = open (devname, O_WRONLY); - - if(fd!=-1) { - g_device=fd; - - g_thread_running=0; - g_thread_continue=0; - g_mutex=(pthread_mutex_t*) malloc(sizeof(pthread_mutex_t)); - if ( pthread_mutex_init(g_mutex, NULL) < 0 ) { - error("couldn't create mutex"); - } else { - g_thread_continue = 1; - pthread_create(&g_thread_id, 0, dmxout_threaded_thread, NULL); - } - } else { - error("failed to open DMX-device '%s'",devname); - } -} - -static void dmxout_threaded_doout(t_dmxout_threaded*x) { - if(g_device<=0) { - pd_error(x, "no DMX universe found"); - return; - } -} - - -static void dmxout_threaded_doout1(t_dmxout_threaded*x, short port, unsigned char value) -{ - g_values[port]=value; - dmxout_threaded_doout(x); -} - - -static void dmxout_threaded_float(t_dmxout_threaded*x, t_float f) -{ - unsigned char val=(unsigned char)f; - short port = (short)x->x_port; - if(f<0. || f>255.) { - pd_error(x, "value %f out of bounds [0..255]", f); - return; - } - if(x->x_port<0. || x->x_port>NUM_DMXVALUES) { - pd_error(x, "port %f out of bounds [0..%d]", x->x_port, NUM_DMXVALUES); - return; - } - - dmxout_threaded_doout1(x, port, val); -} - -static void dmxout_threaded_list(t_dmxout_threaded*x, t_symbol*s, int argc, t_atom*argv) -{ - int count=(argc<x->x_portrange)?argc:x->x_portrange; - int i=0; - int errors=0; - - int port=x->x_port; - if((port+count)>=NUM_DMXVALUES) { - if(count>NUM_DMXVALUES)count=NUM_DMXVALUES; - port=NUM_DMXVALUES-count; - } - - for(i=0; i<count; i++) { - t_float f=atom_getfloat(argv+i); - if(f<0. || f>255.) { - errors++; - if(f<0.)f=0.; - if(f>255)f=255; - } - g_values[port+i]=(unsigned char)f; - } - if(errors) { - pd_error(x, "%d valu%s out of bound [0..255]", errors, (1==errors)?"e":"es"); - } - - dmxout_threaded_doout(x); -} - -static void dmxout_threaded_port(t_dmxout_threaded*x, t_float f_baseport, t_floatarg f_portrange) -{ - short baseport =(short)f_baseport; - short portrange=(short)f_portrange; - - - if(baseport<0 || baseport>=NUM_DMXVALUES) { - pd_error(x, "port %f out of bounds [0..%d]", f_baseport, NUM_DMXVALUES); - baseport =0; - } - x->x_port = baseport; - - if(portrange<0) { - pd_error(x, "portrange %f<0! setting to 1", portrange); - portrange=1; - } else if (portrange==0) { - portrange=x->x_portrange; - } - - if (baseport+portrange>NUM_DMXVALUES) { - pd_error(x, "upper port exceeds %d! clamping", NUM_DMXVALUES); - portrange=NUM_DMXVALUES-baseport; - } - x->x_portrange=portrange; -} - -static void *dmxout_threaded_new(t_symbol*s, int argc, t_atom*argv) -{ - t_floatarg baseport=0.f, portrange=0.f; - t_dmxout_threaded *x = 0; - - switch(argc) { - case 2: - x=(t_dmxout_threaded *)pd_new(dmxout_threaded_class2); - x->x_portinlet=inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("port")); - baseport=atom_getfloat(argv); - portrange=atom_getfloat(argv+1); - dmxout_threaded_port(x, baseport, portrange); - break; - case 1: - baseport=atom_getfloat(argv); - case 0: - x=(t_dmxout_threaded *)pd_new(dmxout_threaded_class); - x->x_portinlet=floatinlet_new(&x->x_obj, &x->x_port); - x->x_port = baseport; - x->x_portrange = -1; - break; - default: - return 0; - } - return (x); -} - -static void *dmxout_threaded_free(t_dmxout_threaded*x) -{ - // dmxout_threaded_close(); -} - -static void dmxout_threaded_init(void) { - int i=0; - g_thread_id=0; - g_mutex=NULL; - for(i=0; i<NUM_DMXVALUES; i++) g_values[i]=0; - - g_device=-1; - g_thread_running=0; - g_thread_continue=0; - - dmxout_threaded_open(gensym("")); - - post("running thread %d for device %d", g_thread_id, g_device); -} - - -void dmxout_threaded_setup(void) -{ - -#ifdef DMX4PD_POSTBANNER - DMX4PD_POSTBANNER; -#endif - - dmxout_threaded_class = class_new(gensym("dmxout_threaded"), (t_newmethod)dmxout_threaded_new, (t_method)dmxout_threaded_free, - sizeof(t_dmxout_threaded), - 0, - A_GIMME, A_NULL); - - class_addfloat(dmxout_threaded_class, dmxout_threaded_float); - - dmxout_threaded_class2 = class_new(gensym("dmxout_threaded"), (t_newmethod)dmxout_threaded_new, (t_method)dmxout_threaded_free, - sizeof(t_dmxout_threaded), - 0, - A_GIMME, A_NULL); - - class_addlist(dmxout_threaded_class2, dmxout_threaded_list); - - - class_addmethod(dmxout_threaded_class2, (t_method)dmxout_threaded_port, gensym("port"), - A_FLOAT, A_DEFFLOAT, A_NULL); - - - dmxout_threaded_init(); -}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.