Revision: 9619 http://pure-data.svn.sourceforge.net/pure-data/?rev=9619&view=rev Author: eighthave Date: 2008-03-21 19:13:11 -0700 (Fri, 21 Mar 2008)
Log Message: ----------- importing pdj-0.8.3.tar.gz from http://www.le-son666.com/software/pdj/
Added Paths: ----------- vendor/pdj/ vendor/pdj/current/ vendor/pdj/current/.cdtproject vendor/pdj/current/.project vendor/pdj/current/.settings/ vendor/pdj/current/.settings/org.eclipse.cdt.core.prefs vendor/pdj/current/LICENSE vendor/pdj/current/Linux-build.properties vendor/pdj/current/Mac OS X-build.properties vendor/pdj/current/Makefile vendor/pdj/current/README vendor/pdj/current/Windows XP-build.properties vendor/pdj/current/build.properties vendor/pdj/current/build.xml vendor/pdj/current/lib/ vendor/pdj/current/lib/ant/ vendor/pdj/current/lib/ant/cpptasks.jar vendor/pdj/current/res/ vendor/pdj/current/res/help-pdj.pd vendor/pdj/current/res/pdj-test.pd vendor/pdj/current/res/pdj.properties vendor/pdj/current/res/pdj~-panner.pd vendor/pdj/current/res/pdj~-test.pd vendor/pdj/current/src/ vendor/pdj/current/src/MSPBuffer.c vendor/pdj/current/src/MaxClock.c vendor/pdj/current/src/MaxObject.c vendor/pdj/current/src/MaxSystem.c vendor/pdj/current/src/init.c vendor/pdj/current/src/java/ vendor/pdj/current/src/java/com/ vendor/pdj/current/src/java/com/cycling74/ vendor/pdj/current/src/java/com/cycling74/io/ vendor/pdj/current/src/java/com/cycling74/io/ErrorStream.java vendor/pdj/current/src/java/com/cycling74/io/PostStream.java vendor/pdj/current/src/java/com/cycling74/max/ vendor/pdj/current/src/java/com/cycling74/max/Atom.java vendor/pdj/current/src/java/com/cycling74/max/AtomFloat.java vendor/pdj/current/src/java/com/cycling74/max/AtomString.java vendor/pdj/current/src/java/com/cycling74/max/Attribute.java vendor/pdj/current/src/java/com/cycling74/max/Callback.java vendor/pdj/current/src/java/com/cycling74/max/DataTypes.java vendor/pdj/current/src/java/com/cycling74/max/Executable.java vendor/pdj/current/src/java/com/cycling74/max/MaxClock.java vendor/pdj/current/src/java/com/cycling74/max/MaxContext.java vendor/pdj/current/src/java/com/cycling74/max/MaxObject.java vendor/pdj/current/src/java/com/cycling74/max/MaxPatcher.java vendor/pdj/current/src/java/com/cycling74/max/MaxQelem.java vendor/pdj/current/src/java/com/cycling74/max/MaxRuntimeException.java vendor/pdj/current/src/java/com/cycling74/max/MaxSystem.java vendor/pdj/current/src/java/com/cycling74/max/MessageReceiver.java vendor/pdj/current/src/java/com/cycling74/max/package.html vendor/pdj/current/src/java/com/cycling74/msp/ vendor/pdj/current/src/java/com/cycling74/msp/AudioFileBuffer.java vendor/pdj/current/src/java/com/cycling74/msp/MSPBuffer.java vendor/pdj/current/src/java/com/cycling74/msp/MSPObject.java vendor/pdj/current/src/java/com/cycling74/msp/MSPPerformable.java vendor/pdj/current/src/java/com/cycling74/msp/MSPPerformer.java vendor/pdj/current/src/java/com/cycling74/msp/MSPSignal.java vendor/pdj/current/src/java/com/cycling74/msp/package.html vendor/pdj/current/src/java/com/e1/ vendor/pdj/current/src/java/com/e1/pdj/ vendor/pdj/current/src/java/com/e1/pdj/ConsoleStream.java vendor/pdj/current/src/java/com/e1/pdj/ConsoleStreamWin32.java vendor/pdj/current/src/java/com/e1/pdj/GenericCompiler.java vendor/pdj/current/src/java/com/e1/pdj/JavacCompiler.java vendor/pdj/current/src/java/com/e1/pdj/JikesCompiler.java vendor/pdj/current/src/java/com/e1/pdj/PDJClassLoader.java vendor/pdj/current/src/java/com/e1/pdj/PDJClassLoaderException.java vendor/pdj/current/src/java/com/e1/pdj/PDJError.java vendor/pdj/current/src/java/com/e1/pdj/PDJSystem.java vendor/pdj/current/src/java/com/e1/pdj/PriorityQueue.java vendor/pdj/current/src/java/com/e1/pdj/test/ vendor/pdj/current/src/java/com/e1/pdj/test/AtomTest.java vendor/pdj/current/src/java/com/e1/pdj/test/CallbackTest.java vendor/pdj/current/src/java/com/e1/pdj/test/MaxQelemTest.java vendor/pdj/current/src/java/help_class.java vendor/pdj/current/src/java/panner.java vendor/pdj/current/src/java/pdj_test_class.java vendor/pdj/current/src/java/pdj_test_tilde.java vendor/pdj/current/src/java/pdj_tilde.java vendor/pdj/current/src/pdj-linux.c vendor/pdj/current/src/pdj-osx.c vendor/pdj/current/src/pdj-win32.c vendor/pdj/current/src/pdj.c vendor/pdj/current/src/pdj.h vendor/pdj/current/src/pdj~.c vendor/pdj/current/src/type_handler.c vendor/pdj/current/src/type_handler.h vendor/pdj/current/www/ vendor/pdj/current/www/index.html vendor/pdj/current/www/pdj-help.png vendor/pdj/current/www/pdj-logo.png vendor/pdj/current/www/stylesheet.css
Added: vendor/pdj/current/.cdtproject =================================================================== --- vendor/pdj/current/.cdtproject (rev 0) +++ vendor/pdj/current/.cdtproject 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse-cdt version="2.0"?> + +<cdtproject id="org.eclipse.cdt.make.core.make"> +<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"> +<attribute key="c++filt" value="c++filt"/> +</extension> +<extension id="org.eclipse.cdt.core.domsourceindexer" point="org.eclipse.cdt.core.CIndexer"/> +<data> +<item id="org.eclipse.cdt.core.pathentry"> +<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/> +<pathentry kind="src" path=""/> +<pathentry kind="out" path=""/> +</item> +<item id="cdt_indexer"> +<indexEnabled indexValue="true"/> +<indexerProblemsEnabled indexProblemsValue="0"/> +</item> +<item id="org.eclipse.cdt.make.core.buildtargets"> +<buildTargets> +<target name="all" path="java" targetID="org.eclipse.cdt.make.MakeTargetBuilder"> +<buildCommand>make</buildCommand> +<buildTarget>all</buildTarget> +<stopOnError>false</stopOnError> +<useDefaultCommand>true</useDefaultCommand> +</target> +<target name="all" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder"> +<buildCommand>make</buildCommand> +<buildTarget>all</buildTarget> +<stopOnError>false</stopOnError> +<useDefaultCommand>true</useDefaultCommand> +</target> +<target name="test" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder"> +<buildCommand>make</buildCommand> +<buildTarget>test</buildTarget> +<stopOnError>false</stopOnError> +<useDefaultCommand>true</useDefaultCommand> +</target> +<target name="clean" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder"> +<buildCommand>make</buildCommand> +<buildTarget>clean</buildTarget> +<stopOnError>false</stopOnError> +<useDefaultCommand>true</useDefaultCommand> +</target> +</buildTargets> +</item> +<item id="cdt_resolver"> +<custom value="false"/> +</item> +<item id="scannerConfiguration"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="false" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="false"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="false" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="false"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="false" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="false"/> +</scannerInfoProvider> +</profile> +</item> +</data> +</cdtproject>
Added: vendor/pdj/current/.project =================================================================== --- vendor/pdj/current/.project (rev 0) +++ vendor/pdj/current/.project 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>pdj</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.make.core.makeBuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + <dictionary> + <key>org.eclipse.cdt.core.errorOutputParser</key> + <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.fullBuildTarget</key> + <value>clean all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.incrementalBuildTarget</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableAutoBuild</key> + <value>false</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildLocation</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.environment</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableFullBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.inc</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.clean</key> + <value>clean</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableCleanBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.cleanBuildTarget</key> + <value>clean</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.append_environment</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.buildCommand</key> + <value>make</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.autoBuildTarget</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.stopOnError</key> + <value>false</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.auto</key> + <value>all</value> + </dictionary> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name> + <arguments> + <dictionary> + <key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.makeBuilderParserId</key> + <value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.esiProviderParserId</key> + <value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value> + </dictionary> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.make.core.makeNature</nature> + <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature> + </natures> +</projectDescription>
Added: vendor/pdj/current/.settings/org.eclipse.cdt.core.prefs =================================================================== --- vendor/pdj/current/.settings/org.eclipse.cdt.core.prefs (rev 0) +++ vendor/pdj/current/.settings/org.eclipse.cdt.core.prefs 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,3 @@ +#Mon Jul 03 15:02:11 EDT 2006 +eclipse.preferences.version=1 +indexerId=org.eclipse.cdt.core.fastIndexer
Added: vendor/pdj/current/LICENSE =================================================================== --- vendor/pdj/current/LICENSE (rev 0) +++ vendor/pdj/current/LICENSE 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,22 @@ +Copyright (c) 2004-2007, Pascal Gauthier +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE.
Added: vendor/pdj/current/Linux-build.properties =================================================================== --- vendor/pdj/current/Linux-build.properties (rev 0) +++ vendor/pdj/current/Linux-build.properties 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,15 @@ +# property file for Linux + +# put the path of where the jdk (java sdk) is installed +jdk.home=/usr/local/java + +# put the path of where pd is installed +pd.home=/home/asb2m10/pd-0.39-0 + +# common linux properties +isLinux=true +compiler=gcc +linker.type=shared +platform=linux +jdk.libs=${jdk.home}/jre/lib/i386 +pdj.outfile=${dist.dir}/pdj \ No newline at end of file
Added: vendor/pdj/current/Mac OS X-build.properties =================================================================== --- vendor/pdj/current/Mac OS X-build.properties (rev 0) +++ vendor/pdj/current/Mac OS X-build.properties 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,16 @@ +# properties file for OSX. + +# put the root of your pd path installation +pd.home=/Applications/pd.app/Contents/Resources + +# set this to 'pd_darwin' if you are building for PowerPC +pdj.archBuild=d_fat + +# common OS X properties +isOSX=true +compiler=gcc +linker.type=plugin +platform=osx +jdk.libs=/System/Library/Frameworks/JavaVM.framework/Libraries +jdk.home=/Library/Java/Home +pdj.outfile=${dist.dir}/pdj.${pdj.archBuild}
Added: vendor/pdj/current/Makefile =================================================================== --- vendor/pdj/current/Makefile (rev 0) +++ vendor/pdj/current/Makefile 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,11 @@ +# check out the build.properties / {your platform}.properties / build.xml +# for path settings + +all: + ant package + +clean: + ant clean + +test: + ant test
Added: vendor/pdj/current/README =================================================================== --- vendor/pdj/current/README (rev 0) +++ vendor/pdj/current/README 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,174 @@ +########################################################################### +pdj - java plugin interface to pure-data +########################################################################### + +RELEASE 0.8.3 / September 2007 + + +PDJ enables you to write java code to interact with pure-data objects. The +API is totally based on Cycling74 Max/MSP 'mxj' object implementation. This +will enable java mxj objects to run on pure-data with pdj. You can also +create signal/tilde (~) objects. + +This is a work in progress and some of features are missing and some might +not even be ported. + +IMPLEMENTED: + + * MaxClock 100% + * MSPBuffer 100% + * Callback 100% + * MaxObject 100% + * Atom 98% + * MaxSystem 90% + * MaxQelem 90% + * MSPObject 85% (missing signal in/outlet detection) + * MSPPerformable 100% + * MaxPatcher 5% + +TODO: + + * MSPObject connection status + * MaxBox/MaxPatcher object; inspiration from dyn~ (kudo Mr. Grill!) + +LIMITATION: + + * Signal inlets cannot be hot inlets for receiving atom message. + This means that if you create a signal inlet and send an atom + to this inlet, pdj won't be able to process it; float or symbol. + This looks like a work as designed in pd. + +BUGS: + + * OS X: cannot use AWT classes with OS X because of a weird bug + that locks the thread when the GUI libraries are loaded. + -> http://lists.apple.com/archives/java-dev/2004/Mar/msg00910.html + this solution has been tested but the loadLibrary still hang. + +WORKAROUNDS: + + * on most cases you don't have to put the JVM libs dir to the + LD_LIBRARY_PATH. If you have a UnsatisfiedLinkError, add it + before you start PD. + * on some machines, the System.out redirection can crash PD. If + it is the case, you can disable it in the pdj.properties file; + check the property: pdj.redirect-pdio. + +REQUIEREMENTS: + + * pure-data 0.38.x or better + * java JDK version 1.4.x or better; use 1.5 if you can ! + * works on linux, windows + +REQUIEREMENTS FOR BUILDING: + + * apache ant 1.6.x or better + * c compiler + +INSTALLATION: + + * if you are using the source distribution, build it before + -> download java sdk from java.sun.com (unless you are using OS X) + -> download apache ant for ant.apache.org + -> edit file <your platform>-build.properties + -> in the root directory of pdj, run 'ant package' + * add the pdj external (pdj.pd_linux/pd.dll/pd.pd_dawrin) directory + to your pd path (very important on OS X) + * the other files of the original binary directory must be in + the same directory + * double check dist/pdj.properties to be sure that the JAVA + environment parameters are right + * === OS X WARNING ==== + I am working on a universal binary of pdj. This is planned on version + 0.8.4. If you really need a OS X build, email me. + +USAGE: + + * put your .java file in the /classes directory + * create a pdj object with the name of the java class; if + you have not compiled it before, pdj will do it for you + +CHANGELOG: + --- VERSION 0.8.3 --- + * Atom.getInt() on a float now works. + * corrected some classpath definition issues with windows + * bypass the java compilation with pdj.compiler=null + * remove dependencies task for cpptasks.jar (now part of distribution) + * FIXED: comment on property pdj.vm_args failed to initialize VM + * BUG: cannot link with OS X and cpptasks. Planned on 0.8.4 + + --- VERSION 0.8.2 --- + * if javac is set, using the javac compiler from the JAVA_HOME first + * optimizations (main thread JVM and symbol method resolution) + * FIXED: using pdj.classpath with directories + * FIXED: search path on file in the current directory + * FIXED: leak with open_path and casting warnings + * build for Intel Mac + * getting better at attribute support + + --- VERSION 0.8.1 --- + * added MaxPatcher object to get patch path + * FIXED: to match mxj: method with args[] will always be called first + + --- VERSION 0.8 --- + * pdj~ object support (MSPSignal/MSPObject/MSPPerformable) + * The JVM can now be server or in client mode (windows/linux only) + * JVM selection for OS X + * FIXED: working jikes compiler on OS X + * FIXED: declareIO inlets count + * FIXED: windows: System.out CR/LF errors on the PD console + + --- VERSION 0.7.1 --- + * OS X support with distribution + * FIXED: MaxSystem.locateFile now works + + --- VERSION 0.7 --- + * Better JVM resolution on win32 (eg: with the registry) + * Full implementation of MSPBuffer + * Added Atom methods with unit tests + * Windows binaries distribution + * FIXED: now filtering { and } with post() not to lock PD + * FIXED: anything gets called on a undefined bang/float/list method + * FIXED: defined inlet(int) without inlet(float) now works... :-\ + + --- VERSION 0.6.1 --- + * FIXED: outlet(Atom) and outlet(Atom[]) resolution error + + --- VERSION 0.6 --- + * MaxObject constructor with arguments + * partial attribute support; automatic field setter/getter + * added method bail on MaxObject + * strict declaration of inlets/outlets (with info outlet) + * System.out and System.err linked to the pd console + * outlet(atom[]) checks type before calling the right func. + + --- VERSION 0.5 --- + * method inlet resolution (bang->float->list->anything) now works + * windows support (premilinary support) + * auto-compiling class of every .java in /class (max -1; pdj +1) + + --- VERSION 0.4 --- + * more javadoc and documentation... but could be better + * multiple inlet operations + * loadbang now works + + --- VERSION 0.3 --- + * added a small and cheap javadoc. the original MXJ should be the + reference. + * partial MSPBuffer support + * Atom and MaxObject now supports Atom arrays + + --- VERSION 0.2 --- + * added classpath of $PDJ_HOME/classes and $PDJ_HOME/lib/* by default + * 95 % Dynamic JVM resolution with the JAVA_HOME; via dlsym (see BUGS) + * MaxSystem.deferLow(...) works ! :-\ + * added an help patch + +THANKS: + + * Thomas Grill + * patrick a 11h11 + * pd-mtl crew ! + +(c) Pascal Gauthier 2004-2007, under BSD like license +asb2m10@users.sourceforge.net
Added: vendor/pdj/current/Windows XP-build.properties =================================================================== --- vendor/pdj/current/Windows XP-build.properties (rev 0) +++ vendor/pdj/current/Windows XP-build.properties 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,14 @@ +# properties file for windows + +# put the path of where the jdk (java sdk) is installed +jdk.home=C:/Java/jdk1.6.0_02 + +# put the path of where pd is installed +pd.home=C:/Projets/pd +# common windows properties +isWin32=true +compiler=msvc +linker.type=shared +platform=win32 +jdk.libs=${jdk.home}/jre/lib/i386 +pdj.outfile=${dist.dir}/pdj \ No newline at end of file
Added: vendor/pdj/current/build.properties =================================================================== --- vendor/pdj/current/build.properties (rev 0) +++ vendor/pdj/current/build.properties 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,21 @@ +# + +# PDJ packaging version +# ========================================================================= +pdj.version=0.8.3 + +# Various path definition +# ========================================================================= +src.dir=src +java.src.dir=src/java +work.dir=work +www.dir=www +javadoc.dir=${www.dir}/api +classes.dir=${work.dir}/classes +dist.dir=dist +javah.file=${work.dir}/native_classes.h +pdj.jar=${dist.dir}/pdj.jar +pdj.test-patch=pdj-test.pd +pdj-tilde.test-patch="pdj~-test.pd" + +
Added: vendor/pdj/current/build.xml =================================================================== --- vendor/pdj/current/build.xml (rev 0) +++ vendor/pdj/current/build.xml 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,250 @@ +<project name="pdj" default="package" basedir="."> + + <property file="build.properties"/> + <property file="${os.name}-build.properties"/> + + <!-- ============================================================== --> + + <property name="jdk.include" value="${jdk.home}/include"/> + <property name="pd.include" value="${pd.home}/src"/> + + <!-- java classes that uses a native interface --> + <property name="native.classes" value=" + com.cycling74.max.MaxObject, + com.cycling74.max.MaxClock, + com.cycling74.max.MaxSystem, + com.cycling74.msp.MSPBuffer, + com.cycling74.msp.MSPObject"/> + + <target name="clean" depends="-init"> + <delete dir="${dist.dir}"/> + <delete dir="${work.dir}"/> + <delete dir="${javadoc.dir}"/> + <delete> + <fileset dir="." + includes="**/history.xml,**/dependencies.xml,index.html"/> + </delete> + </target> + + <target name="-init"> + <mkdir dir="${classes.dir}"/> + <mkdir dir="${dist.dir}"/> + <taskdef resource="cpptasks.tasks" classpath="lib/ant/cpptasks.jar"/> + <typedef resource="cpptasks.types" classpath="lib/ant/cpptasks.jar"/> + <available classname="junit.framework.Test" property="isJunitFound"/> + </target> + + <target name="cl-java" depends="-init"> + <javac destdir="${classes.dir}" srcdir="${java.src.dir}" debug="true" + target="1.4" source="1.4"> + <exclude name="**/test/**" unless="isJunitFound"/> + <exclude name="**/*Test.java" unless="isJunitFound"/> + </javac> + <jar jarfile="${pdj.jar}" basedir="${classes.dir}"> + <exclude name="*.class"/> + <exclude name="**/test/**" unless="isJunitFound"/> + <exclude name="**/*Test.class" unless="isJunitFound"/> + </jar> + + <uptodate property="javah.up2date" + srcfile="${pdj.jar}" targetfile="${javah.file}"/> + </target> + + <target name="javah" depends="cl-java" unless="javah.up2date"> + <javah class="${native.classes}" classpath="${pdj.jar}" + outputFile="${javah.file}" force="true"/> + </target> + + <target name="-linux-rename" if="isLinux"> + <move file="${dist.dir}/libpdj.so" tofile="${dist.dir}/pdj.pd_linux"/> + </target> + + <target name="-osx-rename" if="isOSX"> + <move file="${dist.dir}/libpdj.${pdj.archBuild}.bundle" tofile="${pdj.outfile}"/> + </target> + + <target name="cl" depends="javah"> + <cc debug="true" objdir="${work.dir}" outtype="${linker.type}" + outfile="${pdj.outfile}" name="${compiler}"> + + <fileset dir="${src.dir}" includes="*.c"> + <exclude name="pdj-linux.c" unless="isLinux"/> + <exclude name="pdj-win32.c" unless="isWin32"/> + <exclude name="pdj-osx.c" unless="isOSX"/> + </fileset> + + <!-- compiler args --> + <defineset define="DEBUG"/> + <defineset define="PROFILER"/> + <defineset define="PD"/> + <defineset define="NT" if="isWin32"/> + + <compilerarg value="-Wall" if="isLinux"/> + <compilerarg value="-fno-common" if="isOSX"/> + <compilerarg value="-fPIC" if="isOSX"/> + <compilerarg value="-arch" if="isOSX"/> + <compilerarg value="i386" if="isOSX"/> + <compilerarg value="-arch" if="isOSX"/> + <compilerarg value="ppc" if="isOSX"/> + + <!-- includes files --> + <includepath location="${jdk.include}"/> + <includepath location="${jdk.include}/linux" if="isLinux"/> + <includepath location="${jdk.include}/win32" if="isWin32"/> + <includepath location="${pd.include}"/> + <includepath location="${work.dir}"/> + + <!-- linker specific --> + <libset dir="${pd.home}/bin" libs="pd" if="isWin32"/> + <libset if="isWin32" libs="Advapi32"/> + <linkerarg value="/export:pdj_setup" if="isWin32"/> + + <linkerarg value="-export-dynamic" if="isLinux"/> + <linkerarg value="-Xlinker" if="isLinux"/> + + <!-- OS X :-\ --> + <linkerarg value="-arch" if="isOSX"/> + <linkerarg value="-arch" if="isOSX"/> + <linkerarg value="i386" if="isOSX"/> + <linkerarg value="-arch" if="isOSX"/> + <linkerarg value="ppc" if="isOSX"/> + + <linkerarg value="-framework" if="isOSX"/> + <linkerarg value="JavaVM" if="isOSX"/> + <linkerarg value="-framework" if="isOSX"/> + <linkerarg value="CoreFoundation" if="isOSX"/> + <linkerarg value="-flat_namespace" if="isOSX"/> + <linkerarg value="-framework" if="isOSX"/> + <linkerarg value="AppKit" if="isOSX"/> + <linkerarg value="-undefined" if="isOSX"/> + <linkerarg value="suppress" if="isOSX"/> + + <linkerarg value="-bundle" if="isOSX"/> + <linkerarg value="-Xlinker" if="isOSX"/> + + </cc> + + <antcall target="-linux-rename"/> + <antcall target="-osx-rename"/> + </target> + + <target name="package" depends="cl"> + <copy todir="${dist.dir}"> + <fileset dir="res"/> + </copy> + + <copy todir="${dist.dir}/classes"> + <!-- include the default package (examples) source --> + <fileset dir="src/java" includes="*.java"/> + <fileset dir="${classes.dir}" includes="*.class"/> + </copy> + + </target> + + <target name="test" depends="package"> + <exec dir="${dist.dir}" executable="${pd.home}/bin/pd"> + <arg line="-lib pdj ${pdj.test-patch}"/> + </exec> + </target> + + <target name="test-dsp" depends="package"> + <exec dir="${dist.dir}" executable="${pd.home}/bin/pd"> + <arg line="-lib pdj ${pdj-tilde.test-patch}"/> + </exec> + </target> + + <target name="test-mxdublin" depends="package"> + <ant antfile="../mxdublin/build.xml" target="package" dir="../mxdublin"/> + + <exec dir="${dist.dir}" executable="${pd.home}/bin/pd"> + <env key="AWT_TOOLKIT" value="MToolkit"/> + <arg line="-lib pdj ../../mxdublin/res/test/test-mxdublin.pd"/> + </exec> + </target> + + <target name="test-mxdublin-help" depends="package"> + <ant antfile="../mxdublin/build.xml" target="package" + dir="../mxdublin"/> + <exec dir="${dist.dir}" executable="${pd.home}/bin/pd"> + <arg line="-lib pdj ../../mxdublin/res/examples/help-mxdublin.pd"/> + </exec> + </target> + + <target name="test-helpatch" depends="package"> + <exec dir="${dist.dir}" executable="${pd.home}/bin/pd" > + <arg line="-lib pdj ../res/help-pdj.pd"/> + </exec> + </target> + + <target name="dist" depends="clean"> + <tar destfile="../pdj-${pdj.version}.tar.gz" compression="gzip"> + <tarfileset dir="." prefix="pdj-${pdj.version}"> + <exclude name="CVS"/> + </tarfileset> + </tar> + </target> + + <target name="javadoc" depends="cl-java"> + <mkdir dir="${javadoc.dir}"/> + <javadoc source="src" destdir="${javadoc.dir}" + windowtitle="pdj-MXJ API"> + <fileset dir="src/java"> + <include name="com/cycling74/max/*.java"/> + <include name="com/cycling74/msp/*.java"/> + <exclude name="*.java"/> + <exclude name="**/test/**"/> + <exclude name="**/*Test.java"/> + </fileset> + <link href="http://java.sun.com/j2se/1.4.2/docs/api/"/> + <doctitle><![CDATA[<h1>The MXJ Java API for pure-data</h1> + <p>This API is based on MXJ for Max/MSP.</p>]]></doctitle> + <bottom><![CDATA[This API is based on mxj for <a + href="http://www.cycling74.com/products/maxmsp.html"> + Max/MSP</a> by Cycling74. Please see original MXJ + implementation.]]></bottom> + </javadoc> + </target> + + <target name="dist-www" depends="javadoc"> + <tar destfile="../pdj-web.tar.gz" compression="gzip"> + <tarfileset dir="www"> + <exclude name="CVS"/> + <exclude name=".*"/> + </tarfileset> + </tar> + </target> + + <target name="dist-win32" depends="package,javadoc"> + <zip destfile="${dist.dir}/pdj-${pdj.version}-win32.zip"> + <zipfileset dir="www/api" includes="**" prefix="javadoc"/> + <fileset dir="${dist.dir}"> + <include name="classes/**"/> + <include name="*.jar"/> + <include name="*.pd"/> + <include name="*.properties"/> + <include name="*.dll"/> + </fileset> + <fileset dir="."> + <include name="README"/> + <include name="LICENSE"/> + </fileset> + </zip> + </target> + + <target name="dist-osx" depends="package,javadoc"> + <zip destfile="../pdj-${pdj.version}-${pdj.archBuild}.zip"> + <zipfileset dir="www/api" includes="**" prefix="javadoc"/> + <fileset dir="${dist.dir}"> + <include name="classes/**"/> + <include name="*.jar"/> + <include name="*.pd"/> + <include name="*.properties"/> + <include name="*.${pdj.archBuild}"/> + </fileset> + <fileset dir="."> + <include name="README"/> + <include name="LICENSE"/> + </fileset> + </zip> + </target> +</project>
Added: vendor/pdj/current/lib/ant/cpptasks.jar =================================================================== (Binary files differ)
Property changes on: vendor/pdj/current/lib/ant/cpptasks.jar ___________________________________________________________________ Name: svn:mime-type + application/octet-stream
Added: vendor/pdj/current/res/help-pdj.pd =================================================================== --- vendor/pdj/current/res/help-pdj.pd (rev 0) +++ vendor/pdj/current/res/help-pdj.pd 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,63 @@ +#N canvas 338 130 812 533 12; +#X text 17 7 pdj - JAVA PLUGIN EXTERNAL; +#X obj 18 327 pdj help_class; +#X text 16 49 The pdj object enables you to write Java external with +Max/MSP API mxj.; +#X obj 18 410 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10 +-262144 -1 -1 0 256; +#X floatatom 18 97 5 0 0 0 - - -; +#X text 81 95 <-- the method inlet(float) will be called; +#X text 230 204 <-- the method callme(Atom []) will be called; +#X msg 50 241 dynamic_method; +#X text 203 238 <-- the method dynamic_method() will be called; +#X msg 61 276 idontexists 10; +#X text 222 275 <-- since idontexists is not in help_class , an error +will be thrown; +#X msg 37 204 callme hola ouain; +#X text 73 162 symbols sended to the java class will be resolved by +the method name defined in the user class.; +#X obj 32 126 bng 30 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +-1; +#X text 80 132 <-- the method bang() will be called; +#X text 16 25 ====================================================== +; +#X obj 139 373 print help_class outlet1; +#N canvas 297 319 715 331 attributes 0; +#X obj 19 229 pdj help_class @attr1 10; +#X msg 39 127 get attr1; +#X msg 19 92 attr1 $1; +#X floatatom 19 66 5 0 0 0 - - -; +#X obj 254 260 print info-outlet; +#X text 144 126 <-- using get with attribute name will output the value +using the info outlet (the last outlet); +#X text 18 8 Attributes are used to access fields in a class. To do +this , you can use the method declareAttribute in the constructor. +; +#X text 109 69 <-- calling the attribute with his name will set the +attribute(field) value; +#X text 48 172 you can also declare a attribute within a class by using +@ in the constructor arguments. You must also provide a initial value +to this field.; +#X text 17 288 attribute value will always be sended to the last outlet +of the object that is called the info-outlet.; +#X connect 0 2 4 0; +#X connect 1 0 0 0; +#X connect 2 0 0 0; +#X connect 3 0 2 0; +#X restore 656 40 pd attributes; +#X text 652 7 *** see also :; +#X text 169 321 first argument is the classname to find in classpath. +additionnal arguments are given to the class constructor.; +#X text 682 504 VERSION 0.8; +#X text 99 406 see help_class.java in classes folder to see how this +example is handled.; +#X text 13 454 CLASSPATH INFORMATION : by default , (whereis pdj)/lib/*.jar +and /classes is added to the classpath. edit pdj.properties to add +more .jar or directories to the pdj or system classpath; +#X connect 1 0 3 0; +#X connect 1 1 16 0; +#X connect 4 0 1 0; +#X connect 7 0 1 0; +#X connect 9 0 1 0; +#X connect 11 0 1 0; +#X connect 13 0 1 0;
Added: vendor/pdj/current/res/pdj-test.pd =================================================================== --- vendor/pdj/current/res/pdj-test.pd (rev 0) +++ vendor/pdj/current/res/pdj-test.pd 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,42 @@ +#N canvas 765 257 450 295 10; +#X obj 23 187 pdj pdj_test_class; +#X obj 39 157 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +-1; +#X obj 254 47 r allo; +#X floatatom 263 98 5 0 0 0 - - -; +#X obj 326 93 print xc; +#X msg 82 160 wer wer 1; +#X obj 135 34 metro 300; +#X obj 170 3; +#X obj 127 9 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +-1; +#X floatatom 218 11 5 0 0 0 - - -; +#X obj 30 246 print outlet_1; +#N canvas 0 0 450 300 graph1 0; +#X array array_tester 100 float 1; +#A 0 0 0.585717 0.528574 0.471431 0.442859 0.485716 0.585717 0.528574 +0.257144 0.385716 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; +#X coords 0 1 99 -1 200 140 1; +#X restore 220 143 graph; +#X msg 25 117 testle; +#X msg 21 11 sizeArray 10; +#X msg 29 50 sizeArray 100; +#X msg 169 68 get patate; +#X msg 161 116 set patate 1; +#X obj 105 222 print setter; +#X connect 0 0 10 0; +#X connect 0 1 17 0; +#X connect 1 0 0 0; +#X connect 2 0 3 0; +#X connect 2 0 4 0; +#X connect 5 0 0 0; +#X connect 6 0 5 0; +#X connect 8 0 6 0; +#X connect 9 0 6 1; +#X connect 12 0 0 0; +#X connect 13 0 0 0; +#X connect 14 0 0 0; +#X connect 15 0 0 0; +#X connect 16 0 0 0;
Added: vendor/pdj/current/res/pdj.properties =================================================================== --- vendor/pdj/current/res/pdj.properties (rev 0) +++ vendor/pdj/current/res/pdj.properties 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,81 @@ +# pdj.properties +# +# this property file is not 100% java properties aware (like: \) so +# pay special attention +# +# all parameters from this properties file will be copied to the java +# system properties +# ========================================================================= + +# by default the pdj.jar (where the pdj.pd_linux is located) will be added +# to the system classpath +# +# add your jars or directories of jars seperated with a ':' for unix and +# ';' for windows +# +pdj.system-classpath=/home/asb2m10/workspace/mxdublin/work/mxdublin.jar + +# by default from where the pdj.pd_linux is located, every .jar in +# ${pdj.home}/lib will be added to the pdj classpath +# +# add you jars or directories of jars seperated with a ':' for unix and +# ';' for windows +# +# this is the pdj classpath (dynamic) to set : +pdj.classpath= + +# this will print all .jars that are loaded before compiling/loading the +# user class +pdj.verbose-classloader=true + +# the type of compiler to use with the pdj classloader. use only 'javac' +# or 'jikes'. do not put full path to your compiler +# +# to disable the automatic compilation simply use +# pdj.compiler=null +# +pdj.compiler=javac + +# pdj compiler/classloader directory. by default, ${pdj.home}/classes +# directory is used if this property is not defined. Before compiling, pdj +# will check if your .java needs to be compiled. +# +# pdj.classes-dir=[your working directory] + +# this will redirect the java out/err streams to the pd console. If you need +# to log pdj errors and exceptions to stderr and stdout, set this to false. +# +pdj.redirect-pdio=true + +# the jvm to use. If it is not found and the system is on Windows, +# the jvm installed with the registry will be used. Not used on OS X +# +pdj.JAVA_HOME=/usr/local/java + +# the JVM version to use with OS X; linked to the Java Framework on OS X +# +pdj.osx.JVM_JAVA_VERSION=1.5.0 + +# NOTE: pdj.home is set automagicly from where the pdj.pd_linux or pdj.dll +# is installed (you need to put it in your pd path in OS X) + +# ========================================================================= +# VM ARGUMENTS +# +# to monitor memory and thread usage with 1.5 (jconsole) use +# -Dcom.sun.management.jmxremote +# to do remote debugging at port 3999 +# -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=3999 +# to check jni calls +# -Xcheck:jni -verbose:jni +# +# All arguments on the same line just like $ java -X... -X... myclass +# +pdj.vm_args=-Xincgc -Xms32m -Xmx256m + +# tells pdj what type of jvm it must use: client or server. Not used on +# OS X. client has lower starting time and can take less memory. server +# starts slower and takes more memory, but once the code is executed, +# it will be faster than in client mode. +# +pdj.vm_type=server
Added: vendor/pdj/current/res/pdj~-panner.pd =================================================================== --- vendor/pdj/current/res/pdj~-panner.pd (rev 0) +++ vendor/pdj/current/res/pdj~-panner.pd 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,10 @@ +#N canvas 0 0 450 300 10; +#X obj 54 90 pdj~ panner; +#X obj 126 48 nbx 5 14 0 127 0 0 empty empty empty 0 -6 0 10 -262144 +-1 -1 0 256; +#X obj 54 48 osc~ 440; +#X obj 55 136 dac~; +#X connect 0 0 3 0; +#X connect 0 1 3 1; +#X connect 1 0 0 1; +#X connect 2 0 0 0;
Added: vendor/pdj/current/res/pdj~-test.pd =================================================================== --- vendor/pdj/current/res/pdj~-test.pd (rev 0) +++ vendor/pdj/current/res/pdj~-test.pd 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,42 @@ +#N canvas 699 369 461 376 10; +#N canvas 0 0 450 300 graph1 0; +#X array signal-debug 441 float 0; +#X coords 0 1.02 440 -1.02 400 150 1; +#X restore 17 -91 graph; +#X obj 18 -264 osc~ 440; +#X obj 17 -183 *~; +#X obj 49 -182 *~; +#X obj 33 -208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X obj 65 -208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X obj 17 -143 tabwrite~ signal-debug; +#X obj 202 -185 metro 250; +#X obj 202 -208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X obj 81 -182 *~; +#X obj 97 -208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X obj 84 -264 phasor~ 440; +#X obj 172 -264 osc~ 880; +#X obj 246 -255 nbx 5 14 0.01 1 1 0 empty empty empty 0 -6 0 10 -262144 +-1 -1 0.01 256; +#X obj 184 -229 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 +-1 -1; +#X obj 18 -230 pdj~ pdj_test_tilde; +#X connect 1 0 15 0; +#X connect 2 0 6 0; +#X connect 3 0 6 0; +#X connect 4 0 2 1; +#X connect 5 0 3 1; +#X connect 7 0 6 0; +#X connect 8 0 7 0; +#X connect 9 0 6 0; +#X connect 10 0 9 1; +#X connect 11 0 15 1; +#X connect 12 0 15 2; +#X connect 13 0 15 3; +#X connect 14 0 15 3; +#X connect 15 0 2 0; +#X connect 15 1 3 0; +#X connect 15 2 9 0;
Added: vendor/pdj/current/src/MSPBuffer.c =================================================================== --- vendor/pdj/current/src/MSPBuffer.c (rev 0) +++ vendor/pdj/current/src/MSPBuffer.c 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,159 @@ +#include "native_classes.h" +#include "type_handler.h" +#include "pdj.h" + + +static t_garray *getArray(JNIEnv *env, jstring name) { + t_symbol *s = jstring2symbol(env, name); + t_garray *ret = (t_garray *)pd_findbyclass(s, garray_class); + + if ( ret == NULL ) { + post("pdj: array %s not found", s->s_name); + return NULL; + } + + return ret; +} + + +JNIEXPORT jlong JNICALL Java_com_cycling74_msp_MSPBuffer_getSize + (JNIEnv *env, jclass cls, jstring name) { + t_garray *array = getArray(env, name); + + if ( array == NULL ) + return -1; + + return garray_npoints(array); +} + + +JNIEXPORT jfloatArray JNICALL Java_com_cycling74_msp_MSPBuffer_peek + (JNIEnv *env , jclass cls, jstring name) { + t_garray *array = getArray(env, name); + t_sample *vec; + jfloatArray ret; + int size; + + if ( array == NULL ) + return NULL; + + if ( ! garray_getfloatarray(array, &size, &vec) ) + return NULL; + + ret = (*env)->NewFloatArray(env, size); + + if ( ret == NULL ) { + SHOWEXC; + return NULL; + } + + (*env)->SetFloatArrayRegion(env, ret, 0, size, (jfloat *) vec); + + return ret; +} + + +JNIEXPORT void JNICALL Java_com_cycling74_msp_MSPBuffer_poke + (JNIEnv *env, jclass cls, jstring name, jfloatArray values) { + t_garray *array = getArray(env, name); + t_sample *vec; + jsize jarray_length; + int size; + + if ( array == NULL ) + return; + + if ( ! garray_getfloatarray(array, &size, &vec) ) + return; + + jarray_length = (*env)->GetArrayLength(env, values); + + if ( jarray_length < size ) { + error("pdj: warning: array too short"); + } else { + size = jarray_length; + } + + (*env)->GetFloatArrayRegion(env, values, 0, size, vec); + garray_redraw(array); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_msp_MSPBuffer_setSize + (JNIEnv *env, jclass cls, jstring name, jint channel, jlong size) { + t_garray *array = getArray(env, name); + + if ( array == NULL ) + return; + + garray_resize(array, size); +} + + +JNIEXPORT jfloatArray JNICALL Java_com_cycling74_msp_MSPBuffer_getArray + (JNIEnv *env, jclass cls, jstring name, jlong from, jlong arraySize) { + t_garray *array = getArray(env, name); + t_sample *vec; + jfloatArray ret; + int size, ifrom = (int) from, iarraySize = (int) arraySize; + + if ( array == NULL ) + return NULL; + + if ( ! garray_getfloatarray(array, &size, &vec) ) + return NULL; + + if ( iarraySize != -1 ) { + if ( size < ifrom ) { + error("pdj: array is shorter than the starting point"); + return NULL; + } + + if ( size < ifrom + iarraySize ) { + error("pdj: array is not big enough to fill the array"); + return NULL; + } + size = iarraySize; + } + + ret = (*env)->NewFloatArray(env, size); + if ( ret == NULL ) { + SHOWEXC; + return NULL; + } + + vec += ifrom; + (*env)->SetFloatArrayRegion(env, ret, 0, size, (jfloat *) vec); + + return ret; +} + + +JNIEXPORT void JNICALL Java_com_cycling74_msp_MSPBuffer_setArray + (JNIEnv *env, jclass cls, jstring name, jlong from, jfloatArray values) { + t_garray *array = getArray(env, name); + t_sample *vec; + jsize jarray_length; + int size, ifrom = from; + + if ( array == NULL ) + return; + + if ( ! garray_getfloatarray(array, &size, &vec) ) + return; + + if ( size < from ) { + error("pdj: array too short from starting point"); + return; + } + jarray_length = (*env)->GetArrayLength(env, values); + + if ( jarray_length + ifrom > size ) { + error("pdj: warning: array too short from java array size"); + return; + } + + vec += from; + (*env)->GetFloatArrayRegion(env, values, 0, jarray_length, vec); + garray_redraw(array); +}
Added: vendor/pdj/current/src/MaxClock.c =================================================================== --- vendor/pdj/current/src/MaxClock.c (rev 0) +++ vendor/pdj/current/src/MaxClock.c 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,74 @@ +#include <stdlib.h> +#include "native_classes.h" +#include "type_handler.h" +#include "pdj.h" + +typedef struct _clockCtnr { + jobject instance; + jmethodID tick; + t_clock *pd_clock; +} t_clockCtnr; + + +static t_clockCtnr *getClock(JNIEnv *env, jobject obj) { + return (t_clockCtnr *) (*env)->GetLongField(env, obj, pdjCaching.FIDMaxClock_clock_ptr); +} + + +void clock_callback(t_clockCtnr *clk) { + JNIEnv *env = pdjAttachVM(); + JASSERT(clk->instance); + + (*env)->CallVoidMethod(env, clk->instance , clk->tick, NULL); + pdjDetachVM(env); +} + + +JNIEXPORT jdouble JNICALL Java_com_cycling74_max_MaxClock_getTime + (JNIEnv *env, jclass cls) { + return sys_getrealtime() * 1000; +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxClock_create_1clock + (JNIEnv *env, jobject obj) { + jclass cls = (*env)->GetObjectClass(env, obj); + t_clockCtnr *clk; + + clk = malloc(sizeof(t_clockCtnr)); + ASSERT(clk); + + clk->pd_clock = clock_new(clk, (t_method) clock_callback); + (*env)->SetLongField(env, obj, pdjCaching.FIDMaxClock_clock_ptr, (long) clk); + + clk->instance = (*env)->NewGlobalRef(env, obj); + JASSERT(clk->instance); + clk->tick = (*env)->GetMethodID(env, cls, "tick", "()V"); + JASSERT(clk->tick); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxClock_delay + (JNIEnv *env, jobject obj, jdouble value) { + t_clockCtnr *clk = getClock(env, obj); + clock_delay(clk->pd_clock, value); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxClock_unset + (JNIEnv *env, jobject obj) { + t_clockCtnr *clk = getClock(env, obj); + clock_unset(clk->pd_clock); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxClock_release + (JNIEnv *env, jobject obj) { + t_clockCtnr *clk = getClock(env, obj); + clock_unset(clk->pd_clock); + clock_free(clk->pd_clock); + free(clk); + + (*env)->SetObjectField(env, obj, pdjCaching.FIDMaxClock_clock_ptr, 0); + (*env)->DeleteGlobalRef(env, obj); +}
Added: vendor/pdj/current/src/MaxObject.c =================================================================== --- vendor/pdj/current/src/MaxObject.c (rev 0) +++ vendor/pdj/current/src/MaxObject.c 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,131 @@ +#include "native_classes.h" +#include "type_handler.h" +#include "pdj.h" + + +static t_pdj *getMaxObject(JNIEnv *env, jobject obj) { + t_pdj *ret = (t_pdj *) (*env)->GetLongField(env, obj, + pdjCaching.FIDMaxObject_pdobj_ptr); + + if ( ret == NULL ) + error("pdj: using a native method without pd context"); + + return ret; +} + + +JNIEXPORT jlong JNICALL Java_com_cycling74_max_MaxObject_newInlet + (JNIEnv *env, jobject obj, jint type) { + t_pdj *pdj = getMaxObject(env, obj); + t_inlet_proxy *proxy; + + if ( pdj == NULL ) + return 0; + if ( type == com_cycling74_msp_MSPObject_SIGNAL ) { + inlet_new(&pdj->x_obj, &pdj->x_obj.ob_pd, &s_signal, 0); + return 0; + } + + proxy = (t_inlet_proxy *) pd_new(inlet_proxy); + pdj->nb_inlet++; + proxy->idx = pdj->nb_inlet; + proxy->peer = pdj; + + return (jlong) inlet_new(&pdj->x_obj, &proxy->x_obj.ob_pd, 0, 0); +} + + +JNIEXPORT jlong JNICALL Java_com_cycling74_max_MaxObject_newOutlet + (JNIEnv *env, jobject obj, jint type) { + t_pdj *pdj = getMaxObject(env, obj); + + if ( pdj == NULL ) + return 0; + + if ( type == com_cycling74_msp_MSPObject_SIGNAL ) { + outlet_new(&pdj->x_obj, &s_signal); + return 0; + } + + return (jlong) outlet_new(&pdj->x_obj, NULL); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_doOutletBang + (JNIEnv *env, jobject obj, jlong outlet) { + t_outlet *x = (t_outlet *) ((unsigned int) outlet); + outlet_bang(x); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_doOutletFloat + (JNIEnv *env, jobject obj, jlong outlet , jfloat value) { + t_outlet *x = (t_outlet *) ((unsigned int) outlet); + outlet_float(x, value); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_doOutletSymbol + (JNIEnv *env, jobject obj, jlong outlet, jstring value) { + t_outlet *x = (t_outlet *) ((unsigned int) outlet); + outlet_symbol(x, jstring2symbol(env, value)); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_doOutletAnything + (JNIEnv *env, jobject obj, jlong outlet, jstring str, jobjectArray value) { + t_outlet *x = (t_outlet *) ((unsigned int) outlet); + t_atom args[MAX_ATOMS_STACK]; + int argc; + + jatoms2atoms(env, value, &argc, args); + if ( str == NULL ) { + if ( args[0].a_type == A_FLOAT ) { + outlet_anything(x, &s_list, argc, args); + } else { + t_symbol *sym = atom_getsymbol(&(args[0])); + outlet_anything(x, sym, argc-1, args+1); + } + } else { + outlet_anything(x, jstring2symbol(env, str), argc, args); + } +} + +JNIEXPORT jstring JNICALL Java_com_cycling74_max_MaxObject_getPatchPath + (JNIEnv *env, jobject obj) { + t_pdj *pdj = getMaxObject(env, obj); + + if ( pdj == NULL ) + return NULL; + + return (*env)->NewStringUTF(env, pdj->patch_path); + +} + +// UGLY UGLY UGLY, but this is used not force the user from using +// a constructor. MaxObject CAN be used outside the pdj object +// but all the natives calls will break. Theses methods are always called +// within a synchronized() block. This is ugly, but less ugly than +// putting the information in a ThreadLocals? ... or using a MaxContext ? +// =========================================================================== +static t_pdj *pdjConstructor = NULL; +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_pushPdjPointer + (JNIEnv *env, jclass cls, jlong ptr) { + pdjConstructor = (t_pdj *) ptr; +} + + +JNIEXPORT jlong JNICALL Java_com_cycling74_max_MaxObject_popPdjPointer + (JNIEnv *env, jclass cls) { + t_pdj *tmp; + + // the object has been used instanciated without pdj. Return a null + // pointer. + if ( pdjConstructor == NULL ) { + return 0; + } + tmp = pdjConstructor; + pdjConstructor = NULL; + + return tmp; +}
Added: vendor/pdj/current/src/MaxSystem.c =================================================================== --- vendor/pdj/current/src/MaxSystem.c (rev 0) +++ vendor/pdj/current/src/MaxSystem.c 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,178 @@ +#include "native_classes.h" +#include "type_handler.h" +#include "pdj.h" +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#ifdef MSW + #include <io.h> +#else + #include <unistd.h> +#endif + +/* from m_imp.h... todo: ask Miller ??? */ +EXTERN void outlet_setstacklim(void); + + +/** + * Using a { or } in a post or error will lock PD, we substitute + * them with a ( and ). + */ +static char* removePdAcc(char *str, jboolean isCopy) { + char *work; + + if ( isCopy == JNI_TRUE ) { + work = str; + while(*work != 0) { + switch(*work) { + case '{' : + *work = '('; + break; + case '}' : + *work = ')'; + break; + } + work++; + } + return str; + } + + work = malloc(strlen(str)+1); + while(*str != 0) { + switch(*str) { + case '{' : + *work = '('; + break; + case '}' : + *work = ')'; + break; + default: + *work = *str; + } + work++; + str++; + } + + *work = 0; + return work; +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxSystem_error + (JNIEnv *env, jclass cls, jstring message) { + jboolean isCopy; + + char *msg = (*env)->GetStringUTFChars(env, message, &isCopy); + msg = removePdAcc(msg, isCopy); + + if ( REDIRECT_PD_IO ) { + error(msg); + } else { + fprintf(stderr, msg); + fprintf(stderr, "\n"); + } + + if ( isCopy == JNI_FALSE ) + free(msg); + + (*env)->ReleaseStringUTFChars(env, message, msg); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxSystem_post + (JNIEnv *env, jclass cls, jstring message) { + jboolean isCopy; + + char *msg = (*env)->GetStringUTFChars(env, message, &isCopy); + msg = removePdAcc(msg, isCopy); + + if ( REDIRECT_PD_IO ) { + post(msg); + } else { + fprintf(stdout, msg); + fprintf(stdout, "\n"); + } + + if ( isCopy == JNI_FALSE ) + free(msg); + + (*env)->ReleaseStringUTFChars(env, message, msg); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_max_MaxSystem_ouch + (JNIEnv *env, jclass cls, jstring message) { + jboolean isCopy; + + char *msg = (*env)->GetStringUTFChars(env, message, &isCopy); + fprintf(stderr, msg); + fprintf(stderr, "\n"); + msg = removePdAcc(msg, isCopy); + bug(msg); + + if ( isCopy == JNI_FALSE ) + free(msg); + + (*env)->ReleaseStringUTFChars(env, message, msg); +} + + +JNIEXPORT jboolean JNICALL Java_com_cycling74_max_MaxSystem_sendMessageToBoundObject + (JNIEnv *env, jclass cls, jstring jname, jstring jmsg, jobjectArray jatoms) { + t_symbol *name = jstring2symbol(env, jname); + t_symbol *msg = jstring2symbol(env, jmsg); + t_pd *dest = findPDObject(name); + t_atom argv[MAX_ATOMS_STACK]; + int argc; + + if ( dest == NULL ) { + post("pdj: unable to get object %s for sendMessageToBoundObject", name->s_name); + return 0; + } + + /* reset the stack pointer for pd events */ + outlet_setstacklim(); + + if ( msg == &s_bang ) { + pd_bang(dest); + return 1; + } + + if ( jatoms == NULL ) { + pd_symbol(dest, msg); + return 1; + } + + jatoms2atoms(env, jatoms, &argc, argv); + + if ( msg == &s_float ) { + pd_float(dest, atom_getfloatarg(0, argc, argv)); + return 1; + } + + pd_list(dest, msg, argc, argv); + return 1; +} + + +JNIEXPORT jstring JNICALL Java_com_cycling74_max_MaxSystem_locateFile + (JNIEnv *env, jclass cls, jstring filename) { + const jbyte *file = (*env)->GetStringUTFChars(env, filename, NULL); + char fullpath[MAXPDSTRING], *pfullpath; + FILE *fd; + + fd = open_via_path("", file, "", fullpath, &pfullpath, MAXPDSTRING, 0); + (*env)->ReleaseStringUTFChars(env, filename, file); + if ( fd != NULL ) { + close(fd); + if ( fullpath[0] != 0 ) { + if ( pfullpath == &fullpath ) { + getcwd(fullpath, MAXPDSTRING); + } + return (*env)->NewStringUTF(env, fullpath); + } + } + + return NULL; +}
Added: vendor/pdj/current/src/init.c =================================================================== --- vendor/pdj/current/src/init.c (rev 0) +++ vendor/pdj/current/src/init.c 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,349 @@ +/** + * This code is very ugly and needs rewrite. PERIOD. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "pdj.h" + +#define MAX_PROPERTIES 40 +char *properties[MAX_PROPERTIES+1][2]; + +char *pdj_getProperty(char *name) { + int i; + + for(i=0; properties[i][0] != NULL; i++) { + if ( !strcmp(properties[i][0], name) ) { + return properties[i][1]; + } + } + return NULL; +} + + +static void load_properties() { + char propPath[BUFFER_SIZE]; + int propIdx = 0; + char *alloc; + FILE *f; + + getuglylibpath(propPath); + + properties[0][0] = "pdj.home"; + alloc = malloc(strlen(propPath)+1); + strcpy(alloc, propPath); + properties[0][1] = alloc; + + strcat(propPath, DIR_SEP "pdj.properties"); + f = fopen(propPath, "r"); + + if ( f == NULL ) { + post("pdj: warning: property file not found at %s", propPath); + return; + } + + while(!feof(f)) { + char buffer[BUFFER_SIZE]; + char *work, *key, *value; + + fgets(buffer, BUFFER_SIZE-1, f); + + work = strchr(buffer, '\n'); + if ( work != 0 ) { + *work = 0; + + if ( work == buffer ) + continue; + } + + /* cuts comments */ + work = strchr(buffer, '#'); + if ( work != NULL ) { + *work = 0; + + if ( work == buffer ) + continue; + } + + key = strtok(buffer, "="); + if ( key == NULL ) { + continue; + } + + value = strtok(NULL, ""); + if ( value == NULL ) { + value = ""; + } + + if ( propIdx == MAX_PROPERTIES ) { + error("pdj: maximum defined properties"); + break; + } + propIdx++; + + alloc = malloc(strlen(key)+1); + strcpy(alloc, key); + properties[propIdx][0] = alloc; + + alloc = malloc(strlen(value)+1); + strcpy(alloc, value); + properties[propIdx][1] = alloc; + } + + properties[propIdx+1][0] = NULL; + properties[propIdx+1][1] = NULL; + fclose(f); +} + + +static void copyToJavaSystemProperties(JNIEnv *env) { + jclass system = (*env)->FindClass(env, "java/lang/System"); + jmethodID id = (*env)->GetStaticMethodID(env, system, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); + int i; + + for(i=0; properties[i][0] != NULL; i++) { + jobject key, value; + + key = (*env)->NewStringUTF(env, properties[i][0]); + JASSERT(key); + value = (*env)->NewStringUTF(env, properties[i][1]); + JASSERT(value); + + (*env)->CallStaticObjectMethod(env, system, id, key, value); + } +} + + +PdjCaching pdjCaching; +static int initIDCaching(JNIEnv *env) { + pdjCaching.cls_Atom = (*env)->FindClass(env, "com/cycling74/max/Atom"); + if ( pdjCaching.cls_Atom == NULL ) { + // if the Atom class is not found... it means that pdj.jar is not on + // classpath and the installation is broken. + error("pdj: com.cycling74.max.Atom is not found on classpath ! pdj.jar must in the same directory of the external!"); + return 1; + } + pdjCaching.cls_Atom = (*env)->NewGlobalRef(env, pdjCaching.cls_Atom); + + pdjCaching.cls_MaxClock = (*env)->FindClass(env, "com/cycling74/max/MaxClock"); + JASSERT(pdjCaching.cls_MaxClock); + pdjCaching.cls_MaxClock = (*env)->NewGlobalRef(env, pdjCaching.cls_MaxClock); + + pdjCaching.cls_MaxObject = (*env)->FindClass(env, "com/cycling74/max/MaxObject"); + JASSERT(pdjCaching.cls_MaxObject); + pdjCaching.cls_MaxObject = (*env)->NewGlobalRef(env, pdjCaching.cls_MaxObject); + + pdjCaching.cls_MSPObject = (*env)->FindClass(env, "com/cycling74/msp/MSPObject"); + JASSERT(pdjCaching.cls_MSPObject); + pdjCaching.cls_MSPObject = (*env)->NewGlobalRef(env, pdjCaching.cls_MSPObject); + + pdjCaching.cls_MSPSignal = (*env)->FindClass(env, "com/cycling74/msp/MSPSignal"); + JASSERT(pdjCaching.cls_MSPSignal); + pdjCaching.cls_MSPSignal = (*env)->NewGlobalRef(env, pdjCaching.cls_MSPSignal); + + pdjCaching.MIDAtom_newAtom_Float = + (*env)->GetStaticMethodID(env, pdjCaching.cls_Atom, "newAtom", "(F)Lcom/cycling74/max/Atom;"); + JASSERT(pdjCaching.MIDAtom_newAtom_Float); + + pdjCaching.MIDAtom_newAtom_String = + (*env)->GetStaticMethodID(env, pdjCaching.cls_Atom, "newAtom", "(Ljava/lang/String;)Lcom/cycling74/max/Atom;"); + JASSERT(pdjCaching.MIDAtom_newAtom_String); + + pdjCaching.FIDAtom_type = + (*env)->GetFieldID(env, pdjCaching.cls_Atom, "type", "I"); + JASSERT(pdjCaching.FIDAtom_type); + + pdjCaching.cls_AtomFloat = (*env)->FindClass(env, "com/cycling74/max/AtomFloat"); + JASSERT(pdjCaching.cls_AtomFloat); + + pdjCaching.FIDAtomFloat_value = + (*env)->GetFieldID(env, pdjCaching.cls_AtomFloat, "value", "F"); + JASSERT(pdjCaching.FIDAtomFloat_value); + + pdjCaching.cls_AtomString = (*env)->FindClass(env, "com/cycling74/max/AtomString"); + JASSERT(pdjCaching.cls_AtomString); + + pdjCaching.FIDAtomString_value = + (*env)->GetFieldID(env, pdjCaching.cls_AtomString, "value", "Ljava/lang/String;"); + JASSERT(pdjCaching.FIDAtomString_value); + + pdjCaching.FIDMaxClock_clock_ptr = + (*env)->GetFieldID(env, pdjCaching.cls_MaxClock, "_clock_ptr", "J"); + JASSERT(pdjCaching.FIDMaxClock_clock_ptr); + + pdjCaching.FIDMaxObject_pdobj_ptr = + (*env)->GetFieldID(env, pdjCaching.cls_MaxObject, "_pdobj_ptr", "J"); + JASSERT(pdjCaching.FIDMaxObject_pdobj_ptr); + + pdjCaching.FIDMaxObject_activity_inlet = + (*env)->GetFieldID(env, pdjCaching.cls_MaxObject, "_activity_inlet", "I"); + JASSERT(pdjCaching.FIDMaxObject_activity_inlet); + + pdjCaching.MIDMaxObject_trySetter = + (*env)->GetMethodID(env, pdjCaching.cls_MaxObject, "_trySetter", "(Ljava/lang/String;[Lcom/cycling74/max/Atom;)Z"); + JASSERT(pdjCaching.MIDMaxObject_trySetter); + + pdjCaching.FIDMSPObject_used_inputs = + (*env)->GetFieldID(env, pdjCaching.cls_MSPObject, "_used_inputs", "[Lcom/cycling74/msp/MSPSignal;"); + JASSERT(pdjCaching.FIDMSPObject_used_inputs); + + pdjCaching.FIDMSPObject_used_outputs = + (*env)->GetFieldID(env, pdjCaching.cls_MSPObject, "_used_outputs", "[Lcom/cycling74/msp/MSPSignal;"); + JASSERT(pdjCaching.FIDMSPObject_used_outputs); + + pdjCaching.MIDMSPObject_dspinit = + (*env)->GetMethodID(env, pdjCaching.cls_MSPObject, "_dspinit", "(FI)Ljava/lang/reflect/Method;"); + JASSERT(pdjCaching.MIDMSPObject_dspinit); + + pdjCaching.MIDMSPObject_emptyPerformer = + (*env)->GetMethodID(env, pdjCaching.cls_MSPObject, "_emptyPerformer", "([Lcom/cycling74/msp/MSPSignal;[Lcom/cycling74/msp/MSPSignal;)V"); + JASSERT(pdjCaching.MIDMSPObject_emptyPerformer); + + pdjCaching.FIDMSPSignal_vec = + (*env)->GetFieldID(env, pdjCaching.cls_MSPSignal, "vec", "[F"); + JASSERT(pdjCaching.FIDMSPSignal_vec); + + return 0; +} + + +static int linkClasses(JNIEnv *env) { + jclass pdjSystem = (*env)->FindClass(env, "com/e1/pdj/PDJSystem"); + jmethodID id; + if ( pdjSystem == NULL ) { + SHOWEXC; + return 1; + } + + id = (*env)->GetStaticMethodID(env, pdjSystem, "_init_system", "()V"); + if ( id == NULL ) { + SHOWEXC; + return 1; + } + + (*env)->CallStaticVoidMethod(env, pdjSystem, id); + if ( (*env)->ExceptionOccurred(env) ) { + (*env)->ExceptionDescribe(env); + return 1; + } + + return 0; +} + + +void buildVMOptions(jint *nb, JavaVMOption *options) { + static char cp[BUFFER_SIZE], pdj_cp[BUFFER_SIZE]; + char installPath[BUFFER_SIZE]; + char *prop; + char *token, *work; + int i; + *nb = 0; + + getuglylibpath(installPath); + + // first; we set the system classpath + strcpy(cp, "-Djava.class.path="); + strcat(cp, installPath); + strcat(cp, DIR_SEP "pdj.jar" PATH_SEP); + prop = pdj_getProperty("pdj.system-classpath"); + if ( prop != NULL ) + strcat(cp, prop); + options[0].optionString = cp; + + prop = pdj_getProperty("pdj.vm_args"); + if ( prop == NULL ) { + *nb = 1; + return; + } + + work = malloc(strlen(prop)+1); + strcpy(work, prop); + token = strtok(work, " "); + + for(i=*nb; i<32; i++) { + *nb += 1; + + if ( token == NULL ) { + free(work); + return; + } + + options[*nb].optionString = malloc(strlen(token)+1); + strcpy(options[*nb].optionString, token); + token = strtok(NULL, " "); + } + + bug("pdj: maximum vm_args properties defined. Go see the source Luke."); +} + + +int REDIRECT_PD_IO; +static void redirectIoInit(void) { + char *ret; + + ret = pdj_getProperty("pdj.redirect-pdio"); + if ( ret == NULL ) { + REDIRECT_PD_IO = 1; + return; + } + + if ( ret[0] == '0' ) { + REDIRECT_PD_IO = 0; + return; + } + + if ( strcmp(ret, "false") == 0 ) { + REDIRECT_PD_IO = 0; + return; + } + + REDIRECT_PD_IO = 1; +} + + +JNIEnv *init_jvm(void) { + JNI_CreateJavaVM_func *func; + JavaVMOption opt[32]; + JavaVMInitArgs vm_args; + JNIEnv *jni_env; + char *vm_type; + int rc; + + load_properties(); + + buildVMOptions(&(vm_args.nOptions), opt); + vm_args.options = opt; + vm_args.version = JNI_VERSION_1_4; + vm_args.ignoreUnrecognized = JNI_FALSE; + + vm_type = pdj_getProperty("pdj.vm_type"); + if ( vm_type == NULL ) { + error("pdj: unknown vm_type, using client"); + vm_type = "client"; + } + + func = linkjvm(vm_type); + if ( func == NULL ) + return NULL; + + rc = func(&jni_jvm, &jni_env, &vm_args); + if ( rc != 0 ) { + error("pdj: unable to create JVM: JNI_CreateJavaVM = %d", rc); + return NULL; + } + + copyToJavaSystemProperties(jni_env); + if ( initIDCaching(jni_env) != 0) { + return NULL; + } + + if ( linkClasses(jni_env) != 0 ) { + return NULL; + } + + redirectIoInit(); + + return jni_env; +} +
Added: vendor/pdj/current/src/java/com/cycling74/io/ErrorStream.java =================================================================== --- vendor/pdj/current/src/java/com/cycling74/io/ErrorStream.java (rev 0) +++ vendor/pdj/current/src/java/com/cycling74/io/ErrorStream.java 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,10 @@ +package com.cycling74.io; + +import com.e1.pdj.*; +import java.io.*; + +public class ErrorStream extends PrintStream { + public ErrorStream() { + super(PDJSystem.err, true); + } +}
Added: vendor/pdj/current/src/java/com/cycling74/io/PostStream.java =================================================================== --- vendor/pdj/current/src/java/com/cycling74/io/PostStream.java (rev 0) +++ vendor/pdj/current/src/java/com/cycling74/io/PostStream.java 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,10 @@ +package com.cycling74.io; + +import com.e1.pdj.*; +import java.io.*; + +public class PostStream extends PrintStream { + public PostStream() { + super(PDJSystem.out, true); + } +}
Added: vendor/pdj/current/src/java/com/cycling74/max/Atom.java =================================================================== --- vendor/pdj/current/src/java/com/cycling74/max/Atom.java (rev 0) +++ vendor/pdj/current/src/java/com/cycling74/max/Atom.java 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,715 @@ +package com.cycling74.max; + +import java.io.*; +import java.util.*; + +/** + * PD element that is used in message or arguments. It can contains a + * float, a int (always map to a float in pd) or a string. + */ +public abstract class Atom implements Comparable, Serializable { + + /** + * Empty array to use with the API when theres is no arguments. + */ + public static final Atom[] emptyArray = new Atom[] {}; + + int type; + + Atom(int type) { + this.type = type; + } + + // Atom factories + /////////////////////////////////////////////////////////////////// + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom newAtom(int value) { + return new AtomFloat(value); + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom[] newAtom(int value[]) { + Atom[] ret = new Atom[value.length]; + for(int i=0;i<value.length;i++) { + ret[i] = newAtom(value[i]); + } + return ret; + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom newAtom(long value) { + return new AtomFloat(value); + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom[] newAtom(long value[]) { + Atom[] ret = new Atom[value.length]; + for(int i=0;i<value.length;i++) { + ret[i] = newAtom(value[i]); + } + return ret; + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom newAtom(short value) { + return new AtomFloat(value); + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom[] newAtom(short value[]) { + Atom[] ret = new Atom[value.length]; + for(int i=0;i<value.length;i++) { + ret[i] = newAtom(value[i]); + } + return ret; + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom newAtom(byte value) { + return new AtomFloat(value); + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom[] newAtom(byte value[]) { + Atom[] ret = new Atom[value.length]; + for(int i=0;i<value.length;i++) { + ret[i] = newAtom(value[i]); + } + return ret; + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom newAtom(char value) { + return new AtomString(String.valueOf(value)); + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom[] newAtom(char value[]) { + Atom[] ret = new Atom[value.length]; + for(int i=0;i<value.length;i++) { + ret[i] = newAtom(value[i]); + } + return ret; + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom newAtom(boolean value) { + return new AtomFloat( value ? 1:0 ); + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom[] newAtom(boolean value[]) { + Atom[] ret = new Atom[value.length]; + for(int i=0;i<value.length;i++) { + ret[i] = newAtom(value[i]); + } + return ret; + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom newAtom(float value) { + return new AtomFloat(value); + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom[] newAtom(float value[]) { + Atom[] ret = new Atom[value.length]; + for(int i=0;i<value.length;i++) { + ret[i] = newAtom(value[i]); + } + return ret; + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom newAtom(double value) { + return new AtomFloat((float) value); + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom[] newAtom(double value[]) { + Atom[] ret = new Atom[value.length]; + for(int i=0;i<value.length;i++) { + ret[i] = newAtom(value[i]); + } + return ret; + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom newAtom(String value) { + return new AtomString(value); + } + + /** + * Creates a new atom with the specified type. + * @param value the value of the atom + * @return the new Atom + */ + public static Atom[] newAtom(String value[]) { + Atom[] ret = new Atom[value.length]; + for(int i=0;i<value.length;i++) { + ret[i] = newAtom(value[i]); + } + return ret; + } + + /** + * Creates an array of atoms from string tokens. + * @param values the atoms value seperated by string + * @return the array of atoms created from the list + */ + public static Atom[] parse(String values) { + return parse(values, false); + } + + /** + * Creates an array of atoms from strings tokens. + * @param values the atoms value seperated by string + * @param skipfirst skip the first token + * @return the array of atoms created from the list + */ + public static Atom[] parse(String values, boolean skipfirst) { + ArrayList list = new ArrayList(); + StringTokenizer token = new StringTokenizer(values); + + if ( skipfirst && token.hasMoreTokens() ) { + token.nextToken(); + } + + while(token.hasMoreTokens()) { + list.add(newAtom(token.nextToken())); + } + + Iterator i = list.iterator(); + Atom[] ret = new Atom[list.size()]; + for(int idx=0; i.hasNext(); idx++) { + ret[idx] = (Atom) i.next(); + } + + return ret; + } + + // Atom methods + /////////////////////////////////////////////////////////////////// + + /** + * Get string value for this Atom. If the Atom does not contains a + * string it will throw an UnsupportedOperationException. + */ + public String getString() { + throw new UnsupportedOperationException("pdj: this atom is not a string"); + } + + /** + * Get int value for this Atom. If the Atom does not contains a + * int it will throw an UnsupportedOperationException. + */ + public int getInt() { + throw new UnsupportedOperationException("pdj: this atom is not a int"); + } + + /** + * Get float value for this Atom. If the Atom does not contains a + * float it will throw an UnsupportedOperationException. + */ + public float getFloat() { + throw new UnsupportedOperationException("pdj: this atom is not a float"); + } + + /** + * Returns the Object representation of the Atom. If it is an int or a + * float, it will return a Int/Float object. + * @return The java.lang.* representation of the object + */ + abstract Object toObject(); + + /** + * Returns the double value of this atom. + * @return the double value + */ + public double toDouble() { + return 0; + } + + /** + * Transform an array of Atom into an array of doubles. + * @param values the array of atoms + * @return array of doubles + */ + public static double[] toDouble(Atom[] values) { + double[] ret = new double[values.length]; + + for(int i=0;i<values.length;i++) { + ret[i] = values[i].toDouble(); + } + return ret; + } + + /** + * Returns the int value of this atom. + * @return the int value + */ + public int toInt() { + return 0; + } + + /** + * Transform an array of Atom into an array of ints. + * @param values the array of atoms + * @return array of ints + */ + public static int[] toInt(Atom[] values) { + int[] ret = new int[values.length]; + + for(int i=0;i<values.length;i++) { + ret[i] = values[i].toInt(); + } + return ret; + } + + + /** + * Returns the char value of this atom. + * @return the char value + */ + public char toChar() { + return 0; + } + + /** + * Transform an array of Atom into an array of chars. + * @param values the array of atoms + * @return array of chars + */ + public static char[] toChar(Atom[] values) { + char[] ret = new char[values.length]; + + for(int i=0;i<values.length;i++) { + ret[i] = values[i].toChar(); + } + return ret; + } + + + /** + * Returns the byte value of this atom. + * @return the byte value + */ + public byte toByte() { + return 0; + } + + /** + * Transform an array of Atom into an array of bytes. + * @param values the array of atoms + * @return array of bytes + */ + public static byte[] toByte(Atom[] values) { + byte[] ret = new byte[values.length]; + + for(int i=0;i<values.length;i++) { + ret[i] = values[i].toByte(); + } + return ret; + } + + /** + * Returns the long value of this atom. + * @return the long value + */ + public long toLong() { + return 0; + } + + /** + * Transform an array of Atom into an array of longs. + * @param values the array of atoms + * @return array of longs + */ + public static long[] toLong(Atom[] values) { + long[] ret = new long[values.length]; + + for(int i=0;i<values.length;i++) { + ret[i] = values[i].toLong(); + } + return ret; + } + + /** + * Returns the short value of this atom. + * @return the short value + */ + public short toShort() { + return 0; + } + + /** + * Transform an array of Atom into an array of shorts. + * @param values the array of atoms + * @return array of shorts + */ + public static short[] toShort(Atom[] values) { + short[] ret = new short[values.length]; + + for(int i=0;i<values.length;i++) { + ret[i] = values[i].toShort(); + } + return ret; + } + + /** + * Returns the float value of this atom. + * @return the float value + */ + public float toFloat() { + return 0; + } + + /** + * Transform an array of Atom into an array of floats. + * @param values the array of atoms + * @return array of floats + */ + public static float[] toFloat(Atom[] values) { + float[] ret = new float[values.length]; + + for(int i=0;i<values.length;i++) { + ret[i] = values[i].toFloat(); + } + return ret; + } + + /** + * Returns the boolean value of this atom. + * @return the boolean value + */ + public boolean toBoolean() { + return true; + } + + /** + * Transform an array of Atom into an array of booleans. + * @param values the array of atoms + * @return array of booleans + */ + public static boolean[] toBoolean(Atom[] values) { + boolean[] ret = new boolean[values.length]; + + for(int i=0;i<values.length;i++) { + ret[i] = values[i].toBoolean(); + } + return ret; + } + + /** + * Transform an array of Atom into an array of strings. + * @param array the array of atoms + * @return array of strings + */ + public static String[] toString(Atom[] array) { + String[] ret = new String[array.length]; + + for(int i=0;i<array.length;i++) { + ret[i] = array[i].toString(); + } + return ret; + } + + /** + * Returns true if the Atom has been created with a float. + * @return true if the Atom has been created with a float + */ + public boolean isFloat() { + return false; + } + + /** + * Returns true if the Atom has been created with a String. + * @return true if the Atom has been created with a String + */ + public boolean isString() { + return false; + } + + /** + * Returns true if the Atom has been created with a int. + * @return true if the Atom has been created with a int + */ + public boolean isInt() { + return false; + } + + /** + * Returns the array of Atom into one string. Atom elements are + * seperated by spaces. + * @param array the array of atom + * @return one string representation of the atom + */ + public static String toOneString(Atom[] array) { + StringBuffer sb = new StringBuffer(); + boolean appendSpace = false; + + for(int i=0;i<array.length;i++) { + if ( !appendSpace ) { + sb.append(' '); + appendSpace = true; + } + sb.append(array[i].toString()); + } + + return sb.toString(); + } + + /** + * Returns true if the instance has the same value of the object + * <code>object</code>. Similar to <code>"ok".equals("ok");</code> + */ + public abstract boolean equals(Object object); + + /** + * Returns the hashCode representation for this Atom. If it is an float, + * the float into bit value is return and if it is an String, the hashcode + * value of the string is returned. + */ + public abstract int hashCode(); + + // Array utility classes + /////////////////////////////////////////////////////////////////// + + /** + * Returns the index of the first atom that is found in the list. + * @param org the atom to find + * @param list the list of atom to search + * @return the index of the atom found. -1 if not found. + */ + public static int isIn(Atom org, Atom[] list) { + return isIn(org, list, 0, list.length-1); + } + + /** + * Returns the index of the first atom that is found in the list. + * @param org the atom to find + * @param list the list of atom to search + * @param from the start index to check + * @param to the last index to check + * @return the index of the atom found. -1 if not found. + */ + public static int isIn(Atom org, Atom[] list, int from, int to) { + for(int i=from;i<to+1;i++) { + if ( list[i].equals(org) ) + return i; + } + return -1; + } + + /** + * Remove at index <code>from</code> to index <code>to</code>. + * @param list the list to strip + * @param from the start index + * @param to the last index + * @return the stripped array + */ + public static Atom[] removeSome(Atom[] list, int from, int to) { + if ( from == 0 && from == list.length - 1 ) + return new Atom[] {}; + + Atom[] ret = new Atom[list.length - (to-from+1)]; + System.arraycopy(list, 0, ret, 0, from); + System.arraycopy(list, to + 1, ret, from, list.length - to - 1); + + return ret; + } + + /** + * Removes one atom in the list. + * @param list the list to strip + * @param i the index of the atom to remove + * @return the stripped array + */ + public static Atom[] removeOne(Atom[] list, int i) { + return removeSome(list, i, i); + } + + /** + * Removes the first atom in the list. + * @param list the list to strip + * @return the stripped array + */ + public static Atom[] removeFirst(Atom[] list) { + return removeFirst(list, 1); + } + + /** + * Removes the first <code>howmany</code> atoms in the list. + * @param list the list to strip + * @param howmany how many element to remove + * @return the stripped array + */ + public static Atom[] removeFirst(Atom[] list, int howmany) { + return removeSome(list, 0, howmany-1); + } + + /** + * Remove the last atom in the list. + * @param list the list to strip + * @return the stripped array + */ + public static Atom[] removeLast(Atom[] list) { + return removeLast(list, 1); + } + + /** + * Removes the last <code>howmany</code> atoms in the list. + * @param list the list to strip + * @param howmany how many element to remove + * @return the stripped array + */ + public static Atom[] removeLast(Atom[] list, int howmany) { + return removeSome(list, list.length-howmany, list.length-1); + } + + /** + * Reverses the element content; the first element is the last and so on. + * @param list the list to reverse + * @return the reversed list + */ + public static Atom[] reverse(Atom[] list) { + Atom[] ret = new Atom[list.length]; + int last = list.length - 1; + for(int i=0;i<list.length;i++) { + ret[last-i] = list[i]; + } + return ret; + } + + /** + * Rotates array content x number of times. + * @param list the list to rotate + * @param nbTimes the number of time that the array must be rotated + * @return the rotated list + */ + public static Atom[] rotate(Atom[] list, int nbTimes) { + Atom ret[] = new Atom[list.length]; + + for(int i=0;i<list.length;i++) { + ret[(i+nbTimes) % list.length] = list[i]; + } + + return ret; + } + + /** + * Don't know what this does. Max/MSP says: it does an union. If + * you want me to support this, send me an email and what it does. + * @param first + * @param second + * @return nothing yet + * @throws UnsupportedOperationException + */ + public static Atom[] union(Atom[] first, Atom[] second) throws UnsupportedOperationException { + throw new UnsupportedOperationException("not implemented."); + } + + /** + * Don't know what this does. Max/MSP says: it does an intersection. + * If you want me to support this, send me an email and what it does. + * @param first + * @param second + * @return nothing yet + * @throws UnsupportedOperationException + */ + public static Atom[] intersection(Atom[] first, Atom[] second) throws UnsupportedOperationException { + throw new UnsupportedOperationException("not implemented."); + } + + /** + * Used to return a string representation of the list with atom type. + * @param values the array of atoms + * @return the string representation of the array + */ + public static String toDebugString(Atom[] values) { + StringBuffer sb = new StringBuffer(); + + sb.append("Atom["); + sb.append(values.length); + sb.append("]="); + for(int i=0;i<values.length;i++) { + sb.append('{'); + sb.append(values[i].toString()); + if ( values[i] instanceof AtomString ) + sb.append(":S}"); + else + sb.append(":F}"); + } + + return sb.toString(); + } +}
Added: vendor/pdj/current/src/java/com/cycling74/max/AtomFloat.java =================================================================== --- vendor/pdj/current/src/java/com/cycling74/max/AtomFloat.java (rev 0) +++ vendor/pdj/current/src/java/com/cycling74/max/AtomFloat.java 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,96 @@ +package com.cycling74.max; + +class AtomFloat extends Atom { + private static final long serialVersionUID = 6497612039215711052L; + private float value; + + AtomFloat(float value) { + super(DataTypes.FLOAT); + this.value = value; + } + + public int compareTo(Object obj) { + if ( obj instanceof AtomFloat ) { + AtomFloat f = (AtomFloat) obj; + if ( f.getFloat() <= getFloat() ) + return 1; + else + return -1; + } + + if ( obj instanceof AtomString ) { + return 1; + } + + throw new ClassCastException(); + } + + public boolean isFloat() { + return true; + } + + public boolean isInt() { + return true; + } + + public Object toObject() { + return new Float(value); + } + + public int toInt() { + return (int) value; + } + + public double toDouble() { + return value; + } + + public long toLong() { + return (long) value; + } + + public float toFloat() { + return value; + } + + public short toShort() { + return (short) value; + } + + public byte toByte() { + return (byte) value; + } + + public char toChar() { + return (char) value; + } + + public String toString() { + return new Float(value).toString(); + } + + public boolean toBoolean() { + return value != 0; + } + + public float getFloat() { + return value; + } + + public int getInt() { + return (int) value; + } + + public boolean equals(Object comp) { + if ( !(comp instanceof AtomFloat) ) { + return false; + } + AtomFloat test = (AtomFloat) comp; + + return test.value == value; + } + + public int hashCode() { + return new Float(value).hashCode(); + } +}
Added: vendor/pdj/current/src/java/com/cycling74/max/AtomString.java =================================================================== --- vendor/pdj/current/src/java/com/cycling74/max/AtomString.java (rev 0) +++ vendor/pdj/current/src/java/com/cycling74/max/AtomString.java 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,63 @@ +package com.cycling74.max; + +class AtomString extends Atom { + private static final long serialVersionUID = 1738861344247036680L; + private String value; + + AtomString(String value) { + super(DataTypes.MESSAGE); + this.value = value; + } + + public int compareTo(Object obj) { + if ( obj instanceof AtomString ) { + AtomString s = (AtomString) obj; + return s.getString().compareTo(getString()); + } + if ( obj instanceof AtomFloat ) { + return -1; + } + throw new ClassCastException(); + } + + public boolean isString() { + return true; + } + + public Object toObject() { + return value; + } + + public byte toByte() { + return (byte) value.charAt(0); + } + + public char toChar() { + return value.charAt(0); + } + + public String toString() { + return value; + } + + public boolean toBoolean() { + return !value.equals("false"); + } + + public String getString() { + return value; + } + + public boolean equals(Object comp) { + if ( !(comp instanceof AtomString) ) { + return false; + } + AtomString test = (AtomString) comp; + + return test.value.equals(value); + } + + public int hashCode() { + return value.hashCode(); + } +}
Added: vendor/pdj/current/src/java/com/cycling74/max/Attribute.java =================================================================== --- vendor/pdj/current/src/java/com/cycling74/max/Attribute.java (rev 0) +++ vendor/pdj/current/src/java/com/cycling74/max/Attribute.java 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,463 @@ +package com.cycling74.max; + +import java.lang.reflect.*; +import com.e1.pdj.PDJError; + +class Attribute { + boolean readOnly = false; + + // the method setter and getter if specified + Method setter; + Method getter; + + // the field to update if no setter or getter is specified + Field field; + + // attribute type + char type; + + // the owner of the field or method + Object obj; + + // tells if the arguments are a array + boolean isArray; + + Attribute(Object obj, String name, String setter_name, String getter_name) { + char typeCheck = 0; + + try { + this.obj = obj; + if ( getter == null ) { + field = obj.getClass().getDeclaredField(name); + field.setAccessible(true); + type = mapType(field.getType()); + if ( type == '-' ) { + throw new PDJError("Field: " + name + " is a unsupported type"); + } + isArray = Character.isLowerCase(type); + } else { + getter = obj.getClass().getDeclaredMethod(getter_name, null); + type = mapType(getter.getReturnType()); + if ( type == '-' ) { + throw new PDJError("Method: " + getter_name + " returns a unsupported type"); + } + isArray = Character.isLowerCase(type); + } + + if ( setter == null ) { + field = obj.getClass().getDeclaredField(name); + field.setAccessible(true); + typeCheck = mapType(field.getType()); + } else { + Method methods[] = obj.getClass().getMethods(); + + for(int i=0;i<methods.length;i++) { + if ( methods[i].getName().equals(setter_name) ) { + Class c[] = methods[i].getParameterTypes(); + if ( c.length > 1 ) + throw new PDJError("Method: " + setter_name + " has too much parameters to be a setter"); + typeCheck = mapType(c[0]); + setter = methods[i]; + break; + } + } + if ( typeCheck == 0 ) { + throw new NoSuchMethodException(setter_name); + } + } + } catch ( Exception e ) { + throw new PDJError(e); + } + + if ( typeCheck != type ) { + throw new PDJError("Object type for setter and getter is not the same"); + } + + } + + private char mapType(Class clz) { + if ( clz == Integer.TYPE ) + return 'i'; + if ( clz == int[].class ) + return 'I'; + if ( clz == Float.TYPE ) + return 'f'; + if ( clz == float[].class ) + return 'F'; + if ( clz == Double.TYPE ) + return 'd'; + if ( clz == double[].class ) + return 'D'; + if ( clz == Boolean.TYPE ) + return 'z'; + if ( clz == Boolean[].class ) + return 'Z'; + if ( clz == Byte.TYPE ) + return 'b'; + if ( clz == byte[].class ) + return 'B'; + if ( clz == Character.TYPE ) + return 'c'; + if ( clz == char[].class ) + return 'C'; + if ( clz == Short.TYPE ) + return 's'; + if ( clz == short[].class ) + return 'S'; + if ( clz == String.class ) + return 'g'; + if ( clz == String[].class ) + return 'G'; + if ( clz == Atom.class ) + return 'a'; + if ( clz == Atom[].class ) + return 'A'; + return '-'; + } + + private void fieldSetter(Atom[] value) throws Exception { + Object work; + int i; + + switch ( type ) { + case 'z' : + field.setBoolean(obj, value[0].toBoolean()); + break; + case 'Z' : + work = field.get(obj); + for (i=0;i<value.length;i++) + Array.setBoolean(work, i, value[i].toBoolean()); + break; + case 'f' : + field.setFloat(obj, value[0].toFloat()); + break; + case 'F' : + work = field.get(obj); + for (i=0;i<value.length;i++) + Array.setFloat(work, i, value[i].toFloat()); + break; + case 'i' : + field.setInt(obj, value[0].toInt()); + break; + case 'I' : + work = field.get(obj); + for (i=0;i<value.length;i++) + Array.setInt(work, i, value[i].toInt()); + break; + case 'd' : + field.setDouble(obj, value[0].toDouble()); + break; + case 'D' : + work = field.get(obj); + for (i=0;i<value.length;i++) + Array.setDouble(work, i, value[i].toDouble()); + break; + case 'b' : + field.setByte(obj, value[0].toByte()); + break; + case 'B' : + work = field.get(obj); + for (i=0;i<value.length;i++) + Array.setByte(work, i, value[i].toByte()); + break; + case 'c' : + field.setChar(obj, value[0].toChar()); + break; + case 'C' : + work = field.get(obj); + for (i=0;i<value.length;i++) + Array.setChar(work, i, value[i].toChar()); + break; + case 's' : + field.setShort(obj, value[0].toShort()); + break; + case 'S' : + work = field.get(obj); + for (i=0;i<value.length;i++) + Array.setShort(work, i, value[i].toShort()); + break; + case 'g' : + field.set(obj, value.toString()); + break; + case 'G' : + work = field.get(obj); + for (i=0;i<value.length;i++) + Array.set(work, i, value[i].toString()); + break; + case 'a' : + field.set(obj, value[0]); + break; + case 'A' : + field.set(obj, value); + break; + default: + throw new PDJError("Unable to pass attribute value"); + } + } + + private Atom[] fieldGetter() throws Exception { + Object array = null; + Atom[] ret; + int i; + + if ( isArray ) { + ret = new Atom[1]; + } else { + array = field.get(obj); + ret = new Atom[Array.getLength(array)]; + } + + switch ( type ) { + case 'z' : + ret[0] = Atom.newAtom(field.getBoolean(obj)); + break; + case 'Z' : + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(Array.getBoolean(array, i)); + break; + case 'f' : + ret[0] = Atom.newAtom(field.getFloat(obj)); + break; + case 'F' : + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(Array.getFloat(array, i)); + break; + case 'i' : + ret[0] = Atom.newAtom(field.getInt(obj)); + break; + case 'I' : + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(Array.getInt(array, i)); + break; + case 'd' : + ret[0] = Atom.newAtom(field.getDouble(obj)); + break; + case 'D' : + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(Array.getDouble(array, i)); + break; + case 'b' : + ret[0] = Atom.newAtom(field.getByte(obj)); + break; + case 'B' : + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(Array.getByte(array, i)); + break; + case 'c' : + ret[0] = Atom.newAtom(field.getChar(obj)); + break; + case 'C' : + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(Array.getChar(array, i)); + break; + case 's' : + ret[0] = Atom.newAtom(field.getShort(obj)); + break; + case 'S' : + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(Array.getShort(array, i)); + break; + case 'g' : + ret[0] = Atom.newAtom((String) field.get(obj)); + break; + case 'G' : + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom((String) Array.get(array, i)); + break; + case 'a' : + ret[0] = (Atom) field.get(obj); + break; + case 'A' : + for (i=0;i<ret.length;i++) + ret[i] = (Atom) Array.get(array, i); + break; + default: + throw new PDJError("Unable to pass attribute value"); + } + + return ret; + } + + private Atom[] methodGetter() throws Exception { + Object array = null; + Atom[] ret; + int i; + + if ( isArray ) { + ret = new Atom[1]; + } else { + array = field.get(obj); + ret = new Atom[Array.getLength(array)]; + } + + switch ( type ) { + case 'z' : + ret[0] = Atom.newAtom(((Boolean)getter.invoke(obj, null)).booleanValue()); + break; + case 'Z' : + boolean tmpz[] = (boolean[]) getter.invoke(obj, null); + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(tmpz[i]); + break; + case 'f' : + ret[0] = Atom.newAtom(((Float)getter.invoke(obj, null)).floatValue()); + break; + case 'F' : + float tmpf[] = (float[]) getter.invoke(obj, null); + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(tmpf[i]); + break; + case 'i' : + ret[0] = Atom.newAtom(((Integer)getter.invoke(obj, null)).intValue()); + break; + case 'I' : + int tmpi[] = (int[]) getter.invoke(obj, null); + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(tmpi[i]); + break; + case 'd' : + ret[0] = Atom.newAtom(((Double)getter.invoke(obj, null)).doubleValue()); + break; + case 'D' : + double tmpd[] = (double[]) getter.invoke(obj, null); + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(tmpd[i]); + break; + case 'b' : + ret[0] = Atom.newAtom(((Byte)getter.invoke(obj, null)).byteValue()); + break; + case 'B' : + byte tmpb[] = (byte[]) getter.invoke(obj, null); + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(tmpb[i]); + break; + case 'c' : + ret[0] = Atom.newAtom(((Character)getter.invoke(obj, null)).charValue()); + break; + case 'C' : + char tmpc[] = (char[]) getter.invoke(obj, null); + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(tmpc[i]); + break; + case 's' : + ret[0] = Atom.newAtom(((Short)getter.invoke(obj, null)).shortValue()); + break; + case 'S' : + short tmps[] = (short[]) getter.invoke(obj, null); + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom(tmps[i]); + break; + case 'g' : + ret[0] = Atom.newAtom((String) getter.invoke(obj, null)); + break; + case 'G' : + for (i=0;i<ret.length;i++) + ret[i] = Atom.newAtom((String) Array.get(array, i)); + break; + case 'a' : + ret[0] = (Atom) getter.invoke(obj, null); + break; + case 'A' : + ret = (Atom []) getter.invoke(obj, null); + break; + default: + throw new PDJError("Unable to pass attribute value"); + } + + return ret; + } + + private Object setterCast(Atom values[]) throws Exception { + int i; + + switch ( type ) { + case 'z' : + return new Boolean(values[0].toBoolean()); + case 'Z' : + boolean tmpz[] = new boolean[values.length]; + for (i=0;i<values.length; i++) + tmpz[i] = values[i].toBoolean(); + return tmpz; + case 'f' : + return new Float(values[0].toFloat()); + case 'F' : + float tmpf[] = new float[values.length]; + for (i=0;i<values.length; i++) + tmpf[i] = values[i].toFloat(); + return tmpf; + case 'i' : + return new Integer(values[0].toInt()); + case 'I' : + int tmpi[] = new int[values.length]; + for (i=0;i<values.length; i++) + tmpi[i] = values[i].toInt(); + return tmpi; + case 'd' : + return new Double(values[0].toDouble()); + case 'D' : + double tmpd[] = new double[values.length]; + for (i=0;i<values.length; i++) + tmpd[i] = values[i].toDouble(); + return tmpd; + case 'b' : + return new Byte(values[0].toByte()); + case 'B' : + byte tmpb[] = new byte[values.length]; + for (i=0;i<values.length; i++) + tmpb[i] = values[i].toByte(); + return tmpb; + case 'c' : + return new Character(values[0].toChar()); + case 'C' : + char tmpc[] = new char[values.length]; + for (i=0;i<values.length; i++) + tmpc[i] = values[i].toChar(); + return tmpc; + case 's' : + return new Short(values[0].toShort()); + case 'S' : + short tmps[] = new short[values.length]; + for (i=0;i<values.length; i++) + tmps[i] = values[i].toShort(); + return tmps; + case 'g' : + return values[0].toString(); + case 'G' : + String tmpg[] = new String[values.length]; + for (i=0;i<values.length;i++) + tmpg[i] = values[0].toString(); + return tmpg; + case 'a' : + return values[0]; + case 'A' : + return values; + default: + throw new PDJError("Unable to pass attribute value"); + } + } + + Atom[] get() { + try { + if ( getter == null ) + return fieldGetter(); + return methodGetter(); + } catch ( Exception e ){ + throw new PDJError(e); + } + } + + void set(Atom values[]) { + if ( readOnly ) + throw new PDJError("Field is readonly"); + + try { + if ( setter == null ) + fieldSetter(values); + else + setter.invoke(obj, new Object[] { setterCast(values) }); + } catch (Exception e) { + throw new PDJError(e); + } + } + +}
Added: vendor/pdj/current/src/java/com/cycling74/max/Callback.java =================================================================== --- vendor/pdj/current/src/java/com/cycling74/max/Callback.java (rev 0) +++ vendor/pdj/current/src/java/com/cycling74/max/Callback.java 2008-03-22 02:13:11 UTC (rev 9619) @@ -0,0 +1,213 @@ +package com.cycling74.max; + +import java.lang.reflect.*; + +/** + * Used to transform a java method into an Executable object. This + * simplify the job of always implementing the executable + * interface on all your objects since you can define it dynamically + * with this class. + * <p><blockquote><pre> + * + * class Myclass { + * public void doit() { + * do_something_fun() + * } + * } + * + * ... + * + * Myclass myclass = new Myclass(); + * Executable e = new Callback(myclass, "doit"); + * MaxClock clock = new MaxClock(e); + * + * </pre></blockquote></p> + */ +public class Callback implements Executable { + private Method method; + private String methodName; + private Object obj; + private Object args[]; + + /** + * Will call method <i>methodName</i> with no argument by using execute() + * @param obj the object with the method + * @param methodName the name of the method + */ + public Callback(Object obj, String methodName) { + this(obj, methodName, null, null); + } + + /** + * Will call method <i>methodName</i> with a int by using execute() + * @param obj the object with the method + * @param methodName the name of the method + * @param i the int value + */ + public Callback(Object obj, String methodName, int i) { + this(obj, methodName, new Object[] { new Integer(i) }, new Class[] { Integer.TYPE }); + } + + /** + * Will call method <i>methodName</i> with a float by using execute() + * @param obj the object with the method + * @param methodName the name of the method + * @param f the float value + */ + public Callback(Object obj, String methodName, float f) { + this(obj, methodName, new Object[] { new Float(f) }, new Class[] { Float.TYPE }); + } + + /** + * Will call method <i>methodName</i> with a Stringt by using execute() + * @param obj the object with the method + * @param methodName the name of the method + * @param str the string value + */ + public Callback(Object obj, String methodName, String str) { + this(obj, methodName, new Object[] { str }); + } + + /** + * Will call method <i>methodName</i> with a boolean by using execute() + * @param obj the object with the method + * @param methodName the name of the method + * @param flag the boolean value + */ + public Callback(Object obj, String methodName, boolean flag) { + this(obj, methodName, new Object[] { flag ? Boolean.TRUE : Boolean.FALSE });
@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.