diff --git a/build/Release64/Pd_Chunks-test/Pd_Chunks-test.pd b/build/Release64/Pd_Chunks-test/Pd_Chunks-test.pd index 2f2a958..9373684 100644 --- a/build/Release64/Pd_Chunks-test/Pd_Chunks-test.pd +++ b/build/Release64/Pd_Chunks-test/Pd_Chunks-test.pd @@ -17,11 +17,11 @@ #X msg 277 42 set \$1; #X text 355 117 range is 0..1; #X obj 498 10 r rvstplugname; -#X symbolatom 498 48 17 0 0 0 - - - 0; +#X symbolatom 498 42 26 0 0 0 - - - 0; #X obj 516 102 r rvstdata; -#X symbolatom 516 136 17 0 0 0 - - - 0; #X obj 516 265 s svstdata; -#X msg 547 216 symbol hello\ world\ 2; +#X obj 516 134 print; +#X msg 516 233 test 1.3 hello 0.3 2; #X connect 0 0 7 0; #X connect 0 1 6 0; #X connect 1 0 2 0; @@ -39,5 +39,5 @@ #X connect 14 0 10 0; #X connect 15 0 14 0; #X connect 17 0 18 0; -#X connect 19 0 20 0; -#X connect 22 0 21 0; +#X connect 19 0 21 0; +#X connect 22 0 20 0; diff --git a/vst-scheduler/vstschedlib.c b/vst-scheduler/vstschedlib.c index c88c05d..fd74892 100644 --- a/vst-scheduler/vstschedlib.c +++ b/vst-scheduler/vstschedlib.c @@ -205,17 +205,53 @@ int setPdvstPlugName(char* instanceName) return 0; } -int setPdvstChunk(char* instanceName) + +/*receive data chunk from host*/ +int setPdvstChunk(const char *amsg) { t_symbol *tempSym; tempSym = gensym("rvstdata"); + if (tempSym->s_thing) { - pd_symbol(tempSym->s_thing, gensym(instanceName)); - return 1; - } + size_t len = strlen(amsg); + t_binbuf* bbuf = binbuf_new(); + binbuf_text(bbuf, amsg, len); + + int msg, natom = binbuf_getnatom(bbuf); + t_atom *at = binbuf_getvec(bbuf); + + for (msg = 0; msg < natom;) { + int emsg; + for (emsg = msg; emsg < natom && at[emsg].a_type != A_COMMA + && at[emsg].a_type != A_SEMI; emsg++); + if (emsg > msg) { + int i; + /* check for illegal atoms */ + for (i = msg; i < emsg; i++) + if (at[i].a_type == A_DOLLAR || at[i].a_type == A_DOLLSYM) { + pd_error(NULL, "rvstdata: got dollar sign in message"); + goto nodice; + } + + if (at[msg].a_type == A_FLOAT) { + if (emsg > msg + 1) + pd_list(tempSym->s_thing, 0, emsg-msg, at + msg); + else pd_float(tempSym->s_thing, at[msg].a_w.w_float); + } + else if (at[msg].a_type == A_SYMBOL) { + pd_anything(tempSym->s_thing, at[msg].a_w.w_symbol, emsg-msg-1, at + msg + 1); + } + } + nodice: + msg = emsg + 1; + } + + binbuf_free(bbuf); + return 1; + } else - return 0; + return 0; } @@ -250,15 +286,31 @@ void sendPdVstFloatParameter(t_vstParameterReceiver *x, t_float floatValue) ReleaseMutex(pdvstTransferMutex); } -void sendPdVstChunk(t_vstChunkReceiver *x, t_symbol *sym) +/*send data chunk to host*/ +void sendPdVstChunk(t_vstChunkReceiver *x, t_symbol *s, int argc, t_atom *argv) { - + char *buf; + int length; + t_atom at; + t_binbuf*bbuf = binbuf_new(); + + memset(&pdvstData->datachunk.value.stringData, '\0', MAXSTRINGSIZE); + + SETSYMBOL(&at, s); + binbuf_add(bbuf, 1, &at); + binbuf_add(bbuf, argc, argv); + binbuf_gettext(bbuf, &buf, &length); + binbuf_free(bbuf); + WaitForSingleObject(pdvstTransferMutex, INFINITE); pdvstData->datachunk.type = STRING_TYPE; pdvstData->datachunk.direction = PD_SEND; pdvstData->datachunk.updated = 1; - strcpy(pdvstData->datachunk.value.stringData,sym->s_name); + strcpy(pdvstData->datachunk.value.stringData,buf); + //memcpy(pdvstData->datachunk.value.stringData, buf, length); ReleaseMutex(pdvstTransferMutex); + + freebytes(buf, length+1); } void sendPdVstGuiName(t_vstGuiNameReceiver *x, t_symbol *symbolValue) @@ -268,9 +320,7 @@ void sendPdVstGuiName(t_vstGuiNameReceiver *x, t_symbol *symbolValue) pdvstData->guiName.direction = PD_SEND; pdvstData->guiName.updated = 1; strcpy(pdvstData->guiName.value.stringData,symbolValue->s_name); - ReleaseMutex(pdvstTransferMutex); - } void makePdvstParameterReceivers() @@ -292,20 +342,14 @@ void makePdvstGuiNameReceiver() { vstGuiNameReceiver = (t_vstGuiNameReceiver *)pd_new(vstGuiNameReceiver_class); pd_bind(&vstGuiNameReceiver->x_obj.ob_pd, gensym("guiName")); - } void makevstChunkReceiver() { vstChunkReceiver = (t_vstChunkReceiver *)pd_new(vstChunkReceiver_class); pd_bind(&vstChunkReceiver->x_obj.ob_pd, gensym("svstdata")); - } - - - - void send_dacs(void) { int i, j, sampleCount, nChannels, blockSize; @@ -384,7 +428,7 @@ int scheduler() 0, 0); - class_addsymbol(vstChunkReceiver_class,(t_method)sendPdVstChunk); + class_addanything(vstChunkReceiver_class,(t_method)sendPdVstChunk); makevstChunkReceiver(); diff --git a/vst-template/pdvst.cpp b/vst-template/pdvst.cpp index bc4c8f2..0178f40 100644 --- a/vst-template/pdvst.cpp +++ b/vst-template/pdvst.cpp @@ -604,24 +604,21 @@ bool pdvst::getOutputProperties(VstInt32 index, VstPinProperties* properties) VstInt32 pdvst::getChunk (void** data, bool isPreset) { - MessageBox(0,"getchunk","debug",MB_OK); strcpy ((char *)*data, pdvstData->datachunk.value.stringData); return strlen(pdvstData->datachunk.value.stringData); } VstInt32 pdvst::setChunk (void* data, VstInt32 byteSize, bool isPreset) { - + memset(&pdvstData->datachunk.value.stringData, '\0', MAXSTRINGSIZE); WaitForSingleObject(pdvstTransferMutex, 10); { pdvstData->datachunk.direction = PD_RECEIVE; pdvstData->datachunk.type = STRING_TYPE; - strcpy(pdvstData->datachunk.value.stringData,(char *)data); + strncpy(pdvstData->datachunk.value.stringData,(char *)data, (size_t)byteSize); pdvstData->datachunk.updated = 1; ReleaseMutex(pdvstTransferMutex); } - MessageBox(0,"setchunk","debug",MB_OK); - debugLog("setchunk: %s", data); return 1; }