aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xclr.c71
-rwxr-xr-xexternal/External.cs6
-rwxr-xr-xpd/Atom.cs6
-rwxr-xr-xpd/pd.cs7
4 files changed, 72 insertions, 18 deletions
diff --git a/clr.c b/clr.c
index 8f5e3b3..a699f03 100755
--- a/clr.c
+++ b/clr.c
@@ -106,17 +106,20 @@ static void mono_initialize()
}
// load the variables and init mono
-static void mono_load(t_clr *x)
+static void mono_load(t_clr *x, int argc, t_atom *argv)
{
// const char *file="D:\\Davide\\cygwin\\home\\Davide\\externalTest1.dll";
//const char *file="External.dll";
MonoMethod *m = NULL, *ctor = NULL, *fail = NULL, *mvalues;
+ MonoClassField *classPointer;
gpointer iter;
- gpointer args [1];
+ gpointer *args;
int val;
- int i;
-
+ int i,j;
+ int params;
+ t_symbol *strsymbol;
+ atom_simple *listparams;
if (x->loaded == 0)
{
@@ -167,7 +170,13 @@ static void mono_load(t_clr *x)
return;
}
x->obj = mono_object_new (x->domain, x->klass);
- mono_runtime_object_init (x->obj);
+
+ //mono_runtime_object_init (x->obj);
+
+ if (argc>2)
+ params = argc - 2;
+ else
+ params = 0;
/* retrieve all the methods we need */
iter = NULL;
@@ -185,25 +194,63 @@ static void mono_load(t_clr *x)
* as you see a contrsuctor is a method like any other.
*/
MonoMethodSignature * sig = mono_method_signature (m);
- if (mono_signature_get_param_count (sig) == 2) {
+ if (mono_signature_get_param_count (sig) == params) {
ctor = m;
}
}
}
-
+ // set the pointer
+ classPointer = 0;
+ classPointer = mono_class_get_field_from_name (x->klass, "x");
+ if (classPointer)
+ {
+ mono_field_set_value (x->obj, classPointer, &x);
+
+ } else
+ {
+ error("could not find the x field in %s, it is needed!", x->assemblyname->s_name);
+ return;
+ }
// call the base functions
if (x->setUp)
{
- val = x;
- args [0] = &val;
- mono_runtime_invoke (x->setUp, x->obj, args, NULL);
+ mono_runtime_invoke (x->setUp, x->obj, NULL, NULL);
post("SetUp() invoked");
-
} else
{
error("clr: the provided assembly is not valid! the SetUp function is missing");
return;
}
+ // now call the class constructor
+ if (ctor)
+ {
+ args = malloc(sizeof(gpointer)*params);
+ listparams = malloc(sizeof(atom_simple)*params);
+ for (j=2; j<argc; j++)
+ {
+ switch ((argv+j)->a_type)
+ {
+ case A_FLOAT:
+ listparams[j-2].a_type = A_S_FLOAT;
+ listparams[j-2].float_value = (double) atom_getfloat(argv+j);
+ args[j-2] = &(listparams[j-2].float_value);
+ break;
+ case A_SYMBOL:
+ listparams[j-2].a_type = A_S_SYMBOL;
+ strsymbol = atom_getsymbol(argv+j);
+ listparams[j-2].string_value = mono_string_new (x->domain, strsymbol->s_name);
+ args[j-2] = listparams[j-2].string_value;
+ break;
+ }
+ }
+ mono_runtime_invoke (ctor, x->obj, args, NULL);
+ free(listparams);
+ free(args);
+ } else
+ {
+ error("%s doesn't have a constructor with %i parameters!",x->assemblyname->s_name, params);
+ }
+
// all done without errors
x->loaded = 1;
@@ -669,7 +716,7 @@ printf(" used did not specified filename, I guess it is %s\n", strtmp);
}
// load mono, init the needed vars
- mono_load(x);
+ mono_load(x, argc, argv);
return (x);
}
diff --git a/external/External.cs b/external/External.cs
index ace63a3..00947db 100755
--- a/external/External.cs
+++ b/external/External.cs
@@ -9,15 +9,11 @@ namespace PureData
public External()
{
- x = IntPtr.Zero;
}
// this function MUST exist
- public void SetUp(IntPtr pdClass)
+ public void SetUp()
{
- // you must assign pdclass to x !
- x = pdClass;
-
// now you can do what you like...
Console.WriteLine("pointer set!");
Console.WriteLine("setting selectors..");
diff --git a/pd/Atom.cs b/pd/Atom.cs
index 7e0affa..17c7183 100755
--- a/pd/Atom.cs
+++ b/pd/Atom.cs
@@ -18,6 +18,12 @@ namespace PureData
this.float_value = f;
this.string_value = "float";
}
+ public Atom(int i)
+ {
+ this.type = AtomType.Float;
+ this.float_value = (float) i;
+ this.string_value = "float";
+ }
public Atom(string s)
{
this.type = AtomType.Symbol;
diff --git a/pd/pd.cs b/pd/pd.cs
index a94b9f1..a0f28aa 100755
--- a/pd/pd.cs
+++ b/pd/pd.cs
@@ -25,7 +25,12 @@ namespace PureData
{
ToOutlet (x, outlet, atoms.Length, atoms);
}
-
+ public static void SendToOutlet (IntPtr x, int outlet, Atom atom)
+ {
+ Atom [] atoms = new Atom[1];
+ atoms[0] = atom;
+ ToOutlet (x, outlet, atoms.Length, atoms);
+ }
// create an outlet
[MethodImplAttribute (MethodImplOptions.InternalCall)]
private extern static void CreateOutlet (IntPtr x, int type);