11namespace tracktion {
inline namespace engine
15extern void cleanUpDanglingPlugins();
17static const char* commandLineUID =
"PluginScan";
30 bool ensureSlaveIsLaunched()
38 commandLineUID, 0, 0);
42 TRACKTION_LOG (
"----- Launched Plugin Scan Process");
46 TRACKTION_LOG_ERROR (
"Failed to launch child process");
47 showVirusCheckerWarning();
57 m.setAttribute (
"id", requestID);
58 m.setAttribute (
"type", format.getName());
59 m.setAttribute (
"file", fileOrIdentifier);
64 bool waitForReply (
int requestID,
const juce::String& fileOrIdentifier,
68 #if ! TRACKTION_LOG_ENABLED
76 auto reply = findReply (requestID);
80 if (reply ==
nullptr || ! reply->hasTagName (
"FOUND"))
84 TRACKTION_LOG_ERROR (
"Plugin crashed: " + fileOrIdentifier);
90 TRACKTION_LOG (
"Plugin scan cancelled");
94 juce::Thread::sleep (10);
98 if (reply->getNumChildElements() == 0)
99 TRACKTION_LOG (
"No plugins found in: " + fileOrIdentifier);
101 for (
auto e : reply->getChildIterator())
109 result.
add (newDesc);
111 TRACKTION_LOG (
"Added " + desc.
pluginFormatName +
": " + desc.
name +
" [" + elapsed.getDescription() +
"]");
132 void handleConnectionLost()
override
137 volatile bool launched =
false, crashed =
false;
143 bool hasShownVirusCheckerWarning =
false;
145 void showVirusCheckerWarning()
147 if (! hasShownVirusCheckerWarning)
149 hasShownVirusCheckerWarning =
true;
153 TRANS(
"There are some problems in launching a child-process to scan for plugins.")
155 +
TRANS(
"If you have a virus-checker or firewall running, you may need to temporarily disable it for the scan to work correctly."));
161 for (
int i = replies.
size(); --i >= 0;)
162 if (replies.
getUnchecked(i)->getIntAttribute (
"id") == requestID)
171 handleMessage (*xml);
186 void handleConnectionMade()
override {}
188 void handleConnectionLost()
override
198 for (
int i = 0; i < pluginFormatManager.
getNumFormats(); ++i)
200 auto format = pluginFormatManager.
getFormat (i);
202 if (format->getName() == formatName)
205 format->findAllTypesForFile (found, fileOrIdentifier);
207 for (
auto pd : found)
233 pendingMessages.
add (xml.release());
256 void handleAsyncUpdate()
override
258 while (pendingMessages.
size() > 0)
260 handleMessageSafely (*xml);
269static void killWithoutMercy (
int)
274static void setupSignalHandling()
276 const int signals[] = { SIGFPE, SIGILL, SIGSEGV, SIGBUS, SIGABRT };
278 for (
int sig : signals)
280 ::signal (sig, killWithoutMercy);
281 ::siginterrupt (sig, 1);
286bool PluginManager::startChildProcessPluginScan (
const juce::String& commandLine)
290 if (slave->initialiseFromCommandLine (commandLine, commandLineUID))
293 setupSignalHandling();
315 && shouldUseSeparateProcessToScan (format))
317 if (masterProcess !=
nullptr && masterProcess->crashed)
318 masterProcess =
nullptr;
320 if (masterProcess ==
nullptr)
323 if (masterProcess->ensureSlaveIsLaunched())
328 && masterProcess->sendScanRequest (format, fileOrIdentifier, requestID)
331 if (masterProcess->waitForReply (requestID, fileOrIdentifier, result, *
this))
338 masterProcess =
nullptr;
341 return masterProcess->ensureSlaveIsLaunched()
343 && masterProcess->sendScanRequest (format, fileOrIdentifier, requestID)
345 && masterProcess->waitForReply (requestID, fileOrIdentifier, result, *
this);
353 TRACKTION_LOG_ERROR (
"Falling back to scanning in main process..");
354 masterProcess.reset();
357 format.findAllTypesForFile (result, fileOrIdentifier);
363 auto name = format.getName();
365 return name.containsIgnoreCase (
"VST")
366 || name.containsIgnoreCase (
"AudioUnit")
367 || name.containsIgnoreCase (
"LADSPA");
370 void scanFinished()
override
372 TRACKTION_LOG (
"----- Ended Plugin Scan");
373 masterProcess.reset();
384inline SettingID getPluginListPropertyName()
387 return SettingID::knownPluginList64;
389 return SettingID::knownPluginList;
394PluginManager::BuiltInType::BuiltInType (
const juce::String& t) : type (t) {}
395PluginManager::BuiltInType::~BuiltInType() {}
398PluginManager::PluginManager (
Engine& e)
404 blockSize, errorMessage));
408void PluginManager::initialise()
410 createBuiltInType<VolumeAndPanPlugin>();
411 createBuiltInType<VCAPlugin>();
412 createBuiltInType<LevelMeterPlugin>();
413 createBuiltInType<EqualiserPlugin>();
414 createBuiltInType<ReverbPlugin>();
415 createBuiltInType<CompressorPlugin>();
416 createBuiltInType<ChorusPlugin>();
417 createBuiltInType<DelayPlugin>();
418 createBuiltInType<PhaserPlugin>();
419 createBuiltInType<PitchShiftPlugin>();
420 createBuiltInType<LowPassPlugin>();
421 createBuiltInType<SamplerPlugin>();
422 createBuiltInType<FourOscPlugin>();
423 createBuiltInType<MidiModifierPlugin>();
424 createBuiltInType<MidiPatchBayPlugin>();
425 createBuiltInType<PatchBayPlugin>();
426 createBuiltInType<AuxSendPlugin>();
427 createBuiltInType<AuxReturnPlugin>();
428 createBuiltInType<TextPlugin>();
429 createBuiltInType<FreezePointPlugin>();
430 createBuiltInType<InsertPlugin>();
432 #if TRACKTION_ENABLE_REWIRE
433 createBuiltInType<ReWirePlugin>();
439 if (
auto patchFormat = createCmajorPatchPluginFormat (engine))
440 pluginFormatManager.
addFormat (patchFormat.release());
452PluginManager::~PluginManager()
455 cleanUpDanglingPlugins();
458#if TRACKTION_AIR_WINDOWS
459void PluginManager::initialiseAirWindows()
461 createBuiltInType<AirWindowsADClip7>();
462 createBuiltInType<AirWindowsADT>();
463 createBuiltInType<AirWindowsAQuickVoiceClip>();
464 createBuiltInType<AirWindowsAcceleration>();
465 createBuiltInType<AirWindowsAir>();
466 createBuiltInType<AirWindowsAtmosphereBuss>();
467 createBuiltInType<AirWindowsAtmosphereChannel>();
468 createBuiltInType<AirWindowsAura>();
469 createBuiltInType<AirWindowsAverage>();
470 createBuiltInType<AirWindowsBassDrive>();
471 createBuiltInType<AirWindowsBassKit>();
472 createBuiltInType<AirWindowsBiquad>();
473 createBuiltInType<AirWindowsBiquad2>();
474 createBuiltInType<AirWindowsBitGlitter>();
475 createBuiltInType<AirWindowsBitShiftGain>();
476 createBuiltInType<AirWindowsBite>();
477 createBuiltInType<AirWindowsBlockParty>();
478 createBuiltInType<AirWindowsBrassRider>();
479 createBuiltInType<AirWindowsBuildATPDF>();
480 createBuiltInType<AirWindowsBussColors4>();
481 createBuiltInType<AirWindowsButterComp>();
482 createBuiltInType<AirWindowsButterComp2>();
483 createBuiltInType<AirWindowsC5RawBuss>();
484 createBuiltInType<AirWindowsC5RawChannel>();
485 createBuiltInType<AirWindowsCStrip>();
486 createBuiltInType<AirWindowsCapacitor>();
487 createBuiltInType<AirWindowsChannel4>();
488 createBuiltInType<AirWindowsChannel5>();
489 createBuiltInType<AirWindowsChannel6>();
490 createBuiltInType<AirWindowsChannel7>();
491 createBuiltInType<AirWindowsChorus>();
492 createBuiltInType<AirWindowsChorusEnsemble>();
493 createBuiltInType<AirWindowsClipOnly>();
494 createBuiltInType<AirWindowsCoils>();
495 createBuiltInType<AirWindowsCojones>();
496 createBuiltInType<AirWindowsCompresaturator>();
497 createBuiltInType<AirWindowsConsole4Buss>();
498 createBuiltInType<AirWindowsConsole4Channel>();
499 createBuiltInType<AirWindowsConsole5Buss>();
500 createBuiltInType<AirWindowsConsole5Channel>();
501 createBuiltInType<AirWindowsConsole5DarkCh>();
502 createBuiltInType<AirWindowsConsole6Buss>();
503 createBuiltInType<AirWindowsConsole6Channel>();
504 createBuiltInType<AirWindowsCrunchyGrooveWear>();
505 createBuiltInType<AirWindowsCrystal>();
506 createBuiltInType<AirWindowsDCVoltage>();
507 createBuiltInType<AirWindowsDeBess>();
508 createBuiltInType<AirWindowsDeEss>();
509 createBuiltInType<AirWindowsDeHiss>();
510 createBuiltInType<AirWindowsDeRez>();
511 createBuiltInType<AirWindowsDeRez2>();
512 createBuiltInType<AirWindowsDeckwrecka>();
513 createBuiltInType<AirWindowsDensity>();
514 createBuiltInType<AirWindowsDesk>();
515 createBuiltInType<AirWindowsDesk4>();
516 createBuiltInType<AirWindowsDistance>();
517 createBuiltInType<AirWindowsDistance2>();
518 createBuiltInType<AirWindowsDitherFloat>();
519 createBuiltInType<AirWindowsDitherMeDiskers>();
520 createBuiltInType<AirWindowsDitherMeTimbers>();
521 createBuiltInType<AirWindowsDitherbox>();
522 createBuiltInType<AirWindowsDoublePaul>();
523 createBuiltInType<AirWindowsDrive>();
524 createBuiltInType<AirWindowsDrumSlam>();
525 createBuiltInType<AirWindowsDubCenter>();
526 createBuiltInType<AirWindowsDubSub>();
527 createBuiltInType<AirWindowsDustBunny>();
528 createBuiltInType<AirWindowsDyno>();
529 createBuiltInType<AirWindowsEQ>();
530 createBuiltInType<AirWindowsEdIsDim>();
531 createBuiltInType<AirWindowsElectroHat>();
532 createBuiltInType<AirWindowsEnergy>();
533 createBuiltInType<AirWindowsEnsemble>();
534 createBuiltInType<AirWindowsEveryTrim>();
535 createBuiltInType<AirWindowsFacet>();
536 createBuiltInType<AirWindowsFathomFive>();
537 createBuiltInType<AirWindowsFloor>();
538 createBuiltInType<AirWindowsFocus>();
539 createBuiltInType<AirWindowsFracture>();
540 createBuiltInType<AirWindowsFromTape>();
541 createBuiltInType<AirWindowsGatelope>();
542 createBuiltInType<AirWindowsGolem>();
543 createBuiltInType<AirWindowsGringer>();
544 createBuiltInType<AirWindowsGrooveWear>();
545 createBuiltInType<AirWindowsGuitarConditioner>();
546 createBuiltInType<AirWindowsHardVacuum>();
547 createBuiltInType<AirWindowsHermeTrim>();
548 createBuiltInType<AirWindowsHermepass>();
549 createBuiltInType<AirWindowsHighGlossDither>();
550 createBuiltInType<AirWindowsHighImpact>();
551 createBuiltInType<AirWindowsHighpass>();
552 createBuiltInType<AirWindowsHighpass2>();
553 createBuiltInType<AirWindowsHolt>();
554 createBuiltInType<AirWindowsHombre>();
555 createBuiltInType<AirWindowsInterstage>();
556 createBuiltInType<AirWindowsIronOxide5>();
557 createBuiltInType<AirWindowsIronOxideClassic>();
558 createBuiltInType<AirWindowsLeftoMono>();
559 createBuiltInType<AirWindowsLogical4>();
560 createBuiltInType<AirWindowsLoud>();
561 createBuiltInType<AirWindowsLowpass>();
562 createBuiltInType<AirWindowsLowpass2>();
563 createBuiltInType<AirWindowsMV>();
564 createBuiltInType<AirWindowsMelt>();
565 createBuiltInType<AirWindowsMidSide>();
566 createBuiltInType<AirWindowsMoNoam>();
567 createBuiltInType<AirWindowsMojo>();
568 createBuiltInType<AirWindowsMonitoring>();
569 createBuiltInType<AirWindowsNCSeventeen>();
570 createBuiltInType<AirWindowsNaturalizeDither>();
571 createBuiltInType<AirWindowsNodeDither>();
572 createBuiltInType<AirWindowsNoise>();
573 createBuiltInType<AirWindowsNonlinearSpace>();
574 createBuiltInType<AirWindowsNotJustAnotherCD>();
575 createBuiltInType<AirWindowsNotJustAnotherDither>();
576 createBuiltInType<AirWindowsOneCornerClip>();
577 createBuiltInType<AirWindowsPDBuss>();
578 createBuiltInType<AirWindowsPDChannel>();
579 createBuiltInType<AirWindowsPafnuty>();
580 createBuiltInType<AirWindowsPaulDither>();
581 createBuiltInType<AirWindowsPeaksOnly>();
582 createBuiltInType<AirWindowsPhaseNudge>();
583 createBuiltInType<AirWindowsPocketVerbs>();
584 createBuiltInType<AirWindowsPodcast>();
585 createBuiltInType<AirWindowsPodcastDeluxe>();
586 createBuiltInType<AirWindowsPoint>();
587 createBuiltInType<AirWindowsPop>();
588 createBuiltInType<AirWindowsPowerSag>();
589 createBuiltInType<AirWindowsPowerSag2>();
590 createBuiltInType<AirWindowsPressure4>();
591 createBuiltInType<AirWindowsPurestAir>();
592 createBuiltInType<AirWindowsPurestConsoleBuss>();
593 createBuiltInType<AirWindowsPurestConsoleChannel>();
594 createBuiltInType<AirWindowsPurestDrive>();
595 createBuiltInType<AirWindowsPurestEcho>();
596 createBuiltInType<AirWindowsPurestGain>();
597 createBuiltInType<AirWindowsPurestSquish>();
598 createBuiltInType<AirWindowsPurestWarm>();
599 createBuiltInType<AirWindowsPyewacket>();
600 createBuiltInType<AirWindowsRawGlitters>();
601 createBuiltInType<AirWindowsRawTimbers>();
602 createBuiltInType<AirWindowsRecurve>();
603 createBuiltInType<AirWindowsRemap>();
604 createBuiltInType<AirWindowsResEQ>();
605 createBuiltInType<AirWindowsRighteous4>();
606 createBuiltInType<AirWindowsRightoMono>();
607 createBuiltInType<AirWindowsSideDull>();
608 createBuiltInType<AirWindowsSidepass>();
609 createBuiltInType<AirWindowsSingleEndedTriode>();
610 createBuiltInType<AirWindowsSlew>();
611 createBuiltInType<AirWindowsSlew2>();
612 createBuiltInType<AirWindowsSlewOnly>();
613 createBuiltInType<AirWindowsSmooth>();
614 createBuiltInType<AirWindowsSoftGate>();
615 createBuiltInType<AirWindowsSpatializeDither>();
616 createBuiltInType<AirWindowsSpiral>();
617 createBuiltInType<AirWindowsSpiral2>();
618 createBuiltInType<AirWindowsStarChild>();
619 createBuiltInType<AirWindowsStereoFX>();
620 createBuiltInType<AirWindowsStudioTan>();
621 createBuiltInType<AirWindowsSubsOnly>();
622 createBuiltInType<AirWindowsSurge>();
623 createBuiltInType<AirWindowsSurgeTide>();
624 createBuiltInType<AirWindowsSwell>();
625 createBuiltInType<AirWindowsTPDFDither>();
626 createBuiltInType<AirWindowsTapeDelay>();
627 createBuiltInType<AirWindowsTapeDither>();
628 createBuiltInType<AirWindowsTapeDust>();
629 createBuiltInType<AirWindowsTapeFat>();
630 createBuiltInType<AirWindowsThunder>();
631 createBuiltInType<AirWindowsToTape5>();
632 createBuiltInType<AirWindowsToVinyl4>();
633 createBuiltInType<AirWindowsToneSlant>();
634 createBuiltInType<AirWindowsTransDesk>();
635 createBuiltInType<AirWindowsTremolo>();
636 createBuiltInType<AirWindowsTubeDesk>();
637 createBuiltInType<AirWindowsUnBox>();
638 createBuiltInType<AirWindowsVariMu>();
639 createBuiltInType<AirWindowsVibrato>();
640 createBuiltInType<AirWindowsVinylDither>();
641 createBuiltInType<AirWindowsVoiceOfTheStarship>();
642 createBuiltInType<AirWindowsVoiceTrick>();
643 createBuiltInType<AirWindowsWider>();
644 createBuiltInType<AirWindowscurve>();
645 createBuiltInType<AirWindowsuLawDecode>();
646 createBuiltInType<AirWindowsuLawEncode>();
656Plugin::Ptr PluginManager::createExistingPlugin (Edit& ed,
const juce::ValueTree& v)
658 if (
auto p = createPlugin (ed, v,
false))
660 p->initialiseFully();
667Plugin::Ptr PluginManager::createNewPlugin (Edit& ed,
const juce::ValueTree& v)
669 if (
auto p = createPlugin (ed, v,
true))
671 p->initialiseFully();
681 jassert ((type == ExternalPlugin::xmlTypeName) == type.equalsIgnoreCase (ExternalPlugin::xmlTypeName));
683 if (type.equalsIgnoreCase (ExternalPlugin::xmlTypeName))
684 return new ExternalPlugin (PluginCreationInfo (ed, ExternalPlugin::create (ed.engine, desc),
true));
686 if (type.equalsIgnoreCase (RackInstance::xmlTypeName))
691 RackType::Ptr rackType;
697 rackType = ed.engine.getEngineBehaviour().createPresetRackType (rackIndex, ed);
699 rackType = ed.getRackList().addNewRack();
703 rackType = ed.getRackList().getRackType (rackIndex);
706 if (rackType !=
nullptr)
707 return new RackInstance (PluginCreationInfo (ed, RackInstance::create (*rackType),
true));
710 for (
auto builtIn : builtInTypes)
712 if (builtIn->type == type)
714 auto v = createValueTree (IDs::PLUGIN,
717 if (ed.engine.getPluginManager().areGUIsLockedByDefault())
718 v.setProperty (IDs::windowLocked,
true,
nullptr);
720 if (
auto p = builtIn->create (PluginCreationInfo (ed, v,
true)))
734 for (
const auto& p : knownPluginList.getTypes())
736 if (p.pluginFormatName !=
"VST3")
739 if (p.name.containsIgnoreCase (
"Melodyne"))
741 auto version = p.version.trim().removeCharacters (
"V").upToFirstOccurrenceOf (
".",
false,
true);
743 if (version.getIntValue() >= 4)
751bool PluginManager::areGUIsLockedByDefault()
756void PluginManager::setGUIsLockedByDefault (
bool b)
761bool PluginManager::doubleClickToOpenWindows()
763 return engine.
getPropertyStorage().getProperty (SettingID::windowsDoubleClick,
false);
766void PluginManager::setDoubleClickToOpenWindows (
bool b)
771int PluginManager::getNumberOfThreadsForScanning()
774 static_cast<int> (engine.
getPropertyStorage().getProperty (SettingID::numThreadsForPluginScanning, 1)));
777void PluginManager::setNumberOfThreadsForScanning (
int numThreads)
783bool PluginManager::usesSeparateProcessForScanning()
786 return engine.
getPropertyStorage().getProperty (SettingID::useSeparateProcessForScanning,
true);
790void PluginManager::setUsesSeparateProcessForScanning (
bool b)
792 engine.
getPropertyStorage().setProperty (SettingID::useSeparateProcessForScanning, b);
795Plugin::Ptr PluginManager::createPlugin (Edit& ed,
const juce::ValueTree& v,
bool isNew)
802 auto type = v[IDs::type].
toString();
803 PluginCreationInfo info (ed, v, isNew);
805 EditItemID::readOrCreateNewID (ed, v);
807 if (type == ExternalPlugin::xmlTypeName)
808 return new ExternalPlugin (info);
810 if (type == RackInstance::xmlTypeName)
811 return new RackInstance (info);
813 for (
auto builtIn : builtInTypes)
814 if (builtIn->type == type)
815 if (auto af = builtIn->create (info))
821 TRACKTION_LOG_ERROR (
"Failed to create plugin: " + type);
828 for (
auto builtIn : builtInTypes)
829 if (builtIn->type == t->type)
832 builtInTypes.add (t.release());
836PluginCache::PluginCache (Edit& ed) : edit (ed)
841PluginCache::~PluginCache()
843 activePlugins.
clear();
846Plugin::Ptr PluginCache::getPluginFor (EditItemID pluginID)
const
853 for (
auto p : activePlugins)
854 if (EditItemID::fromProperty (p->state, IDs::id) == pluginID)
864 for (
auto p : activePlugins)
875 for (
auto p : activePlugins)
876 if (p->getWrappedAudioProcessor() == &ap)
882Plugin::Ptr PluginCache::getOrCreatePluginFor (
const juce::ValueTree& v)
886 if (
auto f = getPluginFor (v))
891 jassert (juce::MessageManager::getInstance()->currentThreadHasLockedMessageManager()
892 ||
dynamic_cast<ExternalPlugin*
> (f.get()) ==
nullptr);
894 return addPluginToCache (f);
905 if (p !=
nullptr && newPluginAddedCallback !=
nullptr)
918 if (p !=
nullptr && newPluginAddedCallback !=
nullptr)
924Plugin::Array PluginCache::getPlugins()
const
927 return activePlugins;
930Plugin::Ptr PluginCache::addPluginToCache (Plugin::Ptr p)
938 if (
auto existing = getPluginFor (p->state))
945 activePlugins.
add (p);
952 Plugin::Array toDelete;
957 for (
int i = activePlugins.
size(); --i >= 0;)
961 if (f->getReferenceCount() == 1)
void add(const ElementType &newElement)
void triggerAsyncUpdate()
void addChangeListener(ChangeListener *listener)
void removeChangeListener(ChangeListener *listener)
virtual void changeListenerCallback(ChangeBroadcaster *source)=0
bool sendMessageToWorker(const MemoryBlock &)
bool launchWorkerProcess(const File &executableToLaunch, const String &commandLineUniqueID, int timeoutMs=0, int streamFlags=ChildProcess::wantStdOut|ChildProcess::wantStdErr)
bool sendMessageToCoordinator(const MemoryBlock &)
static File JUCE_CALLTYPE getSpecialLocation(const SpecialLocationType type)
bool isValid() const noexcept
const String & toString() const noexcept
bool shouldExit() const noexcept
void recreateFromXml(const XmlElement &xml)
std::unique_ptr< XmlElement > createXml() const
void setCustomScanner(std::unique_ptr< CustomScanner > newScanner)
MemoryBlock getMemoryBlock() const
int size() const noexcept
ObjectClass * getUnchecked(int index) const noexcept
ObjectClass * removeAndReturn(int indexToRemove)
ObjectClass * add(ObjectClass *newObject)
bool loadFromXml(const XmlElement &xml)
static void JUCE_CALLTYPE terminate()
int size() const noexcept
void remove(int indexToRemove)
ObjectClass * getObjectPointer(int index) const noexcept
bool contains(const ObjectClass *objectToLookFor) const noexcept
ObjectClass * add(ObjectClass *newObject)
bool startsWith(StringRef text) const noexcept
int getTrailingIntValue() const noexcept
bool isNotEmpty() const noexcept
static int getNumCpus() noexcept
static Time JUCE_CALLTYPE getCurrentTime() noexcept
virtual void timerCallback()=0
void addChildElement(XmlElement *newChildElement) noexcept
void writeTo(OutputStream &output, const TextFormat &format={}) const
bool hasTagName(StringRef possibleTagName) const noexcept
int getIntAttribute(StringRef attributeName, int defaultReturnValue=0) const
const String & getStringAttribute(StringRef attributeName) const noexcept
void setAttribute(const Identifier &attributeName, const String &newValue)
Engine & engine
A reference to the Engine.
virtual Plugin::Ptr createCustomPlugin(PluginCreationInfo)
This will be called if the PluginManager doesn't know how to create a Plugin for the given info.
virtual bool canScanPluginsOutOfProcess()
Return true if your application supports scanning plugins out of process.
The Engine is the central class for all tracktion sessions.
PropertyStorage & getPropertyStorage() const
Returns the PropertyStorage user settings customisable XML file.
UIBehaviour & getUIBehaviour() const
Returns the UIBehaviour class.
EngineBehaviour & getEngineBehaviour() const
Returns the EngineBehaviour instance.
PluginManager & getPluginManager() const
Returns the PluginManager instance.
std::function< void(const Plugin &)> newPluginAddedCallback
Callback which can be set to be notified of when a new plugin is added.
virtual void showWarningAlert(const juce::String &title, const juce::String &message)
Should display a dismissable alert window.
#define TRANS(stringLiteral)
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
std::unique_ptr< XmlElement > parseXML(const String &textToParse)
void ignoreUnused(Types &&...) noexcept
SettingID
A list of settings the engine will get and set.
#define CRASH_TRACER
This macro adds the current location to a stack which gets logged if a crash happens.