jpo wrote:With your latest change, the presets are now working correctly in jalv ! .
void dummyFunction() {}
...
Dl_info inf; memset(&inf, 0, sizeof inf);
int er=dladdr((void*)&dummyFonction, &inf);
if (er != 0) {
strncpy(path, inf.dli_fname, 512); path[511] = 0;
} else strcpy(path, JucePlugin_Name);
I look forward to test one of your plugins!
for (int i = 0; i < numPrograms; i++)
{
presets += "<" JucePlugin_LV2URI "#preset" + String(i+1) + "> a pset:Preset ;\n";
presets += " rdfs:label \"" + filter->getProgramName(i) + "\" ;\n";
presets += ....etc;
} for (int i = 0; i < numPrograms; i++)
{
String preset;
preset += "<" JucePlugin_LV2URI "#preset" + String(i+1) + "> a pset:Preset ;\n";
preset += " rdfs:label \"" + filter->getProgramName(i) + "\" ;\n";
preset += ....etc;
presets += preset;
}--- distrho/libs/juce-lv2/juce_LV2_Wrapper.cpp 2012-05-22 17:49:27.000000000 +0200
+++ lv2/juce_LV2_Wrapper.cpp 2012-05-23 12:27:42.000000000 +0200
@@ -100,10 +100,12 @@
#define PLUGIN_EXT ".dll"
#endif
+namespace juceLV2 {
+
/** Returns the name of the plugin binary file */
String getBinaryName()
{
- return String(JucePlugin_Name).replace(" ", "_");
+ return String(JucePlugin_Name); //.replace(" ", "_");
}
/** Returns plugin type, defined in AppConfig.h or JucePluginCharacteristics.h */
@@ -125,7 +127,8 @@
{
String symbol, trimmedName = name.trimStart().trimEnd().toLowerCase();
- if (trimmedName.isEmpty())
+ // always use generic symbols because my names are dynamic
+ if (true || trimmedName.isEmpty())
{
symbol += "lv2_port_";
symbol += String(portIndex+1);
@@ -519,33 +522,35 @@
std::cout << "\nSaving preset " << i+1 << "/" << numPrograms+1 << "...";
std::cout.flush();
+ String preset;
+
// Label
filter->setCurrentProgram(i);
- presets += "<" JucePlugin_LV2URI "#preset" + String(i+1) + "> a pset:Preset ;\n";
- presets += " rdfs:label \"" + filter->getProgramName(i) + "\" ;\n";
+ preset += "<" JucePlugin_LV2URI "#preset" + String(i+1) + "> a pset:Preset ;\n";
+ preset += " rdfs:label \"" + filter->getProgramName(i) + "\" ;\n";
// State
#if JucePlugin_WantsLV2State
- presets += " state:state [\n";
+ preset += " state:state [\n";
#if JucePlugin_WantsLV2StateString
- presets += " <" JUCE_LV2_STATE_STRING_URI ">\n";
- presets += "\"\"\"\n";
- presets += filter->getStateInformationString().replace("\r\n","\n");
- presets += "\"\"\"\n";
+ preset += " <" JUCE_LV2_STATE_STRING_URI ">\n";
+ preset += "\"\"\"\n";
+ preset += filter->getStateInformationString().replace("\r\n","\n");
+ preset += "\"\"\"\n";
#else
MemoryBlock chunkMemory;
filter->getCurrentProgramStateInformation(chunkMemory);
const String chunkString = Base64Encode(chunkMemory);
- presets += " <" JUCE_LV2_STATE_BINARY_URI "> [\n";
- presets += " a atom:Chunk ;\n";
- presets += " rdf:value\"\"\"" + chunkString + "\"\"\"^^xsd:base64Binary\n";
- presets += " ]\n";
+ preset += " <" JUCE_LV2_STATE_BINARY_URI "> [\n";
+ preset += " a atom:Chunk ;\n";
+ preset += " rdf:value\"\"\"" + chunkString + "\"\"\"^^xsd:base64Binary\n";
+ preset += " ]\n";
#endif
if (filter->getNumParameters() > 0)
- presets += " ] ;\n\n";
+ preset += " ] ;\n\n";
else
- presets += " ] .\n\n";
+ preset += " ] .\n\n";
#endif
// Port values
@@ -554,19 +559,21 @@
for (int j=0; j < filter->getNumParameters(); j++)
{
if (j == 0)
- presets += " lv2:port [\n";
+ preset += " lv2:port [\n";
else
- presets += " [\n";
+ preset += " [\n";
- presets += " lv2:symbol \"" + nameToSymbol(filter->getParameterName(j), j) + "\" ;\n";
- presets += " pset:value " + String(safeParamValue(filter->getParameter(j)), 8) + " ;\n";
+ preset += " lv2:symbol \"" + nameToSymbol(filter->getParameterName(j), j) + "\" ;\n";
+ preset += " pset:value " + String(safeParamValue(filter->getParameter(j)), 8) + " ;\n";
if (j+1 == filter->getNumParameters())
- presets += " ] ";
+ preset += " ] ";
else
- presets += " ] ,\n";
+ preset += " ] ,\n";
}
- presets += ".\n\n";
+ preset += ".\n\n";
+
+ presets += preset;
}
return presets;
@@ -895,7 +902,8 @@
externalUI (nullptr),
externalUIHost (nullptr),
externalUIPos (100, 100),
- uiTouch (nullptr)
+ uiTouch (nullptr),
+ hostPrograms (nullptr)
{
filter->addListener(this);
@@ -1231,6 +1239,9 @@
#endif
uridMap (nullptr)
{
+#if JUCE_LINUX
+ MessageManagerLock mmLock;
+#endif
filter = createPluginFilter();
jassert(filter != nullptr);
@@ -1283,6 +1294,9 @@
~JuceLV2Wrapper()
{
+#if JUCE_LINUX
+ MessageManagerLock mmLock;
+#endif
filter = nullptr;
channels.free();
@@ -1719,8 +1733,12 @@
if (filter)
filter->setCurrentProgramStateInformation (data, sizeInBytes);
- if (ui)
+ if (ui) {
+#if JUCE_LINUX
+ MessageManagerLock mmLock;
+#endif
ui->repaint();
+ }
}
#if JucePlugin_WantsLV2StateString
@@ -1739,8 +1757,12 @@
filter->setStateInformationString(data);
- if (ui)
+ if (ui) {
+#if JUCE_LINUX
+ MessageManagerLock mmLock;
+#endif
ui->repaint();
+ }
}
#endif
@@ -2141,6 +2163,9 @@
juceLV2UI_ExtensionData
};
+} // namespace juceLV2
+using namespace juceLV2;
+
//==============================================================================
// Mac startup code..
#if JUCE_MAC
@@ -2203,10 +2228,6 @@
}
}
- // don't put initialiseJuce_GUI or shutdownJuce_GUI in these... it will crash!
- __attribute__((constructor)) void myPluginInit() {}
- __attribute__((destructor)) void myPluginFini() {}
-
//==============================================================================
// Windows startup code..
#else
jpo wrote:Just to explain why I'm using a different namespace (in could be also in the vst wrapper , or in both) : it allows me to build an "all-in-one" plugin binary, that is at the same time a vst plugin, and an lv2 plugin
Btw I'm testing a bit with ardour 3 svn right now, it seems to work fine (except for the presets , but I think you already know that). The only issue is that it crashes when closing the plugin ui. Happens also with, for example, drumsynth.lv2. he backtrace seems to only involve ardour/gtk code , though
* Fix crashes when wrapper widget is destroyed by toolkit before
suil cleanup function is called
falkTX wrote:Jules, can we please try to merge this wrapper next week then?
I know you don't want the new 2 StateString calls to AudioProcessor just for LV2, so that will be optional (I will still use it internally). LV2 can work with binary chunks just as fine.
If you could start by adding the new LV2 wrapper type to the juce source code, that would be nice.
Thanks!
Users browsing this forum: P4tr3ck and 0 guests