diff options
Diffstat (limited to 'dmx512')
-rw-r--r-- | dmx512/FAQ.txt | 2 | ||||
-rw-r--r-- | dmx512/GnuGPL.txt | 340 | ||||
-rw-r--r-- | dmx512/README.dmx4linux.txt | 79 | ||||
-rw-r--r-- | dmx512/README.txt | 48 | ||||
-rw-r--r-- | dmx512/dmx4linux2.6.1.patch | 196 | ||||
-rw-r--r-- | dmx512/help/dmxout-help.pd | 36 | ||||
-rw-r--r-- | dmx512/src/Make.config.in | 31 | ||||
-rw-r--r-- | dmx512/src/Make.version | 1 | ||||
-rw-r--r-- | dmx512/src/Makefile | 76 | ||||
-rw-r--r-- | dmx512/src/configure.ac | 177 | ||||
-rw-r--r-- | dmx512/src/dmx4pd.h | 41 | ||||
-rw-r--r-- | dmx512/src/dmxin.c | 139 | ||||
-rw-r--r-- | dmx512/src/dmxout.c | 299 | ||||
-rw-r--r-- | dmx512/src/dmxout_b.c | 240 |
14 files changed, 1705 insertions, 0 deletions
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/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. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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. + + <signature of Ty Coon>, 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.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 new file mode 100644 index 0000000..327c744 --- /dev/null +++ b/dmx512/README.txt @@ -0,0 +1,48 @@ +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. compiling the Pd-objects +=========================== +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] + + +B. Installation +=============== +you should install the binaries (+helpfiles) somewhere Pd can find them. +i would suggest to put them into + </path/to/pd>/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 + + 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/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; diff --git a/dmx512/src/Make.config.in b/dmx512/src/Make.config.in new file mode 100644 index 0000000..3386e58 --- /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 + + +DMX4PD_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..0bdb8b4 --- /dev/null +++ b/dmx512/src/Make.version @@ -0,0 +1 @@ +VERSION = $(shell svnversion | grep -e "[0-9]") diff --git a/dmx512/src/Makefile b/dmx512/src/Makefile new file mode 100644 index 0000000..36b92bc --- /dev/null +++ b/dmx512/src/Makefile @@ -0,0 +1,76 @@ +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))) +TARGETS = $(SOURCES:.c=.o) +OBJECTS = $(SOURCES:.c=.$(EXT)) + +all: $(OBJECTS) + +clean: + -rm -f *.o *.d + +binclean: clean + -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.* + -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 Make.config + $(CC) $(DMX4PD_CFLAGS) $(VERSIONDEFINE) -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) +%.d: %.c + @set -e; rm -f $@; \ + $(CC) $(MAKEDEP_FLAGS) $(DMX4PD_CFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +configure: configure.ac + autoconf +endif diff --git a/dmx512/src/configure.ac b/dmx512/src/configure.ac new file mode 100644 index 0000000..eff616a --- /dev/null +++ b/dmx512/src/configure.ac @@ -0,0 +1,177 @@ +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=<ver> enforce a certain pd-version (e.g. 0.37)]) +AC_ARG_WITH(extension, [ --with-extension=<ext> 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(dmx4l, DMXsleep) +AC_CHECK_LIB(dmx4linux, DMXsleep) +#if test "x$ac_cv_lib_dmx4linux_DMXsleep" = "xyes"; then +# DMX4LINUX_LFLAGS="-ldmx4linux" +#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..059c794 --- /dev/null +++ b/dmx512/src/dmx4pd.h @@ -0,0 +1,41 @@ + +/****************************************************** + * + * 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" +#include <dmx/dmx.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + + +#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/dmxin.c b/dmx512/src/dmxin.c new file mode 100644 index 0000000..c009570 --- /dev/null +++ b/dmx512/src/dmxin.c @@ -0,0 +1,139 @@ +/****************************************************** + * + * 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" + +#include <sys/select.h> +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> + +static t_class *dmxin_class; + +typedef struct _dmxin +{ + t_object x_obj; + int x_device; + int x_port; + + 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) +{ + 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] = {"--dmxin", 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) +{ + int i=0; + t_dmxin *x = (t_dmxin *)pd_new(dmxin_class); + + x->x_device=0; + x->x_port=0; + + for(i=0; i<sizeof(x->x_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) +{ + dmxin_close(x); +} + +void dmxin_setup(void) +{ + dmxin_class = class_new(gensym("dmxin"), (t_newmethod)dmxin_new, (t_method)dmxin_free, + sizeof(t_dmxin), + 0, + A_NULL); + + class_addbang(dmxin_class, dmxin_bang); + +#ifdef DMX4PD_POSTBANNER + DMX4PD_POSTBANNER; +#endif +} diff --git a/dmx512/src/dmxout.c b/dmx512/src/dmxout.c new file mode 100644 index 0000000..18358ce --- /dev/null +++ b/dmx512/src/dmxout.c @@ -0,0 +1,299 @@ +/****************************************************** + * + * 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 <unistd.h> +#include <string.h> +#include <stdio.h> + +#include <pthread.h> + + +static t_class *dmxout_class; +static t_class *dmxout_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 +{ + t_object x_obj; + + t_inlet *x_portinlet; + t_float x_port; + int x_portrange; + + +} t_dmxout; + + +static void *dmxout_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; + + return NULL; +} + +static void dmxout_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_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_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]); + devname=DMXdev(&argc, argv); + if(!devname){ + error("couldn't find DMX device"); + return; + } + verbose(1, "[dmxout] 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_thread, NULL); + } + } else { + error("failed to open DMX-device '%s'",devname); + } +} + +static void dmxout_doout(t_dmxout*x) { + if(g_device<=0) { + pd_error(x, "no DMX universe found"); + return; + } +} + + +static void dmxout_doout1(t_dmxout*x, short port, unsigned char value) +{ + g_values[port]=value; + dmxout_doout(x); +} + + +static void dmxout_float(t_dmxout*x, t_float f) +{ + unsigned char val=(unsigned char)f; + short port = (short)x->x_port; + if(f<0. || f>255.) { + pd_error(x, "value %f out of bounds [0..255]", f); + return; + } + if(x->x_port<0. || x->x_port>NUM_DMXVALUES) { + pd_error(x, "port %f out of bounds [0..%d]", x->x_port, NUM_DMXVALUES); + return; + } + + dmxout_doout1(x, port, val); +} + +static void dmxout_list(t_dmxout*x, t_symbol*s, int argc, t_atom*argv) +{ + int count=(argc<x->x_portrange)?argc:x->x_portrange; + int i=0; + int errors=0; + + int port=x->x_port; + if((port+count)>=NUM_DMXVALUES) { + if(count>NUM_DMXVALUES)count=NUM_DMXVALUES; + port=NUM_DMXVALUES-count; + } + + for(i=0; i<count; i++) { + t_float f=atom_getfloat(argv+i); + if(f<0. || f>255.) { + errors++; + if(f<0.)f=0.; + if(f>255)f=255; + } + 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); +} + +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; + } + return (x); +} + +static void *dmxout_free(t_dmxout*x) +{ + // dmxout_close(); +} + +static void dmxout_init(void) { + int i=0; + g_thread_id=0; + g_mutex=NULL; + for(i=0; i<NUM_DMXVALUES; i++) g_values[i]=0; + + g_device=-1; + g_thread_running=0; + g_thread_continue=0; + + dmxout_open(gensym("")); +} + + +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); + + 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); + + + dmxout_init(); +} diff --git a/dmx512/src/dmxout_b.c b/dmx512/src/dmxout_b.c new file mode 100644 index 0000000..9623397 --- /dev/null +++ b/dmx512/src/dmxout_b.c @@ -0,0 +1,240 @@ +/****************************************************** + * + * dmxout_b - implementation file + * + * this is the "blocking" version + * + * 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 <unistd.h> +#include <string.h> +#include <stdio.h> + +static t_class *dmxout_b_class; +static t_class *dmxout_b_class2; + +#define NUM_DMXVALUES 512 + +typedef struct _dmxout_b +{ + 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_b; + +static void dmxout_b_clearbuf(t_dmxout_b*x) +{ + int i=0; + for(i=0; i<NUM_DMXVALUES; i++) x->x_values[i]=0; +} + +static void dmxout_b_close(t_dmxout_b*x) +{ + if(x->x_device>=0) { + close(x->x_device); + } + x->x_device=-1; +} + + +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}; + const char**argv=args; + const char*devname=""; + int fd; + + dmxout_b_close(x); + + if(s_devname && s_devname->s_name) + devname=s_devname->s_name; + + 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_b] opening %s", devname); + + fd = open (devname, O_WRONLY | O_NONBLOCK); + + if(fd!=-1) { + x->x_device=fd; + dmxout_b_clearbuf(x); + } else { + pd_error(x, "failed to open DMX-device '%s'",devname); + } +} + +static void dmxout_b_doout(t_dmxout_b*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_b_doout1(t_dmxout_b*x, short port, unsigned char value) +{ + x->x_values[port]=value; + dmxout_b_doout(x); +} + + +static void dmxout_b_float(t_dmxout_b*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_b_doout1(x, port, val); +} + +static void dmxout_b_list(t_dmxout_b*x, t_symbol*s, int argc, t_atom*argv) +{ + int count=(argc<x->x_portrange)?argc:x->x_portrange; + int i=0; + int errors=0; + + int port=x->x_port; + if((port+count)>=NUM_DMXVALUES) { + if(count>NUM_DMXVALUES)count=NUM_DMXVALUES; + port=NUM_DMXVALUES-count; + } + + for(i=0; i<count; i++) { + t_float f=atom_getfloat(argv+i); + if(f<0. || f>255.) { + errors++; + if(f<0.)f=0.; + if(f>255)f=255; + } + x->x_values[port+i]=(unsigned char)f; + } + if(errors) { + pd_error(x, "%d valu%s out of bound [0..255]", errors, (1==errors)?"e":"es"); + } + + dmxout_b_doout(x); +} + +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; + + + 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_b_new(t_symbol*s, int argc, t_atom*argv) +{ + t_floatarg baseport=0.f, portrange=0.f; + t_dmxout_b *x = 0; + + switch(argc) { + case 2: + 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_b_port(x, baseport, portrange); + break; + case 1: + baseport=atom_getfloat(argv); + case 0: + 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; + break; + default: + return 0; + } + x->x_device=-1; + + dmxout_b_open(x, gensym("")); + return (x); +} + +static void *dmxout_b_free(t_dmxout_b*x) +{ + dmxout_b_close(x); +} + + +void dmxout_b_setup(void) +{ +#ifdef DMX4PD_POSTBANNER + DMX4PD_POSTBANNER; +#endif + + 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_b_class, dmxout_b_float); + class_addmethod(dmxout_b_class, (t_method)dmxout_b_open, gensym("open"), A_SYMBOL, A_NULL); + + 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_b_class2, dmxout_b_list); + + + class_addmethod(dmxout_b_class2, (t_method)dmxout_b_port, gensym("port"), + A_FLOAT, A_DEFFLOAT, A_NULL); + + class_addmethod(dmxout_b_class2, (t_method)dmxout_b_open, gensym("open"), A_SYMBOL, A_NULL); +} |