diff --git a/build/Release64/Pd_Chunks-test/Pd_Chunks-test.pdv b/build/Release64/Pd_Chunks-test/Pd_Chunks-test.pdv index f0381ba..18cc354 100644 --- a/build/Release64/Pd_Chunks-test/Pd_Chunks-test.pdv +++ b/build/Release64/Pd_Chunks-test/Pd_Chunks-test.pdv @@ -28,7 +28,7 @@ DEBUG = TRUE # Save and Get Pd lists in .fxp file via ([s svstdata] and [r rvstdata]) # Some hosts don't work correctly with this. # If in doubt just use FALSE. -PROGRAMSARECHUNKS = FALSE +PROGRAMSARECHUNKS = TRUE # Number of VST parameters (up to 128) PARAMETERS = 1 diff --git a/vst-template/pdvst.cpp b/vst-template/pdvst.cpp index 85a044a..79cd913 100644 --- a/vst-template/pdvst.cpp +++ b/vst-template/pdvst.cpp @@ -625,20 +625,30 @@ bool pdvst::getOutputProperties(VstInt32 index, VstPinProperties* properties) VstInt32 pdvst::getChunk (void** data, bool isPreset) { - VstInt32 len; - //MessageBoxA(NULL, "getchunk call", "debug", MB_OK); // all host gets here - if(*data) + + Chunk = new pdvstProgramAreChunks; + + MessageBoxA(NULL, "getchunk call", "debug", MB_OK); // all host gets here + + + for (int i = 0; i < nParameters; i++) + { + Chunk->vstParam[i] = vstParam[i]; + } + + if(1) { //MessageBoxA(NULL, "getchunk if data", "debug", MB_OK); // not all hosts gets here WaitForSingleObject(pdvstTransferMutex, 10); { - //strcpy ((char *)*data, pdvstData->datachunk.value.stringData); - *data = pdvstData->datachunk.value.stringData; - len = (VstInt32)strlen(pdvstData->datachunk.value.stringData); - //memcpy(*data, pdvstData->datachunk.value.stringData, (size_t)len+1); + memset(&Chunk->Data, '\0', MAXSTRLEN); + strcpy (Chunk->Data, pdvstData->datachunk.value.stringData); ReleaseMutex(pdvstTransferMutex); - } - return len+1; + } + + debugLog("luc:debug-size-of-chunk %d", sizeof(*Chunk)); + *data = (void*)Chunk; + return sizeof(*Chunk); } else return 0; @@ -648,18 +658,31 @@ VstInt32 pdvst::setChunk (void* data, VstInt32 byteSize, bool isPreset) { //MessageBoxA(NULL, "setchunk call", "debug", MB_OK); if(byteSize) - { + { + Chunk = (pdvstProgramAreChunks*)data; //MessageBoxA(NULL, "setchunk call if bytesize", "debug", MB_OK); WaitForSingleObject(pdvstTransferMutex, 10); { pdvstData->datachunk.direction = PD_RECEIVE; pdvstData->datachunk.type = STRING_TYPE; - memset(&pdvstData->datachunk.value.stringData, '\0', MAXSTRINGSIZE); - strncpy(pdvstData->datachunk.value.stringData,(char *)data, (size_t)byteSize); + memset(&pdvstData->datachunk.value.stringData, '\0', MAXSTRLEN); + strcpy(pdvstData->datachunk.value.stringData, Chunk->Data); + //memcpy(pdvstData->datachunk.value.stringData, Chunk->Data, MAXSTRLEN); pdvstData->datachunk.updated = 1; + + + for (int i = 0; i < nParameters; i++) + { + pdvstData->vstParameters[i].type = FLOAT_TYPE; + pdvstData->vstParameters[i].value.floatData = Chunk->vstParam[i]; + pdvstData->vstParameters[i].direction = PD_RECEIVE; + pdvstData->vstParameters[i].updated = 1; + } + ReleaseMutex(pdvstTransferMutex); } } + return 0; } diff --git a/vst-template/pdvst.hpp b/vst-template/pdvst.hpp index 0638378..9e9a5c8 100644 --- a/vst-template/pdvst.hpp +++ b/vst-template/pdvst.hpp @@ -53,6 +53,13 @@ typedef struct _pdvstProgram float paramValue[MAXPARAMETERS]; } pdvstProgram; +/* for programsarechunks*/ +typedef struct _pdvstProgramAreChunks +{ + float vstParam[MAXPARAMETERS]; + char Data[MAXSTRLEN]; +} pdvstProgramAreChunks; + class pdVstBuffer { @@ -128,6 +135,7 @@ protected: char **vstParamName; int nParameters; pdvstProgram *program; + pdvstProgramAreChunks *Chunk; int nPrograms; int nChannels; int nExternalLibs;