From 86c89e24f57b63883775f932c0a2354b5fe4660c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 13 Jun 2008 11:36:22 +0000 Subject: dmx4pd (currently linux only) svn path=/trunk/externals/iem/dmx512/; revision=9989 --- dmx512/src/Make.config.in | 31 ++++++++ dmx512/src/Make.version | 1 + dmx512/src/Makefile | 64 ++++++++++++++++ dmx512/src/configure.ac | 181 ++++++++++++++++++++++++++++++++++++++++++++++ dmx512/src/dmx4pd.h | 34 +++++++++ dmx512/src/dmxin.c | 47 ++++++++++++ dmx512/src/dmxout.c | 156 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 514 insertions(+) create mode 100644 dmx512/src/Make.config.in create mode 100644 dmx512/src/Make.version create mode 100644 dmx512/src/Makefile create mode 100644 dmx512/src/configure.ac create mode 100644 dmx512/src/dmx4pd.h create mode 100644 dmx512/src/dmxin.c create mode 100644 dmx512/src/dmxout.c (limited to 'dmx512/src') diff --git a/dmx512/src/Make.config.in b/dmx512/src/Make.config.in new file mode 100644 index 0000000..d3ac25f --- /dev/null +++ b/dmx512/src/Make.config.in @@ -0,0 +1,31 @@ +LIBNAME ?= @LIBNAME@ +VERSION ?= @VERSION@ + +PREFIX =@prefix@@PDLIBDIR@ + +INSTALL_BIN=$(PREFIX)/extra +INSTALL_DOC=$(PREFIX)/@REFERENCEPATH@$(LIBNAME) + +EXT = @EXT@ +VERSION ?= @VERSION@ +DEFS = @DFLAGS@ -DACONNECT_VERSION=\"$(VERSION)\" +IFLAGS = -I. @INCLUDES@ $(INCLUDES) + +CC = @CC@ +LD = @LD@ +STRIP = @STRIP@ @STRIPFLAGS@ + +AFLAGS = +LFLAGS = @LFLAGS@ +WFLAGS = + +MAKEDEP_FLAGS = @MAKEDEP_FLAGS@ + +TARNAME = $(LIBNAME)-$(VERSION).tgz +BINTARNAME = $(LIBNAME)-$(VERSION)-bin.tgz + + +CFLAGS = $(DEFS) $(IFLAGS) $(WFLAGS) @CFLAGS@ + +LIBS = @LIBS@ + diff --git a/dmx512/src/Make.version b/dmx512/src/Make.version new file mode 100644 index 0000000..0bc041a --- /dev/null +++ b/dmx512/src/Make.version @@ -0,0 +1 @@ +VERSION = $(shell svnversion) diff --git a/dmx512/src/Makefile b/dmx512/src/Makefile new file mode 100644 index 0000000..93da650 --- /dev/null +++ b/dmx512/src/Makefile @@ -0,0 +1,64 @@ +default: all + +include Make.version + +Make.config: Make.config.in configure + ./configure + +include Make.config + +.SUFFIXES: .$(EXT) + +SOURCES=$(sort $(filter %.c, $(wildcard *.c))) +TARGETS = $(SOURCES:.c=.o) +OBJECTS = $(SOURCES:.c=.$(EXT)) + +all: $(OBJECTS) + +clean: + -rm -f *.o *.d + +binclean: + -rm -f *.$(EXT) + +distclean: clean binclean + -rm -f *~ _* config.* + -rm -rf autom4te.cache + +install: install-bin install-doc + +install-bin: + -install -d $(INSTALL_BIN) + -install -m 644 $(LIBNAME).$(EXT) $(INSTALL_BIN) + +install-doc: + -install -d $(INSTALL_BIN) + -install -m 644 *.pd $(INSTALL_BIN) + +dist: distclean + (cd ..;tar czvf $(TARNAME) $(LIBNAME)) + +distbin: distclean all clean + (cd ..; tar cvzf $(BINTARNAME) $(LIBNAME)) + +everything: clean all install distclean + + +$(TARGETS): %.o : %.c + $(CC) $(DMX4PD_CFLAGS) -DDMX4PD_VERSION="\"$(VERSION)\"" -c -o $@ $*.c + +$(OBJECTS): %.$(EXT) : %.o + $(LD) $(LFLAGS) -o $@ $*.o $(LIBS) + $(STRIP) $(STRIPFLAGS) $@ + +## dependencies: as proposed by the GNU-make documentation +## see http://www.gnu.org/software/make/manual/html_node/make_47.html#SEC51 +-include $(SOURCES:.c=.d) +%.d: %.c + @set -e; rm -f $@; \ + $(CC) $(MAKEDEP_FLAGS) $(CFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +configure: configure.ac + autoconf diff --git a/dmx512/src/configure.ac b/dmx512/src/configure.ac new file mode 100644 index 0000000..ce4dc98 --- /dev/null +++ b/dmx512/src/configure.ac @@ -0,0 +1,181 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(dmx4pd.h) + +LIBNAME=dmx4pd + +dnl Checks for programs. +AC_PROG_CC + +AC_SUBST(STK) +AC_SUBST(DFLAGS) +AC_SUBST(LFLAGS) +AC_SUBST(EXT) +AC_SUBST(LD) +AC_SUBST(STRIP) +AC_SUBST(STRIPFLAGS) +AC_SUBST(REFERENCEPATH) +AC_SUBST(PDLIBDIR) +AC_SUBST(INCLUDES) +AC_SUBST(LIBNAME) + +AC_SUBST(DMX4LINUX_LFLAGS) +AC_SUBST(DMX4LINUX_CFLAGS) + + +AC_ARG_WITH(pdversion, [ --with-pdversion= enforce a certain pd-version (e.g. 0.37)]) +AC_ARG_WITH(extension, [ --with-extension= enforce a certain extension for the dynamic library (e.g. dll)]) + + +dnl Checks for libraries. +dnl Replace `main' with a function in -lc: +AC_CHECK_LIB(c, main) +AC_CHECK_LIB(crtdll, fclose) + +dnl Replace `main' with a function in -lm: +AC_CHECK_LIB(m, main) +dnl Replace `main' with a function in -lpthread: +dnl AC_CHECK_LIB(pthread, main) +dnl Replace `main' with a function in -lstk: +dnl AC_CHECK_LIB(stk, main, STK=yes) + + +AC_CHECK_LIB(dmx4linux, DMXsleep) +if test "x$ac_cv_lib_dmx4linux_DMXsleep" = "xyes"; then + DMX4LINUX_LFLAGS="-ldmx4linux" +fi + +dnl AC_CHECK_LIB(asound, snd_seq_close) +dnl if test "x$ac_cv_lib_asound_snd_seq_close" = "xyes"; then +dnl DFLAGS="-DHAVE_ALSA ${DFLAGS}" +dnl fi + +if test "x$includedir" != "x"; then + for id in $includedir + do + if test -d $id; then INCLUDES="-I$id $INCLUDES"; fi + done +fi +if test "x$libdir" != "x"; then + for id in $libdir + do + if test -d $id; then LIBS="-L$id $LIBS"; fi + done +fi + +AC_CHECK_LIB(pd, nullfn) + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS(stdlib.h stdio.h string.h math.h time.h sys/time.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_TIME + +dnl Checks for library functions. +AC_FUNC_MMAP +AC_CHECK_FUNCS(select socket strerror) + +dnl check for "-mms-bitfields" cflag +dnl why is there no generic compiler-check for a given flag ? +dnl it would make things so easy: AC_CHECK_FLAG([-mms-bitfields],,) +AC_MSG_CHECKING("ms-bitfields") +cat > conftest.c << EOF +int main(){ + return 0; +} +EOF +if ${CC} ${INCLUDES} ${DFLAGS} -o conftest.o conftest.c ${CFLAGS} -mms-bitfields > /dev/null 2>&1 +then + echo "yes" + CFLAGS="${CFLAGS} -mms-bitfields" +else + echo "no" +fi + + +### make-depend flags +if test "x$ac_cv_c_compiler_gnu" = "xyes"; then + AC_SUBST(MAKEDEP_FLAGS, "-MM") +else + AC_SUBST(MAKEDEP_FLAGS, "-M") +fi + +dnl isn't there a better way to check for good linker/stripper ? + +dnl if we don't have $LD set, we set it to $(CC) +dnl LD=${LD:=$CC} +AC_CHECK_TOOL([LD], [ld], [${CC}]) + +dnl if we don't have $STRIP set, we set it to ${host}-strip or strip + +dnl if we don't have $STRIP set, we set it to ${host}-strip or strip +AC_CHECK_TOOL([STRIP], [strip], [true]) +AC_MSG_CHECKING([if strip is GNU strip]) +if $STRIP -V | grep GNU > /dev/null +then + AC_SUBST(STRIPFLAGS, "--strip-unneeded") + AC_MSG_RESULT([yes]) +else + AC_SUBST(STRIPFLAGS,"-x") + AC_MSG_RESULT([no]) +fi + +dnl +dnl OK, checks for machines are here now +dnl +if test `uname -s` = Linux; +then + LFLAGS="-export_dynamic -shared" + CFLAGS="-fPIC $CFLAGS" + EXT=pd_linux +fi + +dnl This should use '-bundle_loader /path/to/pd/bin/pd' instead of'-undefined suppress' +dnl then strip might do something +if test `uname -s` = Darwin; +then + LD=cc + LFLAGS="-bundle -undefined suppress -flat_namespace" + EXT=pd_darwin + STRIPFLAGS= +fi + +if test `uname | sed -e 's/^MINGW.*/NT/'` = NT; +then + LD=gcc + INCLUDES="-I@prefix@/src" + DFLAGS="-D__WIN32__ ${DFLAGS}" + LFLAGS="-shared @prefix@/bin/pd.dll" + EXT=dll +else + PDLIBDIR="/lib/pd" +fi + +if test `uname -s` = IRIX64; +then + LFLAGS="-n32 -DUNIX -DIRIX -DN32 -woff 1080,1064,1185 \ + -OPT:roundoff=3 -OPT:IEEE_arithmetic=3 -OPT:cray_ivdep=true \ + -shared -rdata_shared" + EXT=pd_irix6 + dnl DFLAGS="-DUNIX -DIRIX6 ${DFLAGS}" + STRIPFLAGS="--strip-unneeded" +fi + +if test `uname -s` = IRIX32; +then + LFLAGS="-o32 -DUNIX -DIRIX -O2 + -shared -rdata_shared" + EXT=pd_irix5 + dnl DFLAGS="-DUNIX -DIRIX5 ${DFLAGS}" + STRIPFLAGS="--strip-unneeded" +fi + +if test "x$with_extension" != "x" +then + EXT=$with_extension +fi + + +AC_OUTPUT(Make.config) + +rm -f conftest.* diff --git a/dmx512/src/dmx4pd.h b/dmx512/src/dmx4pd.h new file mode 100644 index 0000000..0987926 --- /dev/null +++ b/dmx512/src/dmx4pd.h @@ -0,0 +1,34 @@ + +/****************************************************** + * + * dmx4pd - header file + * + * copyleft (c) IOhannes m zm-bölnig-A + * + * 0603:forum::f-bür::umläute:2008-A + * + * institute of electronic music and acoustics (iem) + * + ****************************************************** + * + * license: GNU General Public License v.2 + * + ******************************************************/ + +#ifndef INCLUDE_DMX4PD_H__ +#define INCLUDE_DMX4PD_H__ + +#ifndef DMX4PD_VERSION +# define DMX4PD_VERSION __DATE__ +#endif + + + +#include "m_pd.h" + +#define DMX4PD_POSTBANNER \ + post("DMX4PD ver %s: (c) 2008 IOhannes m zmölnig - iem @ kug", DMX4PD_VERSION); + + + +#endif /* INCLUDE_DMX4PD_H__ */ diff --git a/dmx512/src/dmxin.c b/dmx512/src/dmxin.c new file mode 100644 index 0000000..9e9e1b4 --- /dev/null +++ b/dmx512/src/dmxin.c @@ -0,0 +1,47 @@ +/****************************************************** + * + * dmxin - implementation file + * + * copyleft (c) IOhannes m zmölnig + * + * 0603:forum::für::umläute:2008 + * + * institute of electronic music and acoustics (iem) + * + ****************************************************** + * + * license: GNU General Public License v.2 + * + ******************************************************/ + + +#include "dmx4pd.h" + +static t_class *dmxin_class; + +typedef struct _dmxin +{ + t_object x_obj; +} t_dmxin; + +static void *dmxin_new(void) +{ + t_dmxin *x = (t_dmxin *)pd_new(dmxin_class); + return (x); +} +static void *dmxin_free(t_dmxin*x) +{ + +} + +void dmxin_setup(void) +{ + dmxin_class = class_new(gensym("dmxin"), (t_newmethod)dmxin_new, (t_method)dmxin_free, + sizeof(t_dmxin), + CLASS_NOINLET, + A_NULL); + +#ifdef DMX4PD_POSTBANNER + DMX4PD_POSTBANNER +#endif +} diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c new file mode 100644 index 0000000..5fa17ba --- /dev/null +++ b/dmx512/src/dmxout.c @@ -0,0 +1,156 @@ +/****************************************************** + * + * dmxout - implementation file + * + * copyleft (c) IOhannes m zmölnig + * + * 0603:forum::für::umläute:2008 + * + * institute of electronic music and acoustics (iem) + * + ****************************************************** + * + * license: GNU General Public License v.2 + * + ******************************************************/ + + +#include "dmx4pd.h" + +#include +#include +#include +#include + + +#include + +static t_class *dmxout_class; + +typedef struct _dmxout +{ + t_object x_obj; + + t_inlet *x_portinlet; + + int x_device; + t_float x_port; + +} t_dmxout; + + +static void dmxout_doout(t_dmxout*x, short port, unsigned char value) +{ + dmx_t buffer[1] = {value}; + if(x->x_device<=0) { + pd_error(x, "no DMX universe found"); + return; + } + + lseek (x->x_device, sizeof(buffer)*port, SEEK_SET); /* set to the current channel */ + write (x->x_device, buffer, sizeof(buffer)); /* write the channel */ +} + + +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; + char *args[2] = {"--dmx", s_devname->s_name}; + const char**argv=args; + char*devname=""; + int fd; + + if(s_devname && s_devname->s_name) + devname=s_devname->s_name; + + // strncpy(args[0], "--dmx", MAXPDSTRING); + // strncpy(args[1], devname, MAXPDSTRING); + + fd = open (DMXdev(&argc, argv), O_WRONLY); + + if(fd!=-1) { + dmxout_close(x); + x->x_device=fd; + } +} + + +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>512.) { + pd_error(x, "port %f out of bounds [0..512]", x->x_port); + return; + } + + dmxout_doout(x, port, val); +} + +static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) +{ + t_dmxout *x = (t_dmxout *)pd_new(dmxout_class); + + t_symbol*devname=gensym(""); + + x->x_portinlet=floatinlet_new(&x->x_obj, &x->x_port); + + x->x_device=-1; + x->x_port =0; + + switch(argc) { + case 0: break; + case 1: + if(A_FLOAT==argv->a_type) { + x->x_port=atom_getfloat(argv); + } else { + devname=atom_getsymbol(argv); + } + break; + default: + if((A_FLOAT==(argv+0)->a_type) && (A_SYMBOL==(argv+1)->a_type)) { + x->x_port=atom_getfloat(argv+0); + devname=atom_getsymbol(argv+1); + } else if(A_FLOAT==(argv+1)->a_type && A_SYMBOL==(argv+0)->a_type) { + x->x_port=atom_getfloat(argv+1); + devname=atom_getsymbol (argv+0); + } + break; + } + + + dmxout_open(x, devname); + return (x); +} + +static void *dmxout_free(t_dmxout*x) +{ + +} + + +void dmxout_setup(void) +{ + 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); + + + post("DMX4PD (%s): (c) 2008 IOhannes m zmölnig - iem @ kug", DMX4PD_VERSION); +} -- cgit v1.2.1 From cea4322c3ca725ebc4096740b6060b02064a4a8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 13 Jun 2008 12:44:31 +0000 Subject: trying to fix makefile svn path=/trunk/externals/iem/dmx512/; revision=9990 --- dmx512/src/Makefile | 14 ++++++++++---- dmx512/src/dmxout.c | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/Makefile b/dmx512/src/Makefile index 93da650..c751028 100644 --- a/dmx512/src/Makefile +++ b/dmx512/src/Makefile @@ -5,7 +5,7 @@ include Make.version Make.config: Make.config.in configure ./configure -include Make.config +-include Make.config .SUFFIXES: .$(EXT) @@ -16,10 +16,13 @@ OBJECTS = $(SOURCES:.c=.$(EXT)) all: $(OBJECTS) clean: - -rm -f *.o *.d + -rm -f *.o *.d binclean: - -rm -f *.$(EXT) + -rm -f *.$(EXT) *.dll *.pd_linux *.pd_darwin *.l_i386 *.l_ia64 *.d_ppc *.d_fat + +mrproper: distclean + -rm Make.config configure *.d.* distclean: clean binclean -rm -f *~ _* config.* @@ -44,13 +47,15 @@ distbin: distclean all clean everything: clean all install distclean -$(TARGETS): %.o : %.c +$(TARGETS): %.o : %.c Make.config $(CC) $(DMX4PD_CFLAGS) -DDMX4PD_VERSION="\"$(VERSION)\"" -c -o $@ $*.c $(OBJECTS): %.$(EXT) : %.o $(LD) $(LFLAGS) -o $@ $*.o $(LIBS) $(STRIP) $(STRIPFLAGS) $@ + +ifeq (,$(findstring clean, $(MAKECMDGOALS))) ## dependencies: as proposed by the GNU-make documentation ## see http://www.gnu.org/software/make/manual/html_node/make_47.html#SEC51 -include $(SOURCES:.c=.d) @@ -62,3 +67,4 @@ $(OBJECTS): %.$(EXT) : %.o configure: configure.ac autoconf +endif diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index 5fa17ba..af812b9 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -152,5 +152,5 @@ void dmxout_setup(void) class_addfloat(dmxout_class, dmxout_float); - post("DMX4PD (%s): (c) 2008 IOhannes m zmölnig - iem @ kug", DMX4PD_VERSION); + post("DMX4PD (ver.%s): (c) 2008 IOhannes m zmölnig - iem @ kug", DMX4PD_VERSION); } -- cgit v1.2.1 From 4fd2d8a51cea2577f985148583539d0f7727da63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 13 Jun 2008 12:46:17 +0000 Subject: this should do svn path=/trunk/externals/iem/dmx512/; revision=9991 --- dmx512/src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dmx512/src') diff --git a/dmx512/src/Makefile b/dmx512/src/Makefile index c751028..a9c06db 100644 --- a/dmx512/src/Makefile +++ b/dmx512/src/Makefile @@ -18,7 +18,7 @@ all: $(OBJECTS) clean: -rm -f *.o *.d -binclean: +binclean: clean -rm -f *.$(EXT) *.dll *.pd_linux *.pd_darwin *.l_i386 *.l_ia64 *.d_ppc *.d_fat mrproper: distclean -- cgit v1.2.1 From 124ec02a0b4114bb52bcb8c44c4d76de737f6e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 13 Jun 2008 13:28:08 +0000 Subject: probably got the svnversion magic going svn path=/trunk/externals/iem/dmx512/; revision=9992 --- dmx512/src/Make.version | 2 +- dmx512/src/Makefile | 8 +++++++- dmx512/src/dmx4pd.h | 6 ++++-- dmx512/src/dmxout.c | 9 +++++---- 4 files changed, 17 insertions(+), 8 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/Make.version b/dmx512/src/Make.version index 0bc041a..0bdb8b4 100644 --- a/dmx512/src/Make.version +++ b/dmx512/src/Make.version @@ -1 +1 @@ -VERSION = $(shell svnversion) +VERSION = $(shell svnversion | grep -e "[0-9]") diff --git a/dmx512/src/Makefile b/dmx512/src/Makefile index a9c06db..e634df6 100644 --- a/dmx512/src/Makefile +++ b/dmx512/src/Makefile @@ -2,11 +2,17 @@ default: all include Make.version + Make.config: Make.config.in configure ./configure -include Make.config +#VERSIONDEFINE = _$(strip $(VERSION))_ +ifneq ($(strip $(VERSION)),) +VERSIONDEFINE = -DDMX4PD_VERSION="\"rev.$(VERSION)\"" +endif + .SUFFIXES: .$(EXT) SOURCES=$(sort $(filter %.c, $(wildcard *.c))) @@ -48,7 +54,7 @@ everything: clean all install distclean $(TARGETS): %.o : %.c Make.config - $(CC) $(DMX4PD_CFLAGS) -DDMX4PD_VERSION="\"$(VERSION)\"" -c -o $@ $*.c + $(CC) $(DMX4PD_CFLAGS) $(VERSIONDEFINE) -c -o $@ $*.c $(OBJECTS): %.$(EXT) : %.o $(LD) $(LFLAGS) -o $@ $*.o $(LIBS) diff --git a/dmx512/src/dmx4pd.h b/dmx512/src/dmx4pd.h index 0987926..d386c28 100644 --- a/dmx512/src/dmx4pd.h +++ b/dmx512/src/dmx4pd.h @@ -26,9 +26,11 @@ #include "m_pd.h" -#define DMX4PD_POSTBANNER \ - post("DMX4PD ver %s: (c) 2008 IOhannes m zmölnig - iem @ kug", DMX4PD_VERSION); +#define DMX4PD_POSTBANNER \ + { \ + post("DMX4PD ("DMX4PD_VERSION"): (c) 2008 IOhannes m zmölnig - iem @ kug"); \ + } #endif /* INCLUDE_DMX4PD_H__ */ diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index af812b9..b9066cb 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -64,7 +64,7 @@ static void dmxout_close(t_dmxout*x) static void dmxout_open(t_dmxout*x, t_symbol*s_devname) { int argc=2; - char *args[2] = {"--dmx", s_devname->s_name}; + const char *args[2] = {"--dmx", s_devname->s_name}; const char**argv=args; char*devname=""; int fd; @@ -138,7 +138,7 @@ static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) static void *dmxout_free(t_dmxout*x) { - + dmxout_close(x); } @@ -151,6 +151,7 @@ void dmxout_setup(void) class_addfloat(dmxout_class, dmxout_float); - - post("DMX4PD (ver.%s): (c) 2008 IOhannes m zmölnig - iem @ kug", DMX4PD_VERSION); +#ifdef DMX4PD_POSTBANNER + DMX4PD_POSTBANNER +#endif } -- cgit v1.2.1 From 44824cfa333691b8e300adbc47bcadcde6691979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 13 Jun 2008 13:39:54 +0000 Subject: tell that [dmxin] isn't yet there... svn path=/trunk/externals/iem/dmx512/; revision=9993 --- dmx512/src/dmx4pd.h | 5 +++++ dmx512/src/dmxin.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- dmx512/src/dmxout.c | 5 ----- 3 files changed, 52 insertions(+), 8 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/dmx4pd.h b/dmx512/src/dmx4pd.h index d386c28..cc6fe66 100644 --- a/dmx512/src/dmx4pd.h +++ b/dmx512/src/dmx4pd.h @@ -25,6 +25,11 @@ #include "m_pd.h" +#include + +#include +#include +#include #define DMX4PD_POSTBANNER \ diff --git a/dmx512/src/dmxin.c b/dmx512/src/dmxin.c index 9e9e1b4..cfccd4b 100644 --- a/dmx512/src/dmxin.c +++ b/dmx512/src/dmxin.c @@ -17,21 +17,65 @@ #include "dmx4pd.h" + static t_class *dmxin_class; typedef struct _dmxin { t_object x_obj; + int x_device; + + t_outlet*x_outlet1, *x_outlet2; } t_dmxin; + + + +static void dmxin_close(t_dmxin*x) +{ + if(x->x_device>=0) { + close(x->x_device); + } + x->x_device=-1; +} + + +static void dmxin_open(t_dmxin*x, t_symbol*s_devname) +{ + int argc=2; + const char *args[2] = {"--dmx", s_devname->s_name}; + const char**argv=args; + char*devname=""; + int fd; + + if(s_devname && s_devname->s_name) + devname=s_devname->s_name; + + // strncpy(args[0], "--dmx", MAXPDSTRING); + // strncpy(args[1], devname, MAXPDSTRING); + + fd = open (DMXINdev(&argc, argv), O_RDONLY); + + if(fd!=-1) { + dmxin_close(x); + x->x_device=fd; + } +} + + static void *dmxin_new(void) { - t_dmxin *x = (t_dmxin *)pd_new(dmxin_class); - return (x); + if(0) { + t_dmxin *x = (t_dmxin *)pd_new(dmxin_class); + return (x); + } else { + error("[dmxin] not yet implemented"); + return 0; + } } static void *dmxin_free(t_dmxin*x) { - + dmxin_close(x); } void dmxin_setup(void) diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index b9066cb..fc3a875 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -17,14 +17,9 @@ #include "dmx4pd.h" -#include -#include #include #include - -#include - static t_class *dmxout_class; typedef struct _dmxout -- cgit v1.2.1 From d63eaa6f1814f289c52cecaa4c7d76e765269549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 13 Jun 2008 13:42:01 +0000 Subject: ... svn path=/trunk/externals/iem/dmx512/; revision=9994 --- dmx512/src/dmxout.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index fc3a875..08d70b2 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -33,20 +33,6 @@ typedef struct _dmxout } t_dmxout; - -static void dmxout_doout(t_dmxout*x, short port, unsigned char value) -{ - dmx_t buffer[1] = {value}; - if(x->x_device<=0) { - pd_error(x, "no DMX universe found"); - return; - } - - lseek (x->x_device, sizeof(buffer)*port, SEEK_SET); /* set to the current channel */ - write (x->x_device, buffer, sizeof(buffer)); /* write the channel */ -} - - static void dmxout_close(t_dmxout*x) { if(x->x_device>=0) { @@ -78,6 +64,18 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) } } +static void dmxout_doout(t_dmxout*x, short port, unsigned char value) +{ + dmx_t buffer[1] = {value}; + if(x->x_device<=0) { + pd_error(x, "no DMX universe found"); + return; + } + + lseek (x->x_device, sizeof(buffer)*port, SEEK_SET); /* set to the current channel */ + write (x->x_device, buffer, sizeof(buffer)); /* write the channel */ +} + static void dmxout_float(t_dmxout*x, t_float f) { -- cgit v1.2.1 From a1130c53ea736d68d8d2a260d80a7e182a638813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 13 Jun 2008 14:36:24 +0000 Subject: ... svn path=/trunk/externals/iem/dmx512/; revision=9997 --- dmx512/src/dmxin.c | 74 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 13 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/dmxin.c b/dmx512/src/dmxin.c index cfccd4b..c009570 100644 --- a/dmx512/src/dmxin.c +++ b/dmx512/src/dmxin.c @@ -17,6 +17,10 @@ #include "dmx4pd.h" +#include +#include +#include +#include static t_class *dmxin_class; @@ -24,12 +28,43 @@ typedef struct _dmxin { t_object x_obj; int x_device; + int x_port; - t_outlet*x_outlet1, *x_outlet2; -} t_dmxin; + dmx_t x_dmxbuffer[512]; + t_outlet*x_outlet1, *x_outlet2; +} t_dmxin; +static void dmx_doread(t_dmxin*x) { + int dmxin=x->x_device; + fd_set readset; + post("dmxin_doread: %d", dmxin); + if(dmxin<=0)return; + + FD_ZERO(&readset); + FD_SET(dmxin, &readset); + FD_SET(0, &readset); + + int n=select(dmxin+1, &readset, NULL,NULL, NULL); + if(n>0 && FD_ISSET(dmxin, &readset)) { + dmx_t dmxbuffer[512]; + int i=0; + lseek (dmxin, 0, SEEK_SET); + n=read (dmxin, dmxbuffer, sizeof(dmxbuffer)); + for(i=0; i<512; i+=2) { + int c=dmxbuffer[i]; + if(c!=x->x_dmxbuffer[i]) { + x->x_dmxbuffer[i]=c; + post("read %03d @ %03d", c, i); + } + } + } +} +static void dmxin_bang(t_dmxin*x) +{ + dmx_doread(x); +} static void dmxin_close(t_dmxin*x) { @@ -43,7 +78,7 @@ static void dmxin_close(t_dmxin*x) static void dmxin_open(t_dmxin*x, t_symbol*s_devname) { int argc=2; - const char *args[2] = {"--dmx", s_devname->s_name}; + const char *args[2] = {"--dmxin", s_devname->s_name}; const char**argv=args; char*devname=""; int fd; @@ -65,15 +100,26 @@ static void dmxin_open(t_dmxin*x, t_symbol*s_devname) static void *dmxin_new(void) { - if(0) { - t_dmxin *x = (t_dmxin *)pd_new(dmxin_class); - return (x); - } else { - error("[dmxin] not yet implemented"); - return 0; + int i=0; + t_dmxin *x = (t_dmxin *)pd_new(dmxin_class); + + x->x_device=0; + x->x_port=0; + + for(i=0; ix_dmxbuffer); i++) { + x->x_dmxbuffer[i]=0; } + + + x->x_outlet1=outlet_new(&x->x_obj, &s_float); + x->x_outlet2=outlet_new(&x->x_obj, &s_float); + + + + dmxin_open(x, gensym("")); + return (x); } -static void *dmxin_free(t_dmxin*x) +static void dmxin_free(t_dmxin*x) { dmxin_close(x); } @@ -82,10 +128,12 @@ void dmxin_setup(void) { dmxin_class = class_new(gensym("dmxin"), (t_newmethod)dmxin_new, (t_method)dmxin_free, sizeof(t_dmxin), - CLASS_NOINLET, + 0, A_NULL); - + + class_addbang(dmxin_class, dmxin_bang); + #ifdef DMX4PD_POSTBANNER - DMX4PD_POSTBANNER + DMX4PD_POSTBANNER; #endif } -- cgit v1.2.1 From 3d0ac4fc230dfdebd5dcc1eaab4a7ad222279193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 16 Jun 2008 10:24:42 +0000 Subject: [dmxout] now can be used to set entire ranges svn path=/trunk/externals/iem/dmx512/; revision=10009 --- dmx512/src/Make.config.in | 2 +- dmx512/src/Makefile | 2 +- dmx512/src/dmxout.c | 116 +++++++++++++++++++++++++++++++++++----------- 3 files changed, 91 insertions(+), 29 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/Make.config.in b/dmx512/src/Make.config.in index d3ac25f..3386e58 100644 --- a/dmx512/src/Make.config.in +++ b/dmx512/src/Make.config.in @@ -25,7 +25,7 @@ TARNAME = $(LIBNAME)-$(VERSION).tgz BINTARNAME = $(LIBNAME)-$(VERSION)-bin.tgz -CFLAGS = $(DEFS) $(IFLAGS) $(WFLAGS) @CFLAGS@ +DMX4PD_CFLAGS = $(DEFS) $(IFLAGS) $(WFLAGS) @CFLAGS@ LIBS = @LIBS@ diff --git a/dmx512/src/Makefile b/dmx512/src/Makefile index e634df6..36b92bc 100644 --- a/dmx512/src/Makefile +++ b/dmx512/src/Makefile @@ -67,7 +67,7 @@ ifeq (,$(findstring clean, $(MAKECMDGOALS))) -include $(SOURCES:.c=.d) %.d: %.c @set -e; rm -f $@; \ - $(CC) $(MAKEDEP_FLAGS) $(CFLAGS) $< > $@.$$$$; \ + $(CC) $(MAKEDEP_FLAGS) $(DMX4PD_CFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$ diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index 08d70b2..6066567 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -21,6 +21,7 @@ #include static t_class *dmxout_class; +static t_class *dmxout_class2; typedef struct _dmxout { @@ -30,6 +31,7 @@ typedef struct _dmxout int x_device; t_float x_port; + int x_portrange; } t_dmxout; @@ -64,16 +66,21 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) } } -static void dmxout_doout(t_dmxout*x, short port, unsigned char value) +static void dmxout_doout(t_dmxout*x, short baseport, short portrange, dmx_t*values) { - dmx_t buffer[1] = {value}; if(x->x_device<=0) { pd_error(x, "no DMX universe found"); return; } - lseek (x->x_device, sizeof(buffer)*port, SEEK_SET); /* set to the current channel */ - write (x->x_device, buffer, sizeof(buffer)); /* write the channel */ + lseek (x->x_device, sizeof(dmx_t)*baseport, SEEK_SET); /* set to the current channel */ + write (x->x_device, values, portrange*sizeof(dmx_t)); /* write the channel */ +} + +static void dmxout_doout1(t_dmxout*x, short port, unsigned char value) +{ + dmx_t buffer[1] = {value}; + dmxout_doout(x, port, 1, buffer); } @@ -90,42 +97,86 @@ static void dmxout_float(t_dmxout*x, t_float f) return; } - dmxout_doout(x, port, val); + dmxout_doout1(x, port, val); } -static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) +static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) +{ + int count=(argcx_portrange)?argc:x->x_portrange; + dmx_t*buffer=(dmx_t*)getbytes(count*sizeof(dmx_t)); + int i=0; + + int errors=0; + + for(i=0; i255.) { + errors++; + if(f<0.)f=0.; + if(f>255)f=255; + } + buffer[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, x->x_port, count, buffer); +} + +static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) { - t_dmxout *x = (t_dmxout *)pd_new(dmxout_class); + short baseport =(short)f_baseport; + short portrange=(short)f_portrange; - t_symbol*devname=gensym(""); - x->x_portinlet=floatinlet_new(&x->x_obj, &x->x_port); + if(baseport<0 || baseport>=512) { + pd_error(x, "port %f out of bounds [0..512]", f_baseport); + baseport =0; + } + x->x_port = baseport; - x->x_device=-1; - x->x_port =0; + 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>512) { + pd_error(x, "upper port exceeds 512! clamping"); + portrange=512-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 0: break; + 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: - if(A_FLOAT==argv->a_type) { - x->x_port=atom_getfloat(argv); - } else { - devname=atom_getsymbol(argv); - } + 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: - if((A_FLOAT==(argv+0)->a_type) && (A_SYMBOL==(argv+1)->a_type)) { - x->x_port=atom_getfloat(argv+0); - devname=atom_getsymbol(argv+1); - } else if(A_FLOAT==(argv+1)->a_type && A_SYMBOL==(argv+0)->a_type) { - x->x_port=atom_getfloat(argv+1); - devname=atom_getsymbol (argv+0); - } - break; + return 0; } + x->x_device=-1; - - dmxout_open(x, devname); + dmxout_open(x, gensym("")); return (x); } @@ -144,6 +195,17 @@ void dmxout_setup(void) class_addfloat(dmxout_class, dmxout_float); + 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); + #ifdef DMX4PD_POSTBANNER DMX4PD_POSTBANNER #endif -- cgit v1.2.1 From 2dd16c5ca5fe4ccfc995f23df1b752299108a488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Thu, 19 Jun 2008 13:14:39 +0000 Subject: updated readme.txt like vincent rioux suggested; fixed configure to also search for libdmx4l (which is the library installed by he upstream dmx4linux package) svn path=/trunk/externals/iem/dmx512/; revision=10044 --- dmx512/src/configure.ac | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/configure.ac b/dmx512/src/configure.ac index ce4dc98..eff616a 100644 --- a/dmx512/src/configure.ac +++ b/dmx512/src/configure.ac @@ -39,15 +39,11 @@ dnl Replace `main' with a function in -lstk: dnl AC_CHECK_LIB(stk, main, STK=yes) +AC_CHECK_LIB(dmx4l, DMXsleep) AC_CHECK_LIB(dmx4linux, DMXsleep) -if test "x$ac_cv_lib_dmx4linux_DMXsleep" = "xyes"; then - DMX4LINUX_LFLAGS="-ldmx4linux" -fi - -dnl AC_CHECK_LIB(asound, snd_seq_close) -dnl if test "x$ac_cv_lib_asound_snd_seq_close" = "xyes"; then -dnl DFLAGS="-DHAVE_ALSA ${DFLAGS}" -dnl fi +#if test "x$ac_cv_lib_dmx4linux_DMXsleep" = "xyes"; then +# DMX4LINUX_LFLAGS="-ldmx4linux" +#fi if test "x$includedir" != "x"; then for id in $includedir -- cgit v1.2.1 From 6eacde1fb5eb79d68e5c699ab69d1cec73b23791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 20 Jun 2008 15:33:18 +0000 Subject: hmm, fixed a problem; seems to work now with an openDMX-USB svn path=/trunk/externals/iem/dmx512/; revision=10056 --- dmx512/src/dmxout.c | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index 6066567..dcfef75 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -33,8 +33,16 @@ typedef struct _dmxout t_float x_port; int x_portrange; + dmx_t x_values[512]; + } t_dmxout; +static void dmxout_clearbuf(t_dmxout*x) +{ + int i=0; + for(i=0; i<512; i++) x->x_values[i]=0; +} + static void dmxout_close(t_dmxout*x) { if(x->x_device>=0) { @@ -49,7 +57,7 @@ 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; - char*devname=""; + const char*devname=""; int fd; if(s_devname && s_devname->s_name) @@ -57,8 +65,14 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) // strncpy(args[0], "--dmx", MAXPDSTRING); // strncpy(args[1], devname, MAXPDSTRING); + devname=DMXdev(&argc, argv); + if(!devname){ + pd_error(x, "couldn't find DMX device"); + return; + } + verbose(1, "[dmxout] opening %s", devname); - fd = open (DMXdev(&argc, argv), O_WRONLY); + fd = open (devname, O_WRONLY); if(fd!=-1) { dmxout_close(x); @@ -66,21 +80,29 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) } } -static void dmxout_doout(t_dmxout*x, short baseport, short portrange, dmx_t*values) +static void dmxout_doout(t_dmxout*x, dmx_t values[512]) { + int i; if(x->x_device<=0) { pd_error(x, "no DMX universe found"); return; } +#if 0 + for(i=0; i<512; i++) { + post("dmx[%d]=%03d", i, values[i]); + } + endpost(); +#endif - lseek (x->x_device, sizeof(dmx_t)*baseport, SEEK_SET); /* set to the current channel */ - write (x->x_device, values, portrange*sizeof(dmx_t)); /* write the channel */ + lseek (x->x_device, 0, SEEK_SET); /* set to the current channel */ + write (x->x_device, values, 512); /* write the channel */ } static void dmxout_doout1(t_dmxout*x, short port, unsigned char value) { - dmx_t buffer[1] = {value}; - dmxout_doout(x, port, 1, buffer); + dmxout_clearbuf(x); + x->x_values[port]=value; + dmxout_doout(x, x->x_values); } @@ -103,11 +125,18 @@ static void dmxout_float(t_dmxout*x, t_float f) static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) { int count=(argcx_portrange)?argc:x->x_portrange; - dmx_t*buffer=(dmx_t*)getbytes(count*sizeof(dmx_t)); int i=0; - int errors=0; + int port=x->x_port; + if((port+count)>=512) { + if(count>512)count=512; + port=512-count; + } + + dmxout_clearbuf(x); + + for(i=0; i255.) { @@ -115,13 +144,13 @@ static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) if(f<0.)f=0.; if(f>255)f=255; } - buffer[i]=(unsigned char)f; + 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, x->x_port, count, buffer); + dmxout_doout(x, x->x_values); } static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) -- cgit v1.2.1 From f272f82bd7d8f6ec25e292e8ac92b81d4623901a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 30 Jun 2008 11:13:10 +0000 Subject: added "open"-mess (not functional yet) to change the device... svn path=/trunk/externals/iem/dmx512/; revision=10119 --- dmx512/src/dmx4pd.h | 4 ++-- dmx512/src/dmxout.c | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/dmx4pd.h b/dmx512/src/dmx4pd.h index cc6fe66..059c794 100644 --- a/dmx512/src/dmx4pd.h +++ b/dmx512/src/dmx4pd.h @@ -33,9 +33,9 @@ #define DMX4PD_POSTBANNER \ - { \ + do { \ post("DMX4PD ("DMX4PD_VERSION"): (c) 2008 IOhannes m zmölnig - iem @ kug"); \ - } + } while(0) #endif /* INCLUDE_DMX4PD_H__ */ diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index dcfef75..9c4c7fe 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -65,6 +65,7 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) // 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"); @@ -77,6 +78,8 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) if(fd!=-1) { dmxout_close(x); x->x_device=fd; + } else { + error("failed to open DMX-device '%s'",devname); } } @@ -217,12 +220,17 @@ static void *dmxout_free(t_dmxout*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), @@ -235,7 +243,5 @@ void dmxout_setup(void) class_addmethod(dmxout_class2, (t_method)dmxout_port, gensym("port"), A_FLOAT, A_DEFFLOAT, A_NULL); -#ifdef DMX4PD_POSTBANNER - DMX4PD_POSTBANNER -#endif + class_addmethod(dmxout_class2, (t_method)dmxout_open, gensym("open"), A_SYMBOL, A_NULL); } -- cgit v1.2.1 From 8a92ec9b79cf44f14ebaf517bc19e76e4d111233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 1 Jul 2008 09:56:21 +0000 Subject: number of values is now a preprocessor define (so we can easily change it: dmx4linux seems to be way faster with small (<128) valuearrays) svn path=/trunk/externals/iem/dmx512/; revision=10127 --- dmx512/src/dmxout.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index 9c4c7fe..83f5260 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -23,6 +23,8 @@ static t_class *dmxout_class; static t_class *dmxout_class2; +#define NUM_DMXVALUES 512 + typedef struct _dmxout { t_object x_obj; @@ -33,14 +35,14 @@ typedef struct _dmxout t_float x_port; int x_portrange; - dmx_t x_values[512]; + dmx_t x_values[NUM_DMXVALUES]; } t_dmxout; static void dmxout_clearbuf(t_dmxout*x) { int i=0; - for(i=0; i<512; i++) x->x_values[i]=0; + for(i=0; ix_values[i]=0; } static void dmxout_close(t_dmxout*x) @@ -83,7 +85,7 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) } } -static void dmxout_doout(t_dmxout*x, dmx_t values[512]) +static void dmxout_doout(t_dmxout*x, dmx_t values[NUM_DMXVALUES]) { int i; if(x->x_device<=0) { @@ -91,14 +93,14 @@ static void dmxout_doout(t_dmxout*x, dmx_t values[512]) return; } #if 0 - for(i=0; i<512; i++) { + for(i=0; ix_device, 0, SEEK_SET); /* set to the current channel */ - write (x->x_device, values, 512); /* write the channel */ + write (x->x_device, values, NUM_DMXVALUES); /* write the channel */ } static void dmxout_doout1(t_dmxout*x, short port, unsigned char value) @@ -117,8 +119,8 @@ static void dmxout_float(t_dmxout*x, t_float f) pd_error(x, "value %f out of bounds [0..255]", f); return; } - if(x->x_port<0. || x->x_port>512.) { - pd_error(x, "port %f out of bounds [0..512]", x->x_port); + 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; } @@ -132,9 +134,9 @@ static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) int errors=0; int port=x->x_port; - if((port+count)>=512) { - if(count>512)count=512; - port=512-count; + if((port+count)>=NUM_DMXVALUES) { + if(count>NUM_DMXVALUES)count=NUM_DMXVALUES; + port=NUM_DMXVALUES-count; } dmxout_clearbuf(x); @@ -162,8 +164,8 @@ static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) short portrange=(short)f_portrange; - if(baseport<0 || baseport>=512) { - pd_error(x, "port %f out of bounds [0..512]", f_baseport); + 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; @@ -175,9 +177,9 @@ static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) portrange=x->x_portrange; } - if (baseport+portrange>512) { - pd_error(x, "upper port exceeds 512! clamping"); - portrange=512-baseport; + if (baseport+portrange>NUM_DMXVALUES) { + pd_error(x, "upper port exceeds %d! clamping", NUM_DMXVALUES); + portrange=NUM_DMXVALUES-baseport; } x->x_portrange=portrange; } -- cgit v1.2.1 From be5bf77657bdf9a55ba2ab3ef0ddd1be90038458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Wed, 2 Jul 2008 11:31:27 +0000 Subject: cleaned up a bit svn path=/trunk/externals/iem/dmx512/; revision=10131 --- dmx512/src/dmxout.c | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index 83f5260..968110d 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -14,11 +14,11 @@ * ******************************************************/ - #include "dmx4pd.h" #include #include +#include static t_class *dmxout_class; static t_class *dmxout_class2; @@ -36,7 +36,6 @@ typedef struct _dmxout int x_portrange; dmx_t x_values[NUM_DMXVALUES]; - } t_dmxout; static void dmxout_clearbuf(t_dmxout*x) @@ -62,6 +61,8 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) const char*devname=""; int fd; + dmxout_close(x); + if(s_devname && s_devname->s_name) devname=s_devname->s_name; @@ -75,39 +76,32 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) } verbose(1, "[dmxout] opening %s", devname); - fd = open (devname, O_WRONLY); + fd = open (devname, O_WRONLY | O_NONBLOCK); if(fd!=-1) { - dmxout_close(x); x->x_device=fd; + dmxout_clearbuf(x); } else { - error("failed to open DMX-device '%s'",devname); + pd_error(x, "failed to open DMX-device '%s'",devname); } } -static void dmxout_doout(t_dmxout*x, dmx_t values[NUM_DMXVALUES]) -{ - int i; - if(x->x_device<=0) { +static void dmxout_doout(t_dmxout*x) { + int device = x->x_device; + if(device<=0) { pd_error(x, "no DMX universe found"); return; } -#if 0 - for(i=0; ix_device, 0, SEEK_SET); /* set to the current channel */ - write (x->x_device, values, NUM_DMXVALUES); /* write the channel */ + 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) { - dmxout_clearbuf(x); x->x_values[port]=value; - dmxout_doout(x, x->x_values); + dmxout_doout(x); } @@ -139,9 +133,6 @@ static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) port=NUM_DMXVALUES-count; } - dmxout_clearbuf(x); - - for(i=0; i255.) { @@ -155,7 +146,7 @@ static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) pd_error(x, "%d valu%s out of bound [0..255]", errors, (1==errors)?"e":"es"); } - dmxout_doout(x, x->x_values); + dmxout_doout(x); } static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) -- cgit v1.2.1 From eca3d9fda4d27f749cce9232aac71f4363e1bd1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Wed, 2 Jul 2008 11:33:21 +0000 Subject: a threaded version of [dmxout]: this should become the default svn path=/trunk/externals/iem/dmx512/; revision=10132 --- dmx512/src/dmxout_threaded.c | 302 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 dmx512/src/dmxout_threaded.c (limited to 'dmx512/src') diff --git a/dmx512/src/dmxout_threaded.c b/dmx512/src/dmxout_threaded.c new file mode 100644 index 0000000..a35fb1b --- /dev/null +++ b/dmx512/src/dmxout_threaded.c @@ -0,0 +1,302 @@ +/****************************************************** + * + * dmxout_threaded - implementation file + * + * copyleft (c) IOhannes m zmölnig + * + * 0603:forum::für::umläute:2008 + * + * institute of electronic music and acoustics (iem) + * + ****************************************************** + * + * license: GNU General Public License v.2 + * + ******************************************************/ + +#include "dmx4pd.h" + +#include +#include +#include + +#include + + +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=(argcx_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; i255.) { + 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 Date: Wed, 2 Jul 2008 11:34:38 +0000 Subject: renamed: dmxout_threaded to dmxout and dmxout to dmxout_b (blocking) svn path=/trunk/externals/iem/dmx512/; revision=10133 --- dmx512/src/dmxout.c | 180 +++++++++++++++++--------- dmx512/src/dmxout_b.c | 240 ++++++++++++++++++++++++++++++++++ dmx512/src/dmxout_threaded.c | 302 ------------------------------------------- 3 files changed, 361 insertions(+), 361 deletions(-) create mode 100644 dmx512/src/dmxout_b.c delete mode 100644 dmx512/src/dmxout_threaded.c (limited to 'dmx512/src') diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index 968110d..a35fb1b 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -1,6 +1,6 @@ /****************************************************** * - * dmxout - implementation file + * dmxout_threaded - implementation file * * copyleft (c) IOhannes m zmölnig * @@ -20,40 +20,84 @@ #include #include -static t_class *dmxout_class; -static t_class *dmxout_class2; +#include + + +static t_class *dmxout_threaded_class; +static t_class *dmxout_threaded_class2; #define NUM_DMXVALUES 512 -typedef struct _dmxout +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; - - 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) +} t_dmxout_threaded; + + +static void *dmxout_threaded_thread(void*you) { - int i=0; - for(i=0; ix_values[i]=0; + 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_close(t_dmxout*x) +static void dmxout_threaded_close() { - if(x->x_device>=0) { - close(x->x_device); + 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; } - x->x_device=-1; } -static void dmxout_open(t_dmxout*x, t_symbol*s_devname) +static void dmxout_threaded_open(t_symbol*s_devname) { int argc=2; const char *args[2] = {"--dmx", s_devname->s_name}; @@ -61,51 +105,56 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) const char*devname=""; int fd; - dmxout_close(x); + 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]: trying to open '%s'", args[1]); + verbose(2, "[dmxout_threaded]: trying to open '%s'", args[1]); devname=DMXdev(&argc, argv); if(!devname){ - pd_error(x, "couldn't find DMX device"); + error("couldn't find DMX device"); return; } - verbose(1, "[dmxout] opening %s", devname); + verbose(1, "[dmxout_threaded] opening %s", devname); - fd = open (devname, O_WRONLY | O_NONBLOCK); + fd = open (devname, O_WRONLY); if(fd!=-1) { - x->x_device=fd; - dmxout_clearbuf(x); + 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 { - pd_error(x, "failed to open DMX-device '%s'",devname); + error("failed to open DMX-device '%s'",devname); } } -static void dmxout_doout(t_dmxout*x) { - int device = x->x_device; - if(device<=0) { +static void dmxout_threaded_doout(t_dmxout_threaded*x) { + if(g_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) +static void dmxout_threaded_doout1(t_dmxout_threaded*x, short port, unsigned char value) { - x->x_values[port]=value; - dmxout_doout(x); + g_values[port]=value; + dmxout_threaded_doout(x); } -static void dmxout_float(t_dmxout*x, t_float f) +static void dmxout_threaded_float(t_dmxout_threaded*x, t_float f) { unsigned char val=(unsigned char)f; short port = (short)x->x_port; @@ -118,10 +167,10 @@ static void dmxout_float(t_dmxout*x, t_float f) return; } - dmxout_doout1(x, port, val); + dmxout_threaded_doout1(x, port, val); } -static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) +static void dmxout_threaded_list(t_dmxout_threaded*x, t_symbol*s, int argc, t_atom*argv) { int count=(argcx_portrange)?argc:x->x_portrange; int i=0; @@ -140,16 +189,16 @@ static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) if(f<0.)f=0.; if(f>255)f=255; } - x->x_values[port+i]=(unsigned char)f; + 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_doout(x); + dmxout_threaded_doout(x); } -static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) +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; @@ -175,23 +224,23 @@ static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) x->x_portrange=portrange; } -static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) +static void *dmxout_threaded_new(t_symbol*s, int argc, t_atom*argv) { t_floatarg baseport=0.f, portrange=0.f; - t_dmxout *x = 0; + t_dmxout_threaded *x = 0; switch(argc) { case 2: - x=(t_dmxout *)pd_new(dmxout_class2); + 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_port(x, baseport, portrange); + dmxout_threaded_port(x, baseport, portrange); break; case 1: baseport=atom_getfloat(argv); case 0: - x=(t_dmxout *)pd_new(dmxout_class); + 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; @@ -199,42 +248,55 @@ static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) default: return 0; } - x->x_device=-1; - - dmxout_open(x, gensym("")); return (x); } -static void *dmxout_free(t_dmxout*x) +static void *dmxout_threaded_free(t_dmxout_threaded*x) { - dmxout_close(x); + // dmxout_threaded_close(); } +static void dmxout_threaded_init(void) { + int i=0; + g_thread_id=0; + g_mutex=NULL; + for(i=0; i +#include +#include + +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; ix_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=(argcx_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; i255.) { + 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); +} diff --git a/dmx512/src/dmxout_threaded.c b/dmx512/src/dmxout_threaded.c deleted file mode 100644 index a35fb1b..0000000 --- a/dmx512/src/dmxout_threaded.c +++ /dev/null @@ -1,302 +0,0 @@ -/****************************************************** - * - * dmxout_threaded - implementation file - * - * copyleft (c) IOhannes m zmölnig - * - * 0603:forum::für::umläute:2008 - * - * institute of electronic music and acoustics (iem) - * - ****************************************************** - * - * license: GNU General Public License v.2 - * - ******************************************************/ - -#include "dmx4pd.h" - -#include -#include -#include - -#include - - -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=(argcx_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; i255.) { - 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 Date: Wed, 2 Jul 2008 11:40:32 +0000 Subject: made the threaded version the default; renamed the blocking version to [dmxout_b] svn path=/trunk/externals/iem/dmx512/; revision=10134 --- dmx512/src/dmxout.c | 79 ++++++++++++++++++++++++-------------------------- dmx512/src/dmxout_b.c | 80 +++++++++++++++++++++++++-------------------------- 2 files changed, 78 insertions(+), 81 deletions(-) (limited to 'dmx512/src') diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c index a35fb1b..18358ce 100644 --- a/dmx512/src/dmxout.c +++ b/dmx512/src/dmxout.c @@ -1,6 +1,6 @@ /****************************************************** * - * dmxout_threaded - implementation file + * dmxout - implementation file * * copyleft (c) IOhannes m zmölnig * @@ -23,8 +23,8 @@ #include -static t_class *dmxout_threaded_class; -static t_class *dmxout_threaded_class2; +static t_class *dmxout_class; +static t_class *dmxout_class2; #define NUM_DMXVALUES 512 @@ -34,7 +34,7 @@ static dmx_t g_values[NUM_DMXVALUES]; static int g_device; static int g_thread_running, g_thread_continue; -typedef struct _dmxout_threaded +typedef struct _dmxout { t_object x_obj; @@ -43,10 +43,10 @@ typedef struct _dmxout_threaded int x_portrange; -} t_dmxout_threaded; +} t_dmxout; -static void *dmxout_threaded_thread(void*you) +static void *dmxout_thread(void*you) { pthread_mutex_t *mutex=g_mutex; struct timeval timout; @@ -66,12 +66,11 @@ static void *dmxout_threaded_thread(void*you) pthread_mutex_unlock(g_mutex); } g_thread_running=0; - printf("quit thread"); return NULL; } -static void dmxout_threaded_close() +static void dmxout_close() { if(g_device>=0) { close(g_device); @@ -97,7 +96,7 @@ static void dmxout_threaded_close() } -static void dmxout_threaded_open(t_symbol*s_devname) +static void dmxout_open(t_symbol*s_devname) { int argc=2; const char *args[2] = {"--dmx", s_devname->s_name}; @@ -105,20 +104,20 @@ static void dmxout_threaded_open(t_symbol*s_devname) const char*devname=""; int fd; - dmxout_threaded_close(); + dmxout_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]); + verbose(2, "[dmxout]: 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); + verbose(1, "[dmxout] opening %s", devname); fd = open (devname, O_WRONLY); @@ -132,14 +131,14 @@ static void dmxout_threaded_open(t_symbol*s_devname) error("couldn't create mutex"); } else { g_thread_continue = 1; - pthread_create(&g_thread_id, 0, dmxout_threaded_thread, NULL); + pthread_create(&g_thread_id, 0, dmxout_thread, NULL); } } else { error("failed to open DMX-device '%s'",devname); } } -static void dmxout_threaded_doout(t_dmxout_threaded*x) { +static void dmxout_doout(t_dmxout*x) { if(g_device<=0) { pd_error(x, "no DMX universe found"); return; @@ -147,14 +146,14 @@ static void dmxout_threaded_doout(t_dmxout_threaded*x) { } -static void dmxout_threaded_doout1(t_dmxout_threaded*x, short port, unsigned char value) +static void dmxout_doout1(t_dmxout*x, short port, unsigned char value) { g_values[port]=value; - dmxout_threaded_doout(x); + dmxout_doout(x); } -static void dmxout_threaded_float(t_dmxout_threaded*x, t_float f) +static void dmxout_float(t_dmxout*x, t_float f) { unsigned char val=(unsigned char)f; short port = (short)x->x_port; @@ -167,10 +166,10 @@ static void dmxout_threaded_float(t_dmxout_threaded*x, t_float f) return; } - dmxout_threaded_doout1(x, port, val); + dmxout_doout1(x, port, val); } -static void dmxout_threaded_list(t_dmxout_threaded*x, t_symbol*s, int argc, t_atom*argv) +static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) { int count=(argcx_portrange)?argc:x->x_portrange; int i=0; @@ -195,10 +194,10 @@ static void dmxout_threaded_list(t_dmxout_threaded*x, t_symbol*s, int argc, t_at pd_error(x, "%d valu%s out of bound [0..255]", errors, (1==errors)?"e":"es"); } - dmxout_threaded_doout(x); + dmxout_doout(x); } -static void dmxout_threaded_port(t_dmxout_threaded*x, t_float f_baseport, t_floatarg f_portrange) +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; @@ -224,23 +223,23 @@ static void dmxout_threaded_port(t_dmxout_threaded*x, t_float f_baseport, t_floa x->x_portrange=portrange; } -static void *dmxout_threaded_new(t_symbol*s, int argc, t_atom*argv) +static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) { t_floatarg baseport=0.f, portrange=0.f; - t_dmxout_threaded *x = 0; + t_dmxout *x = 0; switch(argc) { case 2: - x=(t_dmxout_threaded *)pd_new(dmxout_threaded_class2); + 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_threaded_port(x, baseport, portrange); + dmxout_port(x, baseport, portrange); break; case 1: baseport=atom_getfloat(argv); case 0: - x=(t_dmxout_threaded *)pd_new(dmxout_threaded_class); + 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; @@ -251,12 +250,12 @@ static void *dmxout_threaded_new(t_symbol*s, int argc, t_atom*argv) return (x); } -static void *dmxout_threaded_free(t_dmxout_threaded*x) +static void *dmxout_free(t_dmxout*x) { - // dmxout_threaded_close(); + // dmxout_close(); } -static void dmxout_threaded_init(void) { +static void dmxout_init(void) { int i=0; g_thread_id=0; g_mutex=NULL; @@ -266,37 +265,35 @@ static void dmxout_threaded_init(void) { g_thread_running=0; g_thread_continue=0; - dmxout_threaded_open(gensym("")); - - post("running thread %d for device %d", g_thread_id, g_device); + dmxout_open(gensym("")); } -void dmxout_threaded_setup(void) +void dmxout_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), + 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_threaded_class, dmxout_threaded_float); + class_addfloat(dmxout_class, dmxout_float); - dmxout_threaded_class2 = class_new(gensym("dmxout_threaded"), (t_newmethod)dmxout_threaded_new, (t_method)dmxout_threaded_free, - sizeof(t_dmxout_threaded), + 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_threaded_class2, dmxout_threaded_list); + class_addlist(dmxout_class2, dmxout_list); - class_addmethod(dmxout_threaded_class2, (t_method)dmxout_threaded_port, gensym("port"), + class_addmethod(dmxout_class2, (t_method)dmxout_port, gensym("port"), A_FLOAT, A_DEFFLOAT, A_NULL); - dmxout_threaded_init(); + dmxout_init(); } diff --git a/dmx512/src/dmxout_b.c b/dmx512/src/dmxout_b.c index 968110d..9623397 100644 --- a/dmx512/src/dmxout_b.c +++ b/dmx512/src/dmxout_b.c @@ -1,6 +1,8 @@ /****************************************************** * - * dmxout - implementation file + * dmxout_b - implementation file + * + * this is the "blocking" version * * copyleft (c) IOhannes m zmölnig * @@ -20,12 +22,12 @@ #include #include -static t_class *dmxout_class; -static t_class *dmxout_class2; +static t_class *dmxout_b_class; +static t_class *dmxout_b_class2; #define NUM_DMXVALUES 512 -typedef struct _dmxout +typedef struct _dmxout_b { t_object x_obj; @@ -36,15 +38,15 @@ typedef struct _dmxout int x_portrange; dmx_t x_values[NUM_DMXVALUES]; -} t_dmxout; +} t_dmxout_b; -static void dmxout_clearbuf(t_dmxout*x) +static void dmxout_b_clearbuf(t_dmxout_b*x) { int i=0; for(i=0; ix_values[i]=0; } -static void dmxout_close(t_dmxout*x) +static void dmxout_b_close(t_dmxout_b*x) { if(x->x_device>=0) { close(x->x_device); @@ -53,7 +55,7 @@ static void dmxout_close(t_dmxout*x) } -static void dmxout_open(t_dmxout*x, t_symbol*s_devname) +static void dmxout_b_open(t_dmxout_b*x, t_symbol*s_devname) { int argc=2; const char *args[2] = {"--dmx", s_devname->s_name}; @@ -61,32 +63,30 @@ static void dmxout_open(t_dmxout*x, t_symbol*s_devname) const char*devname=""; int fd; - dmxout_close(x); + dmxout_b_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]); + verbose(2, "[dmxout_b]: 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); + verbose(1, "[dmxout_b] opening %s", devname); fd = open (devname, O_WRONLY | O_NONBLOCK); if(fd!=-1) { x->x_device=fd; - dmxout_clearbuf(x); + dmxout_b_clearbuf(x); } else { pd_error(x, "failed to open DMX-device '%s'",devname); } } -static void dmxout_doout(t_dmxout*x) { +static void dmxout_b_doout(t_dmxout_b*x) { int device = x->x_device; if(device<=0) { pd_error(x, "no DMX universe found"); @@ -98,14 +98,14 @@ static void dmxout_doout(t_dmxout*x) { } -static void dmxout_doout1(t_dmxout*x, short port, unsigned char value) +static void dmxout_b_doout1(t_dmxout_b*x, short port, unsigned char value) { x->x_values[port]=value; - dmxout_doout(x); + dmxout_b_doout(x); } -static void dmxout_float(t_dmxout*x, t_float f) +static void dmxout_b_float(t_dmxout_b*x, t_float f) { unsigned char val=(unsigned char)f; short port = (short)x->x_port; @@ -118,10 +118,10 @@ static void dmxout_float(t_dmxout*x, t_float f) return; } - dmxout_doout1(x, port, val); + dmxout_b_doout1(x, port, val); } -static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) +static void dmxout_b_list(t_dmxout_b*x, t_symbol*s, int argc, t_atom*argv) { int count=(argcx_portrange)?argc:x->x_portrange; int i=0; @@ -146,10 +146,10 @@ static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) pd_error(x, "%d valu%s out of bound [0..255]", errors, (1==errors)?"e":"es"); } - dmxout_doout(x); + dmxout_b_doout(x); } -static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) +static void dmxout_b_port(t_dmxout_b*x, t_float f_baseport, t_floatarg f_portrange) { short baseport =(short)f_baseport; short portrange=(short)f_portrange; @@ -175,23 +175,23 @@ static void dmxout_port(t_dmxout*x, t_float f_baseport, t_floatarg f_portrange) x->x_portrange=portrange; } -static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) +static void *dmxout_b_new(t_symbol*s, int argc, t_atom*argv) { t_floatarg baseport=0.f, portrange=0.f; - t_dmxout *x = 0; + t_dmxout_b *x = 0; switch(argc) { case 2: - x=(t_dmxout *)pd_new(dmxout_class2); + x=(t_dmxout_b *)pd_new(dmxout_b_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); + dmxout_b_port(x, baseport, portrange); break; case 1: baseport=atom_getfloat(argv); case 0: - x=(t_dmxout *)pd_new(dmxout_class); + x=(t_dmxout_b *)pd_new(dmxout_b_class); x->x_portinlet=floatinlet_new(&x->x_obj, &x->x_port); x->x_port = baseport; x->x_portrange = -1; @@ -201,40 +201,40 @@ static void *dmxout_new(t_symbol*s, int argc, t_atom*argv) } x->x_device=-1; - dmxout_open(x, gensym("")); + dmxout_b_open(x, gensym("")); return (x); } -static void *dmxout_free(t_dmxout*x) +static void *dmxout_b_free(t_dmxout_b*x) { - dmxout_close(x); + dmxout_b_close(x); } -void dmxout_setup(void) +void dmxout_b_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), + dmxout_b_class = class_new(gensym("dmxout_b"), (t_newmethod)dmxout_b_new, (t_method)dmxout_b_free, + sizeof(t_dmxout_b), 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); + class_addfloat(dmxout_b_class, dmxout_b_float); + class_addmethod(dmxout_b_class, (t_method)dmxout_b_open, gensym("open"), A_SYMBOL, A_NULL); - dmxout_class2 = class_new(gensym("dmxout"), (t_newmethod)dmxout_new, (t_method)dmxout_free, - sizeof(t_dmxout), + dmxout_b_class2 = class_new(gensym("dmxout_b"), (t_newmethod)dmxout_b_new, (t_method)dmxout_b_free, + sizeof(t_dmxout_b), 0, A_GIMME, A_NULL); - class_addlist(dmxout_class2, dmxout_list); + class_addlist(dmxout_b_class2, dmxout_b_list); - class_addmethod(dmxout_class2, (t_method)dmxout_port, gensym("port"), + class_addmethod(dmxout_b_class2, (t_method)dmxout_b_port, gensym("port"), A_FLOAT, A_DEFFLOAT, A_NULL); - class_addmethod(dmxout_class2, (t_method)dmxout_open, gensym("open"), A_SYMBOL, A_NULL); + class_addmethod(dmxout_b_class2, (t_method)dmxout_b_open, gensym("open"), A_SYMBOL, A_NULL); } -- cgit v1.2.1