aboutsummaryrefslogtreecommitdiff
path: root/src/pdj.h
blob: d318dedc3daaf0b2024fa56f6b77e59af2ca38dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <jni.h>
#include <m_pd.h>

#ifdef DEBUG
   #define ASSERT(v) { if ( v == NULL ) {bug("ouch, assertion failed %s:%d\n", __FILE__, __LINE__);}}
   #define JASSERT(v) { if ( v == NULL ){(*env)->ExceptionDescribe(env);bug("ouch, assertion failed %s:%d\n", __FILE__, __LINE__);}}
   #undef  DEBUG
   #define DEBUG(X) {X};
#else 
   #define ASSERT(v)
   #define DEBUG(X)
   #define JASSERT(v)
#endif

#define SHOWEXC { if ((*env)->ExceptionOccurred(env)) (*env)->ExceptionDescribe(env); } 

#ifdef PROFILER
	#define PROF(v) { v }
#else
	#define PROF(v)
#endif

#ifdef MSW
	#define DIR_SEP "\\"
	#define PATH_SEP ";"
#else 
	#define DIR_SEP "/"
	#define PATH_SEP ":"
#endif

// the JVM takes 50M; I don't care taking 4K...
#define BUFFER_SIZE 4096

// MAXIMUM atom[x] size for type casting from jatoms to atoms
#define MAX_ATOMS_STACK 32

typedef struct PdjCaching {
	jclass      cls_Atom;
	jclass		cls_AtomString;
	jclass		cls_AtomFloat;
	jclass      cls_MaxClock;
	jclass		cls_MaxObject;
	jclass      cls_MSPObject;
	jclass		cls_MSPSignal;
	jmethodID   MIDAtom_newAtom_String;
	jmethodID   MIDAtom_newAtom_Float;
	jmethodID   MIDMaxObject_trySetter;
	jmethodID	MIDMSPObject_dspinit;
	jmethodID	MIDMSPObject_emptyPerformer;
	jfieldID	FIDAtom_type;
	jfieldID    FIDMaxObject_pdobj_ptr;
	jfieldID	FIDMaxObject_activity_inlet;
	jfieldID    FIDMaxClock_clock_ptr;
	jfieldID	FIDAtomFloat_value;
	jfieldID    FIDAtomString_value;
	jfieldID    FIDMSPObject_used_inputs;
	jfieldID    FIDMSPObject_used_outputs;
	jfieldID	FIDMSPSignal_vec;
} PdjCaching;
extern PdjCaching pdjCaching;

typedef struct _pdjcached_sym {
	t_symbol *sym;
	jmethodID mid;
	int arged;
	struct _pdjcached_sym *next;
} t_pdjcached_sym;

extern t_class *pdj_class;
typedef struct _pdj {
    t_object x_obj;
    char *jobject_name;
    int nb_inlet;
    char *patch_path;
    
    /* already resolved symbol to method id */
    t_pdjcached_sym *cache;
    
    /* java object instance and class definition */
    jobject obj;
    jclass  cls;
    
    /* object method binder */
    jmethodID MIDbang;
    jmethodID MIDfloat;
    jmethodID MIDint;
    jmethodID MIDlist;
    jmethodID MIDanything;
} t_pdj;

extern t_class *pdj_tilde_class;
typedef struct _pdj_tilde {
	t_pdj    pdj;
	t_sample _dummy_f;    

	/* performer method */	
    jmethodID performer;
    
    /* pointer to private field _used_inputs/outputs */
    jobject	_used_inputs;
    jobject	_used_outputs;

    /* C array to the java float vector */
    jobject	*ins;
    jobject	*outs;

    int	ins_count;
    int	outs_count;
    
    /* number of arguments sended to the performer */
    int	argc;
} t_pdj_tilde;

extern t_class *inlet_proxy;
typedef struct _inlet_proxy {
	t_object x_obj;
	t_pdj *peer;
	int idx;
} t_inlet_proxy;


typedef int JNICALL JNI_CreateJavaVM_func(JavaVM**, JNIEnv**, JavaVMInitArgs*);
int getuglylibpath(char *path);
JNI_CreateJavaVM_func *linkjvm(char *vm_type);
char *pdj_getProperty(char *name);

JNIEnv *init_jvm();

void *pdj_new(t_symbol *s, int argc, t_atom *argv);
void pdj_free(t_pdj *obj);

void pdj_tilde_dsp(t_pdj_tilde *obj, t_signal **sp);
void *pdj_tilde_new(t_symbol *s, int argc, t_atom *argv);
void pdj_tilde_free(t_pdj_tilde *pdjt);

JNIEnv *pdjAttachVM();
void pdjDetachVM(JNIEnv *env);

extern int REDIRECT_PD_IO;
extern JavaVM *jni_jvm;