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
|
#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);
}
|