bool PdBase::writeArray(const std::string& arrayName, std::vector<float>& source, int writeLen, int offset) { int arrayLen = libpd_arraysize(arrayName.c_str()); if(arrayLen < 0) { cerr << "Pd: Cannot write to unknown array \"" << arrayName << "\"" << endl; return false; } // full array len? if(writeLen < 0) { writeLen = arrayLen; } // check write len else if(writeLen > arrayLen) { cerr << "Pd: Given write len " << writeLen << " > len " << arrayLen << " of array \"" << arrayName << "\"" << endl; return false; } // check offset if(offset+writeLen > arrayLen) { cerr << "Pd: Given write len and offset > len " << writeLen << " of array \"" << arrayName << "\"" << endl; return false; } if(libpd_write_array(arrayName.c_str(), offset, &source[0], writeLen) < 0) { cerr << "Pd: libpd_write_array failed for array \"" << arrayName << "\"" << endl; return false; } return true; }
JNIEXPORT jint JNICALL Java_org_puredata_core_PdBase_writeArrayNative (JNIEnv *env, jclass cls, jstring jdest, jint destOffset, jfloatArray jsrc, jint srcOffset, jint n) { if (!jdest || !jsrc) return -3; float *psrc = (*env)->GetFloatArrayElements(env, jsrc, NULL); const char *cdest = (char *) (*env)->GetStringUTFChars(env, jdest, NULL); pthread_mutex_lock(&mutex); int result = libpd_write_array(cdest, destOffset, psrc + srcOffset, n); pthread_mutex_unlock(&mutex); (*env)->ReleaseStringUTFChars(env, jdest, cdest); (*env)->ReleaseFloatArrayElements(env, jsrc, psrc, 0); return result; }
void PdBase::clearArray(const std::string& arrayName, int value) { int arrayLen = libpd_arraysize(arrayName.c_str()); if(arrayLen < 0) { cerr << "Pd: Cannot clear unknown array \"" << arrayName << "\"" << endl; return; } std::vector<float> array; array.resize(arrayLen, value); if(libpd_write_array(arrayName.c_str(), 0, &array[0], arrayLen) < 0) { cerr << "Pd: libpd_write_array failed while clearing array \"" << arrayName << "\"" << endl; } }