From a764e59e1d3a8e330f0d484fdb26b35ca3f0b2e4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 22 Mar 2008 02:15:12 +0000 Subject: bringing pdj-0.8.3 into the main branch svn path=/trunk/externals/loaders/pdj/; revision=9621 --- src/MSPBuffer.c | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 src/MSPBuffer.c (limited to 'src/MSPBuffer.c') diff --git a/src/MSPBuffer.c b/src/MSPBuffer.c new file mode 100644 index 0000000..084fdf3 --- /dev/null +++ b/src/MSPBuffer.c @@ -0,0 +1,159 @@ +#include "native_classes.h" +#include "type_handler.h" +#include "pdj.h" + + +static t_garray *getArray(JNIEnv *env, jstring name) { + t_symbol *s = jstring2symbol(env, name); + t_garray *ret = (t_garray *)pd_findbyclass(s, garray_class); + + if ( ret == NULL ) { + post("pdj: array %s not found", s->s_name); + return NULL; + } + + return ret; +} + + +JNIEXPORT jlong JNICALL Java_com_cycling74_msp_MSPBuffer_getSize + (JNIEnv *env, jclass cls, jstring name) { + t_garray *array = getArray(env, name); + + if ( array == NULL ) + return -1; + + return garray_npoints(array); +} + + +JNIEXPORT jfloatArray JNICALL Java_com_cycling74_msp_MSPBuffer_peek + (JNIEnv *env , jclass cls, jstring name) { + t_garray *array = getArray(env, name); + t_sample *vec; + jfloatArray ret; + int size; + + if ( array == NULL ) + return NULL; + + if ( ! garray_getfloatarray(array, &size, &vec) ) + return NULL; + + ret = (*env)->NewFloatArray(env, size); + + if ( ret == NULL ) { + SHOWEXC; + return NULL; + } + + (*env)->SetFloatArrayRegion(env, ret, 0, size, (jfloat *) vec); + + return ret; +} + + +JNIEXPORT void JNICALL Java_com_cycling74_msp_MSPBuffer_poke + (JNIEnv *env, jclass cls, jstring name, jfloatArray values) { + t_garray *array = getArray(env, name); + t_sample *vec; + jsize jarray_length; + int size; + + if ( array == NULL ) + return; + + if ( ! garray_getfloatarray(array, &size, &vec) ) + return; + + jarray_length = (*env)->GetArrayLength(env, values); + + if ( jarray_length < size ) { + error("pdj: warning: array too short"); + } else { + size = jarray_length; + } + + (*env)->GetFloatArrayRegion(env, values, 0, size, vec); + garray_redraw(array); +} + + +JNIEXPORT void JNICALL Java_com_cycling74_msp_MSPBuffer_setSize + (JNIEnv *env, jclass cls, jstring name, jint channel, jlong size) { + t_garray *array = getArray(env, name); + + if ( array == NULL ) + return; + + garray_resize(array, size); +} + + +JNIEXPORT jfloatArray JNICALL Java_com_cycling74_msp_MSPBuffer_getArray + (JNIEnv *env, jclass cls, jstring name, jlong from, jlong arraySize) { + t_garray *array = getArray(env, name); + t_sample *vec; + jfloatArray ret; + int size, ifrom = (int) from, iarraySize = (int) arraySize; + + if ( array == NULL ) + return NULL; + + if ( ! garray_getfloatarray(array, &size, &vec) ) + return NULL; + + if ( iarraySize != -1 ) { + if ( size < ifrom ) { + error("pdj: array is shorter than the starting point"); + return NULL; + } + + if ( size < ifrom + iarraySize ) { + error("pdj: array is not big enough to fill the array"); + return NULL; + } + size = iarraySize; + } + + ret = (*env)->NewFloatArray(env, size); + if ( ret == NULL ) { + SHOWEXC; + return NULL; + } + + vec += ifrom; + (*env)->SetFloatArrayRegion(env, ret, 0, size, (jfloat *) vec); + + return ret; +} + + +JNIEXPORT void JNICALL Java_com_cycling74_msp_MSPBuffer_setArray + (JNIEnv *env, jclass cls, jstring name, jlong from, jfloatArray values) { + t_garray *array = getArray(env, name); + t_sample *vec; + jsize jarray_length; + int size, ifrom = from; + + if ( array == NULL ) + return; + + if ( ! garray_getfloatarray(array, &size, &vec) ) + return; + + if ( size < from ) { + error("pdj: array too short from starting point"); + return; + } + jarray_length = (*env)->GetArrayLength(env, values); + + if ( jarray_length + ifrom > size ) { + error("pdj: warning: array too short from java array size"); + return; + } + + vec += from; + (*env)->GetFloatArrayRegion(env, values, 0, jarray_length, vec); + garray_redraw(array); +} -- cgit v1.2.1