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/GnuGPL.txt | 340 ++++++++++++++++++++++++++++++++++++++++++++++ dmx512/README.txt | 4 + 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 +++++++++++++++++++++ 9 files changed, 858 insertions(+) create mode 100644 dmx512/GnuGPL.txt create mode 100644 dmx512/README.txt 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') diff --git a/dmx512/GnuGPL.txt b/dmx512/GnuGPL.txt new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/dmx512/GnuGPL.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/dmx512/README.txt b/dmx512/README.txt new file mode 100644 index 0000000..96579bc --- /dev/null +++ b/dmx512/README.txt @@ -0,0 +1,4 @@ +DMX512 +====== + +controlling DMX from within Pd 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') 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') 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') 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') 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') 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') 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/README.txt | 61 ++++++++++++++ dmx512/dmx4linux2.6.1.patch | 196 ++++++++++++++++++++++++++++++++++++++++++++ dmx512/src/Make.config.in | 2 +- dmx512/src/Makefile | 2 +- dmx512/src/dmxout.c | 116 ++++++++++++++++++++------ 5 files changed, 348 insertions(+), 29 deletions(-) create mode 100644 dmx512/dmx4linux2.6.1.patch (limited to 'dmx512') diff --git a/dmx512/README.txt b/dmx512/README.txt index 96579bc..7cb93f8 100644 --- a/dmx512/README.txt +++ b/dmx512/README.txt @@ -2,3 +2,64 @@ DMX512 ====== controlling DMX from within Pd + + + +A. setting up dmx4linux +======================= +note: there are debian(etch)-packages for dmx4linux, + but these seem to be pretty old (2.5) + i haven't really tried these. + instead i used dmx4linux-2.6.1 + +first get dmx4linux from http://llg.cubic.org/dmx4linux/ +and extract it. + +the drivers should compile fine with 2.6.18 kernels, but +alas! i am using 2.6.25 and there are some quirks to make +these work. + +first of all i had problems compiling the ISA/PCI/parport drivers, +but since i only wanted to use a USB device, i just disabled those. +second, dmx4linux's build-system tries to override CFLAGS when building +the kernel-modules, which newer kernel versions (e.g. 2.6.25) do not like +at all. i had to modify the makefiles in order to use the EXTRA_CFLAGS + +all the changes i did can be found in the dmx4linux2.6.1.patch +just run: +% patch -p1 < dmx4linux2.6.1.patch + +then do +% ./configure +(which will produce a /tmp/dmxconfig.mk) +and run +% make + +finally become root and do +# make install + + +load the appropriate kernel modules + + +B. permissions +the dmx device-files created by udev will be owned by root.root and not be +read/writeable by anyone but root. +in order to use them as an ordinary user, become root and create a group +"dmx" and add users who need access to the dmx-devices to this group: +# addgroup dmx +# adduser zmoelnig dmx + +in theory this should be enough to allow you access to your dmx devices +the next time you load a dmx-driver +if you have problems, try plugging your device out and in again + + + + + + + + + + diff --git a/dmx512/dmx4linux2.6.1.patch b/dmx512/dmx4linux2.6.1.patch new file mode 100644 index 0000000..842a3ba --- /dev/null +++ b/dmx512/dmx4linux2.6.1.patch @@ -0,0 +1,196 @@ +diff -Naur dmx4linux-2.6.1/configure dmx4linux-2.6.1.new/configure +--- dmx4linux-2.6.1/configure 2008-04-25 02:13:31.000000000 +0200 ++++ dmx4linux-2.6.1.new/configure 2008-06-14 16:56:21.000000000 +0200 +@@ -43,7 +43,7 @@ + + echo "AS31=$DMXROOT/tools/as31-unix" >> /tmp/dmxconfig.mk + +-echo "CFLAGS+=-Wall -O2 -I$DMXROOT/include" >> /tmp/dmxconfig.mk ++echo "DMX_CFLAGS+=-Wall -O2 -I$DMXROOT/include" >> /tmp/dmxconfig.mk + echo "LDFLAGS+=-L$DMXROOT/libs" >> /tmp/dmxconfig.mk + + if [ -f /usr/include/gpm.h -o -f /usr/local/include/gpm.h ] ; then +diff -Naur dmx4linux-2.6.1/drivers/devices/dgm/Makefile dmx4linux-2.6.1.new/drivers/devices/dgm/Makefile +--- dmx4linux-2.6.1/drivers/devices/dgm/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/devices/dgm/Makefile 2008-06-14 16:53:25.000000000 +0200 +@@ -17,7 +17,7 @@ + endif + + ifneq ($(KERNELRELEASE),) +-EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" ++EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" $(DMX_CFLAGS) + else + + PWD := $(shell pwd) +diff -Naur dmx4linux-2.6.1/drivers/devices/isa/Makefile dmx4linux-2.6.1.new/drivers/devices/isa/Makefile +--- dmx4linux-2.6.1/drivers/devices/isa/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/devices/isa/Makefile 2008-06-14 16:54:02.000000000 +0200 +@@ -5,7 +5,7 @@ + obj-m := dmxenlight.o + + ifneq ($(KERNELRELEASE),) +-EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" ++EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" $(DMX_CFLAGS) + else + + PWD := $(shell pwd) +diff -Naur dmx4linux-2.6.1/drivers/devices/isa/soundlight/Makefile dmx4linux-2.6.1.new/drivers/devices/isa/soundlight/Makefile +--- dmx4linux-2.6.1/drivers/devices/isa/soundlight/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/devices/isa/soundlight/Makefile 2008-06-14 16:53:57.000000000 +0200 +@@ -4,7 +4,7 @@ + + ifneq ($(KERNELRELEASE),) + dmxsoundlight-objs=soundlight.o autoprobe.o slh_general.o slh1512a.o slh1512b.o slh1512c.o card_access.o +-EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" ++EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" $(DMX_CFLAGS) + + $(src)/%.h : $(src)/%.asm + $(AS31)/as31 -Fbin -s $< | sh $(src)/bin2hex.sh $< > $@ +diff -Naur dmx4linux-2.6.1/drivers/devices/Makefile dmx4linux-2.6.1.new/drivers/devices/Makefile +--- dmx4linux-2.6.1/drivers/devices/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/devices/Makefile 2008-06-14 16:58:50.000000000 +0200 +@@ -5,15 +5,15 @@ + ifneq ($(CONFIG_USB),) + $(MAKE) -C usb $@ + endif +-ifneq ($(CONFIG_ISA),) +- $(MAKE) -C isa $@ +-endif +-ifneq ($(CONFIG_PCI),) +- $(MAKE) -C pci $@ +-endif +-ifneq ($(CONFIG_PARPORT),) +- $(MAKE) -C parport $@ +-endif ++#ifneq ($(CONFIG_ISA),) ++# $(MAKE) -C isa $@ ++#endif ++#ifneq ($(CONFIG_PCI),) ++# $(MAKE) -C pci $@ ++#endif ++#ifneq ($(CONFIG_PARPORT),) ++# $(MAKE) -C parport $@ ++#endif + + # PCMCIA dmx drivers are currently not supported on 2.6 kernels + #ifneq ($(CONFIG_PCMCIA),) +diff -Naur dmx4linux-2.6.1/drivers/devices/misc/Makefile dmx4linux-2.6.1.new/drivers/devices/misc/Makefile +--- dmx4linux-2.6.1/drivers/devices/misc/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/devices/misc/Makefile 2008-06-14 16:54:07.000000000 +0200 +@@ -3,7 +3,7 @@ + obj-m := dmxdummy.o + + ifneq ($(KERNELRELEASE),) +-EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" ++EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" $(DMX_CFLAGS) + else + + PWD := $(shell pwd) +diff -Naur dmx4linux-2.6.1/drivers/devices/parport/Makefile dmx4linux-2.6.1.new/drivers/devices/parport/Makefile +--- dmx4linux-2.6.1/drivers/devices/parport/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/devices/parport/Makefile 2008-06-14 16:53:52.000000000 +0200 +@@ -5,7 +5,7 @@ + obj-m := avrdmx.o dmx30.o dmx43.o dmxpcp.o okddmx.o lpr2dmx.o + + ifneq ($(KERNELRELEASE),) +-EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" ++EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" $(DMX_CFLAGS) + else + + PWD := $(shell pwd) +diff -Naur dmx4linux-2.6.1/drivers/devices/pci/Makefile dmx4linux-2.6.1.new/drivers/devices/pci/Makefile +--- dmx4linux-2.6.1/drivers/devices/pci/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/devices/pci/Makefile 2008-06-14 16:53:47.000000000 +0200 +@@ -5,7 +5,7 @@ + obj-m += slh1514pci.o + + ifneq ($(KERNELRELEASE),) +-EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" -DDMXPCI_DMX4LINUX=1 ++EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" -DDMXPCI_DMX4LINUX=1 $(DMX_CFLAGS) + else + + PWD := $(shell pwd) +diff -Naur dmx4linux-2.6.1/drivers/devices/pcmcia/Makefile dmx4linux-2.6.1.new/drivers/devices/pcmcia/Makefile +--- dmx4linux-2.6.1/drivers/devices/pcmcia/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/devices/pcmcia/Makefile 2008-06-14 16:53:38.000000000 +0200 +@@ -5,7 +5,7 @@ + obj-m += digimedia_cs.o + + ifneq ($(KERNELRELEASE),) +-EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" ++EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" $(DMX_CFLAGS) + else + + PWD := $(shell pwd) +diff -Naur dmx4linux-2.6.1/drivers/devices/usb/Makefile dmx4linux-2.6.1.new/drivers/devices/usb/Makefile +--- dmx4linux-2.6.1/drivers/devices/usb/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/devices/usb/Makefile 2008-06-14 16:53:14.000000000 +0200 +@@ -5,7 +5,7 @@ + obj-m := usb2dmx.o ftdi2dmx.o sunlite.o + + ifneq ($(KERNELRELEASE),) +-EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" ++EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" $(DMX_CFLAGS) + else + + PWD := $(shell pwd) +diff -Naur dmx4linux-2.6.1/drivers/dmxdev/Makefile dmx4linux-2.6.1.new/drivers/dmxdev/Makefile +--- dmx4linux-2.6.1/drivers/dmxdev/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/drivers/dmxdev/Makefile 2008-06-14 16:54:22.000000000 +0200 +@@ -8,7 +8,8 @@ + dmxdev-objs:=dmx_dev.o dmx_proc.o dmx_props.o dmx_family.o dmx_driver.o dmx_interface.o dmx_universe.o dmx_fileinfo.o + EXTRA_CFLAGS:=-DDMXVERSION=\"${DMXVERSION}\" \ + -DDMXOUTMINOR=$(DMXOUTMINOR) -DDMXINMINOR=$(DMXINMINOR) \ +- -DVERSIONMAJOR=$(VERSIONMAJOR) -DVERSIONMINOR=$(VERSIONMINOR) ++ -DVERSIONMAJOR=$(VERSIONMAJOR) -DVERSIONMINOR=$(VERSIONMINOR) \ ++ $(DMX_CFLAGS) + + else + +diff -Naur dmx4linux-2.6.1/examples/htmlexamples/Makefile dmx4linux-2.6.1.new/examples/htmlexamples/Makefile +--- dmx4linux-2.6.1/examples/htmlexamples/Makefile 2008-04-25 02:13:31.000000000 +0200 ++++ dmx4linux-2.6.1.new/examples/htmlexamples/Makefile 2008-06-14 16:54:42.000000000 +0200 +@@ -2,7 +2,7 @@ + + TARGETS= nonblockread selectread simpleread simplewrite + +-CFLAGS+= -Wall ++CFLAGS+= $(DMX_CFLAGS) -Wall + + all: $(TARGETS) + +diff -Naur dmx4linux-2.6.1/examples/Makefile dmx4linux-2.6.1.new/examples/Makefile +--- dmx4linux-2.6.1/examples/Makefile 2008-04-25 02:13:31.000000000 +0200 ++++ dmx4linux-2.6.1.new/examples/Makefile 2008-06-14 17:00:15.000000000 +0200 +@@ -6,6 +6,8 @@ + + -include /tmp/dmxconfig.mk + ++CFLAGS += $(DMX_CFLAGS) ++ + TARGETS= pingdmx setdmx dmxinfo dmxdump + + all: $(TARGETS) +diff -Naur dmx4linux-2.6.1/tools/Makefile dmx4linux-2.6.1.new/tools/Makefile +--- dmx4linux-2.6.1/tools/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/tools/Makefile 2008-06-14 16:55:16.000000000 +0200 +@@ -4,7 +4,7 @@ + MANINSTALLPATH=$(DMXPREFIX)/man/man1 + + DMXCONSOLELIBS+= -Lpointer pointer/pointer.a +-CFLAGS+= -Ipointer ++CFLAGS+= -Ipointer $(DMX_CFLAGS) + + ifdef CONFIG_HAVE_LIRC + CFLAGS+= -DHAVE_LIRC=1 +diff -Naur dmx4linux-2.6.1/tools/pointer/Makefile dmx4linux-2.6.1.new/tools/pointer/Makefile +--- dmx4linux-2.6.1/tools/pointer/Makefile 2008-04-25 02:13:32.000000000 +0200 ++++ dmx4linux-2.6.1.new/tools/pointer/Makefile 2008-06-14 16:59:35.000000000 +0200 +@@ -1,5 +1,7 @@ + -include /tmp/dmxconfig.mk + ++CFLAGS+=$(DMX_CFLAGS) ++ + C= js.c pointer.c ps2.c serial.c + ifdef CONFIG_HAVE_GPM + C+= gpm.c 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/README.txt | 22 +++++++++++++++++++++- dmx512/src/configure.ac | 12 ++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) (limited to 'dmx512') diff --git a/dmx512/README.txt b/dmx512/README.txt index 7cb93f8..3eda9d8 100644 --- a/dmx512/README.txt +++ b/dmx512/README.txt @@ -38,11 +38,14 @@ and run finally become root and do # make install +after all has gone well, load the appropriate kernel modules -load the appropriate kernel modules + +btw, it is always a good idea to read the readme that comes with dmx4linux... B. permissions +============== the dmx device-files created by udev will be owned by root.root and not be read/writeable by anyone but root. in order to use them as an ordinary user, become root and create a group @@ -55,9 +58,26 @@ the next time you load a dmx-driver if you have problems, try plugging your device out and in again +C. compiling the Pd-objects +=========================== +so now it is time to get the Pd-objects going. +for this change into the "./src" directory of the iem/dmx512/ folder +(this might well be the folder that holds this README.txt you are currently +reading) + +if you have obtained the source-code via subversion, you will first have to run +% autoconf +(this should not be needed if you downloaded the sources as a release tarball; +that is: if the person who created the tarball has not forgotten to do it for you) + +then run +% configure +% make +you should now have 2 binary files in the src/ folder called [dmxin] and [dmxout] +go on and use em! 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 3b275827ce30bc37dd33ea83448d3fb8d560c40b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Thu, 19 Jun 2008 13:29:33 +0000 Subject: added help-patch for [dmxout] svn path=/trunk/externals/iem/dmx512/; revision=10045 --- dmx512/help/dmxout-help.pd | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 dmx512/help/dmxout-help.pd (limited to 'dmx512') diff --git a/dmx512/help/dmxout-help.pd b/dmx512/help/dmxout-help.pd new file mode 100644 index 0000000..36f8c6c --- /dev/null +++ b/dmx512/help/dmxout-help.pd @@ -0,0 +1,36 @@ +#N canvas 0 0 719 485 10; +#X obj 102 31 dmxout; +#X text 158 31 control DMX512-devices from within Pd; +#X text 85 106 DMX512 is a protocol for controlling lights and magic +\, similar to MIDI; +#X obj 62 240 dmxout; +#X floatatom 62 171 5 0 255 1 value - -; +#X floatatom 101 195 5 0 255 1 channel - -; +#X floatatom 232 171 5 0 255 1 value - -; +#X obj 232 240 dmxout 5; +#X text 232 261 default channel: 5; +#X obj 402 270 dmxout 5 4; +#X text 402 291 default channel: 5 6 7 8; +#X msg 402 169 \$1 100 \$1 100; +#X text 502 170 4 values \, one for each channel; +#X floatatom 402 151 5 0 255 1 value - -; +#X msg 488 239 6; +#X text 518 241 channels 6 7 ...; +#X msg 469 202 10 3; +#X text 504 201 channels 10 11 12; +#X text 80 336 [dmxout] is currently linux only. ports to other OSs +are desired but not high priority.; +#X text 80 378 by default \, [dmxout] will try to open the device /dev/dmx +; +#X text 79 401 you can change the default dmx-device globally by setting +the "DMX" environment variable prior to creating the [dmxout] object +(e.g. before you start Pd); +#X text 501 34 (c) 2008 IOhannes m zmölnig; +#X text 559 53 iem @ KUG; +#X connect 4 0 3 0; +#X connect 5 0 3 1; +#X connect 6 0 7 0; +#X connect 11 0 9 0; +#X connect 13 0 11 0; +#X connect 14 0 9 1; +#X connect 16 0 9 1; -- 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') 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 caaefca7ebe5a15d99f358b68dd84a7ad47bd317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 30 Jun 2008 10:45:57 +0000 Subject: ... svn path=/trunk/externals/iem/dmx512/; revision=10117 --- dmx512/README.txt | 3 +++ 1 file changed, 3 insertions(+) (limited to 'dmx512') diff --git a/dmx512/README.txt b/dmx512/README.txt index 3eda9d8..346934e 100644 --- a/dmx512/README.txt +++ b/dmx512/README.txt @@ -57,6 +57,9 @@ in theory this should be enough to allow you access to your dmx devices the next time you load a dmx-driver if you have problems, try plugging your device out and in again +if you don't care for a clean setup, you could also just grant everyone read/write permissions. +this might be a security risk. + C. compiling the Pd-objects =========================== -- cgit v1.2.1 From 0743593e7adec852e293e5e42d851256c225cd74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 30 Jun 2008 11:01:03 +0000 Subject: split the readme into several files svn path=/trunk/externals/iem/dmx512/; revision=10118 --- dmx512/FAQ.txt | 2 ++ dmx512/README.dmx4linux.txt | 79 +++++++++++++++++++++++++++++++++++++++++++ dmx512/README.txt | 82 ++++++++++++--------------------------------- 3 files changed, 102 insertions(+), 61 deletions(-) create mode 100644 dmx512/FAQ.txt create mode 100644 dmx512/README.dmx4linux.txt (limited to 'dmx512') diff --git a/dmx512/FAQ.txt b/dmx512/FAQ.txt new file mode 100644 index 0000000..484dc8a --- /dev/null +++ b/dmx512/FAQ.txt @@ -0,0 +1,2 @@ +Q: Where do I find answers to questions not answered here? +A: try the "Pure Data" community mailinglist http://lists.puredata.info diff --git a/dmx512/README.dmx4linux.txt b/dmx512/README.dmx4linux.txt new file mode 100644 index 0000000..94c5bfc --- /dev/null +++ b/dmx512/README.dmx4linux.txt @@ -0,0 +1,79 @@ +DMX512 +====== + +THIS IS NOT A DOCUMENTATION. +NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED! + +these are just random notes on what i found useful in getting dmx4linux running. +it might freeze your computer or boil your lights. + + +A. setting up dmx4linux +======================= +note: there are debian(etch)-packages for dmx4linux, + but these seem to be pretty old (2.5) + i haven't really tried these. + instead i used dmx4linux-2.6.1 + +first get dmx4linux from http://llg.cubic.org/dmx4linux/ +and extract it. + +the drivers should compile fine with 2.6.18 kernels, but +alas! i am using 2.6.25 and there are some quirks to make +these work. + +first of all i had problems compiling the ISA/PCI/parport drivers, +but since i only wanted to use a USB device, i just disabled those. +second, dmx4linux's build-system tries to override CFLAGS when building +the kernel-modules, which newer kernel versions (e.g. 2.6.25) do not like +at all. i had to modify the makefiles in order to use the EXTRA_CFLAGS + +all the changes i did can be found in the dmx4linux2.6.1.patch +just run: +% patch -p1 < dmx4linux2.6.1.patch + +then do +% ./configure +(which will produce a /tmp/dmxconfig.mk) +and run +% make + +finally become root and do +# make install + +after all has gone well, load the appropriate kernel modules + + +btw, it is always a good idea to read the readme that comes with dmx4linux... + + +B. permissions +============== +the dmx device-files created by udev will be owned by root.root and not be +read/writeable by anyone but root. +in order to use them as an ordinary user, become root and create a group +"dmx" and add users who need access to the dmx-devices to this group: +# addgroup dmx +# adduser zmoelnig dmx + +in theory this should be enough to allow you access to your dmx devices +the next time you load a dmx-driver +if you have problems, try plugging your device out and in again + +if you don't care for a clean setup, you could also just grant everyone read/write permissions. +# chmod a+rw /dev/dmx* +be aware that this might be a security risk. + + + +C. more drivers +=============== +for using a "JMS USB2DMX" device, i had some driver problems. +finally i found +http://www.opendmx.net/index.php/Linux_ArtNet_Node +which directed me to +http://www.erwinrol.com/index.php?opensource/dmxusb.php +and the "dmx_usb" module which seems to work fine. +i guess, it will also work for the "enttec opendmx" device + + diff --git a/dmx512/README.txt b/dmx512/README.txt index 346934e..327c744 100644 --- a/dmx512/README.txt +++ b/dmx512/README.txt @@ -3,68 +3,13 @@ DMX512 controlling DMX from within Pd +this readme assumes that you have a running dmx4linux setup. +if not, read the README.dmx4linux.txt file for hints on how to +get it going... - -A. setting up dmx4linux -======================= -note: there are debian(etch)-packages for dmx4linux, - but these seem to be pretty old (2.5) - i haven't really tried these. - instead i used dmx4linux-2.6.1 - -first get dmx4linux from http://llg.cubic.org/dmx4linux/ -and extract it. - -the drivers should compile fine with 2.6.18 kernels, but -alas! i am using 2.6.25 and there are some quirks to make -these work. - -first of all i had problems compiling the ISA/PCI/parport drivers, -but since i only wanted to use a USB device, i just disabled those. -second, dmx4linux's build-system tries to override CFLAGS when building -the kernel-modules, which newer kernel versions (e.g. 2.6.25) do not like -at all. i had to modify the makefiles in order to use the EXTRA_CFLAGS - -all the changes i did can be found in the dmx4linux2.6.1.patch -just run: -% patch -p1 < dmx4linux2.6.1.patch - -then do -% ./configure -(which will produce a /tmp/dmxconfig.mk) -and run -% make - -finally become root and do -# make install - -after all has gone well, load the appropriate kernel modules - - -btw, it is always a good idea to read the readme that comes with dmx4linux... - - -B. permissions -============== -the dmx device-files created by udev will be owned by root.root and not be -read/writeable by anyone but root. -in order to use them as an ordinary user, become root and create a group -"dmx" and add users who need access to the dmx-devices to this group: -# addgroup dmx -# adduser zmoelnig dmx - -in theory this should be enough to allow you access to your dmx devices -the next time you load a dmx-driver -if you have problems, try plugging your device out and in again - -if you don't care for a clean setup, you could also just grant everyone read/write permissions. -this might be a security risk. - - -C. compiling the Pd-objects +A. compiling the Pd-objects =========================== -so now it is time to get the Pd-objects going. -for this change into the "./src" directory of the iem/dmx512/ folder +for this, change into the "./src" directory of the iem/dmx512/ folder (this might well be the folder that holds this README.txt you are currently reading) @@ -80,9 +25,24 @@ then run you should now have 2 binary files in the src/ folder called [dmxin] and [dmxout] -go on and use em! +B. Installation +=============== +you should install the binaries (+helpfiles) somewhere Pd can find them. +i would suggest to put them into + /extra/dmx512/ +and add this path to the startup-flags of Pd. + + +C. Usage +======== +there should be help-files in the ./help directory +if not, the useage should be very similar to that of [ctlin] and [ctlout] +(it's just using DMX512 instead of MIDI) +D. Help! +======== +read the FAQ -- 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') 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') 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') 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') 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') 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') 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