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; }
//---------------------------------------------------------- int PdBase::arraySize(const std::string& arrayName) { int len = libpd_arraysize(arrayName.c_str());; if(len < 0) { cerr << "Pd: Cannot get size of unknown array \"" << arrayName << "\"" << endl; return 0; } return len; }
JNIEXPORT jint JNICALL Java_org_puredata_core_PdBase_arraySize (JNIEnv *env, jclass cls, jstring jname) { if (!jname) return -2; const char *cname = (char *) (*env)->GetStringUTFChars(env, jname, NULL); pthread_mutex_lock(&mutex); int result = libpd_arraysize(cname); pthread_mutex_unlock(&mutex); (*env)->ReleaseStringUTFChars(env, jname, cname); 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; } }
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; }