Window::Window() { ap = new audioProcessor(); ap->setFrameLength(256); // Default vector size for Pd is 64. // We are calling libpd_process_float with 4 * 64 samples in "audiooutput.c". // creating our GUI controls createPureDataControls("Pure Data Controls"); createPortaudioControls(tr("Portaudio Controls")); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(portaudioControlsGroup); layout->addWidget(pureDataControlsGroup); setLayout(layout); libpd_banghook = (t_libpd_banghook) Window::bangpd; // binding the function bangpd to receive bangs from our pd patchers libpd_printhook = (t_libpd_printhook) Window::printpd; // binding printpd libpd_init(); libpd_init_audio(0, 2, 44100); // 0 inputs, 2 outputs, we should adjust this (also for portaudio) every time we change the input or output device // and load a corresponding output patch, in this example it is statically set to 2 outputs and 0 inputs QString path = QCoreApplication::applicationDirPath(); libpd_openfile("puredata/stereoout.pd", path.toLatin1()); // loading an output patcher with 2 outputs libpd_openfile("puredata/firstpatcher.pd", path.toLatin1()); libpd_openfile("puredata/secondpatcher.pd", path.toLatin1()); // preloads the playback patchers, dynamically loading patchers seemed a little unstable on os x libpd_bind("playfinishedfirst"); // binding the pd patcher send "playfinishedfirst" to our libpd_banghook, libpd_printhook etc.. libpd_bind("playfinishedsecond"); // same for the send object "playfinishedsecond" setWindowTitle(tr("Libpd, Portaudio and Qt Test Project")); Window::globalWindow = this; // binding a static window to our window object in order to access our instance from bangpd and printpd }
JNIEXPORT jlong JNICALL Java_org_puredata_core_PdBase_bindSymbol (JNIEnv *env, jclass cls, jstring jsym) { if (!jsym) return 0; const char *csym = (char *) (*env)->GetStringUTFChars(env, jsym, NULL); pthread_mutex_lock(&mutex); jlong ptr = (jlong) libpd_bind(csym); pthread_mutex_unlock(&mutex); (*env)->ReleaseStringUTFChars(env, jsym, csym); return ptr; // very naughty, returning a pointer to Java // using long integer in case we're on a 64bit CPU }
//---------------------------------------------------------- void PdBase::subscribe(const std::string& source) { if(exists(source)) { cerr << "Pd: unsubscribe: ignoring duplicate source" << endl; return; } void* pointer = libpd_bind(source.c_str()); if(pointer != NULL) { map<string,void*>& sources = PdContext::instance().sources; sources.insert(pair<string,void*>(source, pointer)); } }