aboutsummaryrefslogtreecommitdiff
path: root/src/MaxClock.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/MaxClock.c')
-rw-r--r--src/MaxClock.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/MaxClock.c b/src/MaxClock.c
new file mode 100644
index 0000000..e7e5886
--- /dev/null
+++ b/src/MaxClock.c
@@ -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);
+}