aboutsummaryrefslogtreecommitdiff
path: root/src/MaxClock.c
blob: c5694fdb898df90cca97db2ad1de2f300c3727fd (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
#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 *) JPOINTER_CAST (*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);
}