JNIEXPORT jint JNICALL Java_org_puredata_core_PdBase_readArrayNative (JNIEnv *env, jclass cls, jfloatArray jdest, jint destOffset, jstring jsrc, jint srcOffset, jint n) { if (!jdest || !jsrc) return -3; float *pdest = (*env)->GetFloatArrayElements(env, jdest, NULL); const char *csrc = (char *) (*env)->GetStringUTFChars(env, jsrc, NULL); pthread_mutex_lock(&mutex); int result = libpd_read_array(pdest + destOffset, csrc, srcOffset, n); pthread_mutex_unlock(&mutex); (*env)->ReleaseStringUTFChars(env, jsrc, csrc); (*env)->ReleaseFloatArrayElements(env, jdest, pdest, 0); return result; }
bool PdBase::readArray(const std::string& arrayName, std::vector<float>& dest, int readLen, int offset) { _LOCK(); int arrayLen = libpd_arraysize(arrayName.c_str()); _UNLOCK(); if(arrayLen < 0) { cerr << "Pd: Cannot read unknown array \"" << arrayName << "\"" << endl; return false; } // full array len? if(readLen < 0) { readLen = arrayLen; } // check read len else if(readLen > arrayLen) { cerr << "Pd: Given read len " << readLen << " > len " << arrayLen << " of array \"" << arrayName << "\"" << endl; return false; } // check offset if(offset+readLen > arrayLen) { cerr << "Pd: Given read len and offset > len " << readLen << " of array \"" << arrayName << "\"" << endl; return false; } // resize if necessary if(dest.size() != readLen) { dest.resize(readLen, 0); } _LOCK(); if(libpd_read_array(&dest[0], arrayName.c_str(), offset, readLen) < 0) { cerr << "Pd: libpd_read_array failed for array \"" << arrayName << "\"" << endl; _UNLOCK(); return false; } _UNLOCK(); return true; }