示例#1
0
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;
}
示例#2
0
文件: PdBase.cpp 项目: EQ4/PdPulpito
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;
}