LMMS
Loading...
Searching...
No Matches
juce_LADSPAPluginFormat.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26#if JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD)
27
28#include "ladspa.h"
29
30namespace juce
31{
32
33static int shellLADSPAUIDToCreate = 0;
34static int insideLADSPACallback = 0;
35
36#define JUCE_LADSPA_LOGGING 1
37
38#if JUCE_LADSPA_LOGGING
39 #define JUCE_LADSPA_LOG(x) Logger::writeToLog (x);
40#else
41 #define JUCE_LADSPA_LOG(x)
42#endif
43
44//==============================================================================
45class LADSPAModuleHandle : public ReferenceCountedObject
46{
47public:
48 LADSPAModuleHandle (const File& f)
49 : file (f)
50 {
51 getActiveModules().add (this);
52 }
53
54 ~LADSPAModuleHandle()
55 {
56 getActiveModules().removeFirstMatchingValue (this);
57 close();
58 }
59
60 using Ptr = ReferenceCountedObjectPtr<LADSPAModuleHandle>;
61
62 static Array<LADSPAModuleHandle*>& getActiveModules()
63 {
64 static Array<LADSPAModuleHandle*> activeModules;
65 return activeModules;
66 }
67
68 static LADSPAModuleHandle* findOrCreateModule (const File& file)
69 {
70 for (auto i = getActiveModules().size(); --i >= 0;)
71 {
72 auto* module = getActiveModules().getUnchecked(i);
73
74 if (module->file == file)
75 return module;
76 }
77
78 ++insideLADSPACallback;
79 shellLADSPAUIDToCreate = 0;
80
81 JUCE_LADSPA_LOG ("Loading LADSPA module: " + file.getFullPathName());
82
83 std::unique_ptr<LADSPAModuleHandle> m (new LADSPAModuleHandle (file));
84
85 if (! m->open())
86 m = nullptr;
87
88 --insideLADSPACallback;
89
90 return m.release();
91 }
92
93 File file;
94 LADSPA_Descriptor_Function moduleMain = nullptr;
95
96private:
97 DynamicLibrary module;
98
99 bool open()
100 {
101 module.open (file.getFullPathName());
102 moduleMain = (LADSPA_Descriptor_Function) module.getFunction ("ladspa_descriptor");
103
104 return (moduleMain != nullptr);
105 }
106
107 void close()
108 {
109 module.close();
110 }
111
113};
114
115//==============================================================================
116class LADSPAPluginInstance final : public AudioPluginInstance
117{
118public:
119 LADSPAPluginInstance (const LADSPAModuleHandle::Ptr& m)
120 : module (m)
121 {
122 ++insideLADSPACallback;
123
124 name = module->file.getFileNameWithoutExtension();
125
126 JUCE_LADSPA_LOG ("Creating LADSPA instance: " + name);
127
128 if (module->moduleMain != nullptr)
129 {
130 plugin = module->moduleMain ((size_t) shellLADSPAUIDToCreate);
131
132 if (plugin == nullptr)
133 {
134 JUCE_LADSPA_LOG ("Cannot find any valid descriptor in shared library");
135 --insideLADSPACallback;
136 return;
137 }
138 }
139 else
140 {
141 JUCE_LADSPA_LOG ("Cannot find any valid plugin in shared library");
142 --insideLADSPACallback;
143 return;
144 }
145
146 const auto sampleRate = getSampleRate() > 0 ? getSampleRate()
147 : 44100.0;
148
149 handle = plugin->instantiate (plugin, (uint32) sampleRate);
150
151 --insideLADSPACallback;
152 }
153
154 ~LADSPAPluginInstance() override
155 {
156 const ScopedLock sl (lock);
157
158 jassert (insideLADSPACallback == 0);
159
160 if (handle != nullptr && plugin != nullptr && plugin->cleanup != nullptr)
161 plugin->cleanup (handle);
162
163 initialised = false;
164 module = nullptr;
165 plugin = nullptr;
166 handle = nullptr;
167 }
168
169 void initialise (double initialSampleRate, int initialBlockSize)
170 {
171 setPlayConfigDetails (inputs.size(), outputs.size(), initialSampleRate, initialBlockSize);
172
173 if (initialised || plugin == nullptr || handle == nullptr)
174 return;
175
176 JUCE_LADSPA_LOG ("Initialising LADSPA: " + name);
177
178 initialised = true;
179
180 inputs.clear();
181 outputs.clear();
182 AudioProcessorParameterGroup newTree;
183
184 for (unsigned int i = 0; i < plugin->PortCount; ++i)
185 {
186 const auto portDesc = plugin->PortDescriptors[i];
187
188 if ((portDesc & LADSPA_PORT_CONTROL) != 0)
189 newTree.addChild (std::make_unique<LADSPAParameter> (*this, (int) i,
190 String (plugin->PortNames[i]).trim(),
191 (portDesc & LADSPA_PORT_INPUT) != 0));
192
193 if ((portDesc & LADSPA_PORT_AUDIO) != 0)
194 {
195 if ((portDesc & LADSPA_PORT_INPUT) != 0) inputs.add ((int) i);
196 if ((portDesc & LADSPA_PORT_OUTPUT) != 0) outputs.add ((int) i);
197 }
198 }
199
200 setHostedParameterTree (std::move (newTree));
201
202 for (auto* param : getParameters())
203 if (auto* ladspaParam = dynamic_cast<LADSPAParameter*> (param))
204 plugin->connect_port (handle, (size_t) ladspaParam->paramID, &(ladspaParam->paramValue.scaled));
205
206 setPlayConfigDetails (inputs.size(), outputs.size(), initialSampleRate, initialBlockSize);
207
208 setCurrentProgram (0);
209 setLatencySamples (0);
210
211 // Some plugins crash if this doesn't happen:
212 if (plugin->activate != nullptr) plugin->activate (handle);
213 if (plugin->deactivate != nullptr) plugin->deactivate (handle);
214 }
215
216 //==============================================================================
217 // AudioPluginInstance methods:
218
219 void fillInPluginDescription (PluginDescription& desc) const override
220 {
221 desc.name = getName();
222 desc.fileOrIdentifier = module->file.getFullPathName();
223 desc.uniqueId = desc.deprecatedUid = getUID();
224 desc.lastFileModTime = module->file.getLastModificationTime();
225 desc.lastInfoUpdateTime = Time::getCurrentTime();
226 desc.pluginFormatName = "LADSPA";
227 desc.category = getCategory();
228 desc.manufacturerName = plugin != nullptr ? String (plugin->Maker) : String();
229 desc.version = getVersion();
230 desc.numInputChannels = getTotalNumInputChannels();
231 desc.numOutputChannels = getTotalNumOutputChannels();
232 desc.isInstrument = false;
233 }
234
235 const String getName() const override
236 {
237 if (plugin != nullptr && plugin->Label != nullptr)
238 return plugin->Label;
239
240 return name;
241 }
242
243 int getUID() const
244 {
245 if (plugin != nullptr && plugin->UniqueID != 0)
246 return (int) plugin->UniqueID;
247
248 return module->file.hashCode();
249 }
250
251 String getVersion() const { return LADSPA_VERSION; }
252 String getCategory() const { return "Effect"; }
253
254 bool acceptsMidi() const override { return false; }
255 bool producesMidi() const override { return false; }
256
257 double getTailLengthSeconds() const override { return 0.0; }
258
259 //==============================================================================
260 void prepareToPlay (double newSampleRate, int samplesPerBlockExpected) override
261 {
262 setLatencySamples (0);
263
264 initialise (newSampleRate, samplesPerBlockExpected);
265
266 if (initialised)
267 {
268 tempBuffer.setSize (jmax (1, outputs.size()), samplesPerBlockExpected);
269
270 // dodgy hack to force some plugins to initialise the sample rate..
271 if (auto* firstParam = getParameters()[0])
272 {
273 const auto old = firstParam->getValue();
274 firstParam->setValue ((old < 0.5f) ? 1.0f : 0.0f);
275 firstParam->setValue (old);
276 }
277
278 if (plugin->activate != nullptr)
279 plugin->activate (handle);
280 }
281 }
282
283 void releaseResources() override
284 {
285 if (handle != nullptr && plugin->deactivate != nullptr)
286 plugin->deactivate (handle);
287
288 tempBuffer.setSize (1, 1);
289 }
290
291 void processBlock (AudioBuffer<float>& buffer, MidiBuffer&) override
292 {
293 auto numSamples = buffer.getNumSamples();
294
295 if (initialised && plugin != nullptr && handle != nullptr)
296 {
297 for (int i = 0; i < inputs.size(); ++i)
298 plugin->connect_port (handle, (size_t) inputs[i],
299 i < buffer.getNumChannels() ? buffer.getWritePointer (i) : nullptr);
300
301 if (plugin->run != nullptr)
302 {
303 for (int i = 0; i < outputs.size(); ++i)
304 plugin->connect_port (handle, (size_t) outputs.getUnchecked(i),
305 i < buffer.getNumChannels() ? buffer.getWritePointer (i) : nullptr);
306
307 plugin->run (handle, (size_t) numSamples);
308 return;
309 }
310
311 if (plugin->run_adding != nullptr)
312 {
313 tempBuffer.setSize (outputs.size(), numSamples);
314 tempBuffer.clear();
315
316 for (int i = 0; i < outputs.size(); ++i)
317 plugin->connect_port (handle, (size_t) outputs.getUnchecked(i), tempBuffer.getWritePointer (i));
318
319 plugin->run_adding (handle, (size_t) numSamples);
320
321 for (int i = 0; i < outputs.size(); ++i)
322 if (i < buffer.getNumChannels())
323 buffer.copyFrom (i, 0, tempBuffer, i, 0, numSamples);
324
325 return;
326 }
327
328 jassertfalse; // no callback to use?
329 }
330
331 for (auto i = getTotalNumInputChannels(), e = getTotalNumOutputChannels(); i < e; ++i)
332 buffer.clear (i, 0, numSamples);
333 }
334
335 using AudioPluginInstance::processBlock;
336
337 bool isInputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getTotalNumInputChannels()); }
338 bool isOutputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getTotalNumOutputChannels()); }
339
340 const String getInputChannelName (const int index) const override
341 {
342 if (isPositiveAndBelow (index, getTotalNumInputChannels()))
343 return String (plugin->PortNames [inputs [index]]).trim();
344
345 return {};
346 }
347
348 const String getOutputChannelName (const int index) const override
349 {
350 if (isPositiveAndBelow (index, getTotalNumInputChannels()))
351 return String (plugin->PortNames [outputs [index]]).trim();
352
353 return {};
354 }
355
356 //==============================================================================
357 int getNumPrograms() override { return 0; }
358 int getCurrentProgram() override { return 0; }
359
360 void setCurrentProgram (int) override
361 {
362 for (auto* param : getParameters())
363 if (auto* ladspaParam = dynamic_cast<LADSPAParameter*> (param))
364 ladspaParam->reset();
365 }
366
367 const String getProgramName (int) override { return {}; }
368 void changeProgramName (int, const String&) override {}
369
370 //==============================================================================
371 void getStateInformation (MemoryBlock& destData) override
372 {
373 auto numParameters = getParameters().size();
374 destData.setSize ((size_t) numParameters * sizeof (float));
375 destData.fillWith (0);
376
377 auto* p = unalignedPointerCast<float*> (destData.getData());
378
379 for (int i = 0; i < numParameters; ++i)
380 if (auto* param = getParameters()[i])
381 p[i] = param->getValue();
382 }
383
384 void getCurrentProgramStateInformation (MemoryBlock& destData) override { getStateInformation (destData); }
385 void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override { setStateInformation (data, sizeInBytes); }
386
387 void setStateInformation (const void* data, int sizeInBytes) override
388 {
389 ignoreUnused (sizeInBytes);
390
391 auto* p = static_cast<const float*> (data);
392
393 for (int i = 0; i < getParameters().size(); ++i)
394 if (auto* param = getParameters()[i])
395 param->setValue (p[i]);
396 }
397
398 bool hasEditor() const override { return false; }
399 AudioProcessorEditor* createEditor() override { return nullptr; }
400
401 bool isValid() const { return handle != nullptr; }
402
403 //==============================================================================
404 LADSPAModuleHandle::Ptr module;
405 const LADSPA_Descriptor* plugin = nullptr;
406
407private:
408 //==============================================================================
409 struct LADSPAParameter final : public Parameter
410 {
411 struct ParameterValue
412 {
413 inline ParameterValue() noexcept {}
414 inline ParameterValue (float s, float u) noexcept : scaled (s), unscaled (u) {}
415
416 float scaled = 0, unscaled = 0;
417 };
418
419 LADSPAParameter (LADSPAPluginInstance& parent, int parameterID,
420 const String& parameterName, bool parameterIsAutomatable)
421 : pluginInstance (parent),
422 paramID (parameterID),
423 name (parameterName),
424 automatable (parameterIsAutomatable)
425 {
426 reset();
427 }
428
429 float getValue() const override
430 {
431 if (pluginInstance.plugin != nullptr)
432 {
433 const ScopedLock sl (pluginInstance.lock);
434
435 return paramValue.unscaled;
436 }
437
438 return 0.0f;
439 }
440
441 String getCurrentValueAsText() const override
442 {
443 if (auto* interface = pluginInstance.plugin)
444 {
445 const auto& hint = interface->PortRangeHints[paramID];
446
447 if (LADSPA_IS_HINT_INTEGER (hint.HintDescriptor))
448 return String ((int) paramValue.scaled);
449
450 return String (paramValue.scaled, 4);
451 }
452
453 return {};
454 }
455
456 void setValue (float newValue) override
457 {
458 if (auto* interface = pluginInstance.plugin)
459 {
460 const ScopedLock sl (pluginInstance.lock);
461
462 if (paramValue.unscaled != newValue)
463 paramValue = ParameterValue (getNewParamScaled (interface->PortRangeHints [paramID], newValue), newValue);
464 }
465 }
466
467 float getDefaultValue() const override
468 {
469 return defaultValue;
470 }
471
472 ParameterValue getDefaultParamValue() const
473 {
474 if (auto* interface = pluginInstance.plugin)
475 {
476 const auto& hint = interface->PortRangeHints[paramID];
477 const auto& desc = hint.HintDescriptor;
478
480 {
481 if (LADSPA_IS_HINT_DEFAULT_0 (desc)) return {};
482 if (LADSPA_IS_HINT_DEFAULT_1 (desc)) return { 1.0f, 1.0f };
483 if (LADSPA_IS_HINT_DEFAULT_100 (desc)) return { 100.0f, 0.5f };
484 if (LADSPA_IS_HINT_DEFAULT_440 (desc)) return { 440.0f, 0.5f };
485
486 const auto scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) pluginInstance.getSampleRate()
487 : 1.0f;
488 const auto lower = hint.LowerBound * scale;
489 const auto upper = hint.UpperBound * scale;
490
491 if (LADSPA_IS_HINT_BOUNDED_BELOW (desc) && LADSPA_IS_HINT_DEFAULT_MINIMUM (desc)) return { lower, 0.0f };
492 if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc) && LADSPA_IS_HINT_DEFAULT_MAXIMUM (desc)) return { upper, 1.0f };
493
495 {
496 auto useLog = LADSPA_IS_HINT_LOGARITHMIC (desc);
497
498 if (LADSPA_IS_HINT_DEFAULT_LOW (desc)) return { scaledValue (lower, upper, 0.25f, useLog), 0.25f };
499 if (LADSPA_IS_HINT_DEFAULT_MIDDLE (desc)) return { scaledValue (lower, upper, 0.50f, useLog), 0.50f };
500 if (LADSPA_IS_HINT_DEFAULT_HIGH (desc)) return { scaledValue (lower, upper, 0.75f, useLog), 0.75f };
501 }
502 }
503 }
504
505 return {};
506 }
507
508 void reset()
509 {
510 paramValue = getDefaultParamValue();
511 defaultValue = paramValue.unscaled;
512 }
513
514 String getName (int /*maximumStringLength*/) const override { return name; }
515 String getLabel() const override { return {}; }
516
517 bool isAutomatable() const override { return automatable; }
518
519 String getParameterID() const override
520 {
521 return String (paramID);
522 }
523
524 static float scaledValue (float low, float high, float alpha, bool useLog) noexcept
525 {
526 if (useLog && low > 0 && high > 0)
527 return expf (logf (low) * (1.0f - alpha) + logf (high) * alpha);
528
529 return low + (high - low) * alpha;
530 }
531
532 static float toIntIfNecessary (const LADSPA_PortRangeHintDescriptor& desc, float value)
533 {
534 return LADSPA_IS_HINT_INTEGER (desc) ? ((float) (int) value) : value;
535 }
536
537 float getNewParamScaled (const LADSPA_PortRangeHint& hint, float newValue) const
538 {
539 const auto& desc = hint.HintDescriptor;
540
541 if (LADSPA_IS_HINT_TOGGLED (desc))
542 return (newValue < 0.5f) ? 0.0f : 1.0f;
543
544 const auto scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) pluginInstance.getSampleRate()
545 : 1.0f;
546 const auto lower = hint.LowerBound * scale;
547 const auto upper = hint.UpperBound * scale;
548
550 return toIntIfNecessary (desc, scaledValue (lower, upper, newValue, LADSPA_IS_HINT_LOGARITHMIC (desc)));
551
552 if (LADSPA_IS_HINT_BOUNDED_BELOW (desc)) return toIntIfNecessary (desc, newValue);
553 if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc)) return toIntIfNecessary (desc, newValue * upper);
554
555 return 0.0f;
556 }
557
558 LADSPAPluginInstance& pluginInstance;
559 const int paramID;
560 const String name;
561 const bool automatable;
562
563 ParameterValue paramValue;
564 float defaultValue = 0.0f;
565 };
566
567 //==============================================================================
568 LADSPA_Handle handle = nullptr;
569 String name;
570 CriticalSection lock;
571 bool initialised = false;
572 AudioBuffer<float> tempBuffer { 1, 1 };
573 Array<int> inputs, outputs;
574
575 //==============================================================================
577};
578
579
580//==============================================================================
581LADSPAPluginFormat::LADSPAPluginFormat() {}
582LADSPAPluginFormat::~LADSPAPluginFormat() {}
583
584void LADSPAPluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& results, const String& fileOrIdentifier)
585{
586 if (! fileMightContainThisPluginType (fileOrIdentifier))
587 return;
588
589 PluginDescription desc;
590 desc.fileOrIdentifier = fileOrIdentifier;
591 desc.uniqueId = desc.deprecatedUid = 0;
592
593 auto createdInstance = createInstanceFromDescription (desc, 44100.0, 512);
594 auto instance = dynamic_cast<LADSPAPluginInstance*> (createdInstance.get());
595
596 if (instance == nullptr || ! instance->isValid())
597 return;
598
599 instance->initialise (44100.0, 512);
600 instance->fillInPluginDescription (desc);
601
602 if (instance->module->moduleMain != nullptr)
603 {
604 for (int uid = 0;; ++uid)
605 {
606 if (auto* plugin = instance->module->moduleMain ((size_t) uid))
607 {
608 desc.uniqueId = desc.deprecatedUid = uid;
609 desc.name = plugin->Name != nullptr ? plugin->Name : "Unknown";
610
611 if (! arrayContainsPlugin (results, desc))
612 results.add (new PluginDescription (desc));
613 }
614 else
615 {
616 break;
617 }
618 }
619 }
620}
621
622void LADSPAPluginFormat::createPluginInstance (const PluginDescription& desc,
623 double sampleRate, int blockSize,
624 PluginCreationCallback callback)
625{
626 std::unique_ptr<LADSPAPluginInstance> result;
627
628 if (fileMightContainThisPluginType (desc.fileOrIdentifier))
629 {
630 auto file = File (desc.fileOrIdentifier);
631
632 auto previousWorkingDirectory = File::getCurrentWorkingDirectory();
633 file.getParentDirectory().setAsCurrentWorkingDirectory();
634
635 const LADSPAModuleHandle::Ptr module (LADSPAModuleHandle::findOrCreateModule (file));
636
637 if (module != nullptr)
638 {
639 shellLADSPAUIDToCreate = desc.uniqueId != 0 ? desc.uniqueId : desc.deprecatedUid;
640
641 result.reset (new LADSPAPluginInstance (module));
642
643 if (result->plugin != nullptr && result->isValid())
644 result->initialise (sampleRate, blockSize);
645 else
646 result = nullptr;
647 }
648
649 previousWorkingDirectory.setAsCurrentWorkingDirectory();
650 }
651
652 String errorMsg;
653
654 if (result == nullptr)
655 errorMsg = TRANS ("Unable to load XXX plug-in file").replace ("XXX", "LADSPA");
656
657 callback (std::move (result), errorMsg);
658}
659
660bool LADSPAPluginFormat::requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const
661{
662 return false;
663}
664
665bool LADSPAPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier)
666{
667 auto f = File::createFileWithoutCheckingPath (fileOrIdentifier);
668 return f.existsAsFile() && f.hasFileExtension (".so");
669}
670
671String LADSPAPluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier)
672{
673 return fileOrIdentifier;
674}
675
676bool LADSPAPluginFormat::pluginNeedsRescanning (const PluginDescription& desc)
677{
678 return File (desc.fileOrIdentifier).getLastModificationTime() != desc.lastFileModTime;
679}
680
681bool LADSPAPluginFormat::doesPluginStillExist (const PluginDescription& desc)
682{
683 return File::createFileWithoutCheckingPath (desc.fileOrIdentifier).exists();
684}
685
686StringArray LADSPAPluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, const bool recursive, bool)
687{
688 StringArray results;
689
690 for (int j = 0; j < directoriesToSearch.getNumPaths(); ++j)
691 recursiveFileSearch (results, directoriesToSearch[j], recursive);
692
693 return results;
694}
695
696void LADSPAPluginFormat::recursiveFileSearch (StringArray& results, const File& dir, const bool recursive)
697{
698
699 for (const auto& iter : RangedDirectoryIterator (dir, false, "*", File::findFilesAndDirectories))
700 {
701 auto f = iter.getFile();
702 bool isPlugin = false;
703
704 if (fileMightContainThisPluginType (f.getFullPathName()))
705 {
706 isPlugin = true;
707 results.add (f.getFullPathName());
708 }
709
710 if (recursive && (! isPlugin) && f.isDirectory())
711 recursiveFileSearch (results, f, true);
712 }
713}
714
715FileSearchPath LADSPAPluginFormat::getDefaultLocationsToSearch()
716{
717 return { SystemStats::getEnvironmentVariable ("LADSPA_PATH", "/usr/lib/ladspa;/usr/local/lib/ladspa;~/.ladspa").replace (":", ";") };
718}
719
720} // namespace juce
721
722#endif
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
#define final
Definition DistrhoDefines.h:74
uint32_t uint32
Definition basics.h:90
static File createFileWithoutCheckingPath(const String &absolutePath) noexcept
Definition File.cpp:65
static File getCurrentWorkingDirectory()
Definition File.cpp:1395
@ findFilesAndDirectories
Definition File.h:463
void setSize(const size_t newSize, bool initialiseNewSpaceToZero=false)
Definition MemoryBlock.cpp:109
void fillWith(uint8 valueToUse) noexcept
Definition MemoryBlock.cpp:162
void * getData() const noexcept
Definition MemoryBlock.h:91
bool add(const String &stringToAdd)
Definition StringArray.cpp:108
String replace(StringRef stringToReplace, StringRef stringToInsertInstead, bool ignoreCase=false) const
Definition String.cpp:1159
bool exists() const
Definition juce_posix_SharedCode.h:246
* e
Definition inflate.c:1404
unsigned * m
Definition inflate.c:1559
register unsigned j
Definition inflate.c:1576
struct huft * u[BMAX]
Definition inflate.c:1583
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned f
Definition inflate.c:1572
static PuglViewHint int value
Definition pugl.h:1708
static PuglViewHint hint
Definition pugl.h:1707
static const char * name
Definition pugl.h:1582
static uintptr_t parent
Definition pugl.h:1644
virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate)=0
struct _LADSPA_PortRangeHint LADSPA_PortRangeHint
#define LADSPA_IS_HINT_BOUNDED_BELOW(x)
Definition ladspa.h:310
#define LADSPA_VERSION
Definition ladspa.h:25
#define LADSPA_IS_HINT_DEFAULT_0(x)
Definition ladspa.h:328
#define LADSPA_PORT_INPUT
Definition ladspa.h:155
#define LADSPA_IS_HINT_BOUNDED_ABOVE(x)
Definition ladspa.h:311
#define LADSPA_IS_HINT_DEFAULT_440(x)
Definition ladspa.h:334
#define LADSPA_PORT_OUTPUT
Definition ladspa.h:158
#define LADSPA_IS_HINT_INTEGER(x)
Definition ladspa.h:315
#define LADSPA_IS_HINT_DEFAULT_100(x)
Definition ladspa.h:332
#define LADSPA_IS_HINT_HAS_DEFAULT(x)
Definition ladspa.h:317
#define LADSPA_IS_HINT_LOGARITHMIC(x)
Definition ladspa.h:314
#define LADSPA_IS_HINT_TOGGLED(x)
Definition ladspa.h:312
int LADSPA_PortRangeHintDescriptor
Definition ladspa.h:200
#define LADSPA_IS_HINT_DEFAULT_MIDDLE(x)
Definition ladspa.h:322
#define LADSPA_IS_HINT_DEFAULT_1(x)
Definition ladspa.h:330
#define LADSPA_PORT_CONTROL
Definition ladspa.h:162
#define LADSPA_IS_HINT_DEFAULT_HIGH(x)
Definition ladspa.h:324
#define LADSPA_IS_HINT_DEFAULT_LOW(x)
Definition ladspa.h:320
#define LADSPA_PORT_AUDIO
Definition ladspa.h:166
#define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x)
Definition ladspa.h:326
const LADSPA_Descriptor *(* LADSPA_Descriptor_Function)(unsigned long Index)
Definition ladspa.h:593
void * LADSPA_Handle
Definition ladspa.h:363
#define LADSPA_IS_HINT_DEFAULT_MINIMUM(x)
Definition ladspa.h:318
struct _LADSPA_Descriptor LADSPA_Descriptor
#define LADSPA_IS_HINT_SAMPLE_RATE(x)
Definition ladspa.h:313
JSAMPIMAGE data
Definition jpeglib.h:945
#define TRANS(stringLiteral)
Definition juce_LocalisedStrings.h:208
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
#define jassertfalse
const char * getVersion()
Definition carla_juce.cpp:57
void initialise()
Definition hardgate.cpp:79
JOCTET * buffer
Definition juce_JPEGLoader.cpp:302
Definition carla_juce.cpp:31
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
bool isPlugin
Definition Util.cpp:41
const char * Name
Definition ladspa.h:393
RECT const char void(* callback)(const char *droppath))) SWELL_API_DEFINE(BOOL
Definition swell-functions.h:1004
uch * p
Definition crypt.c:594
ulg size
Definition extract.c:2350
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
struct zdirent * file
Definition win32.c:1500