11namespace tracktion {
inline namespace engine
16 bool isMasterList (PluginList& pl)
18 return pl.getOwnerTrack() ==
nullptr
19 || pl.getOwnerTrack() == pl.getEdit().getMasterTrack();
39 return v.hasType (IDs::PLUGIN);
46 p->incReferenceCount();
47 p->trackPropertiesChanged();
54 void deleteObject (
Plugin* p)
override
58 if (! p->state.getParent().
isValid())
61 p->decReferenceCount();
64 void newObjectAdded (
Plugin*)
override {}
65 void objectRemoved (
Plugin*)
override {}
66 void objectOrderChanged()
override {}
75PluginList::PluginList (
Edit& ed) : edit (ed)
79PluginList::~PluginList()
85 jassert (v.hasType (IDs::MASTERPLUGINS)
86 || v.hasType (IDs::MASTERTRACK)
87 || v.hasType (IDs::TRACK)
88 || v.hasType (IDs::FOLDERTRACK)
89 || v.hasType (IDs::AUDIOCLIP)
90 || v.hasType (IDs::MIDICLIP)
91 || v.hasType (IDs::STEPCLIP)
92 || v.hasType (IDs::EDITCLIP)
93 || v.hasType (IDs::CONTAINERCLIP));
97 callBlocking ([
this] { list->rebuildObjects(); });
100void PluginList::releaseObjects()
110Plugin::Array PluginList::getPlugins()
const
112 Plugin::Array plugins;
115 for (
auto p : list->objects)
121Plugin** PluginList::begin()
const {
return list ==
nullptr ? nullptr : list->objects.begin(); }
122Plugin** PluginList::end()
const {
return list ==
nullptr ? nullptr : list->objects.end(); }
124int PluginList::size()
const
127 return list->objects.size();
132Plugin* PluginList::operator[] (
int index)
const
135 return list->objects[index];
140bool PluginList::contains (
const Plugin* plugin)
const
142 return indexOf (plugin) >= 0;
145int PluginList::indexOf (
const Plugin* plugin)
const
160void PluginList::setTrackAndClip (Track* track, Clip* clip)
166void PluginList::updateTrackProperties()
169 p->trackPropertiesChanged();
172void PluginList::sendMirrorUpdateToAllPlugins (Plugin& plugin)
const
175 for (
auto p : list->objects)
176 p->updateFromMirroredPluginIfNeeded (plugin);
179bool PluginList::needsConstantBufferSize()
182 for (
auto f : list->objects)
183 if (f->needsConstantBufferSize())
189bool PluginList::canInsertPlugin()
192 return ! ((ownerClip !=
nullptr && size() >= limits.maxPluginsOnClip)
193 || (ownerTrack !=
nullptr && size() >= limits.maxPluginsOnTrack)
194 || (isMasterList (*
this) && size() >= limits.maxNumMasterPlugins));
197void PluginList::insertPlugin (
const Plugin::Ptr& plugin,
int index, SelectionManager* sm)
199 if (plugin !=
nullptr)
201 jassert (plugin->state.isValid());
209 if (
auto newPlugin = insertPlugin (plugin->state, index))
215 sm->selectOnly (*newPlugin);
220Plugin::Ptr PluginList::insertPlugin (
const juce::ValueTree& v,
int index)
224 if (
auto newPlugin = edit.
getPluginCache().getOrCreatePluginFor (v))
232 if (
auto ft =
dynamic_cast<FolderTrack*
> (ownerTrack))
234 if (! ft->willAcceptPlugin (*newPlugin))
241 if ((ownerTrack ==
nullptr && ! newPlugin->canBeAddedToMaster()) ||
242 (ownerTrack !=
nullptr && ! ownerTrack->
canContainPlugin (newPlugin.get())))
248 auto numPlugins = size();
251 if ((ownerClip !=
nullptr && numPlugins >= limits.maxPluginsOnClip)
252 || (ownerTrack !=
nullptr && numPlugins >= limits.maxPluginsOnTrack)
253 || (isMasterList (*
this) && numPlugins >= limits.maxNumMasterPlugins))
261 if (index < 0 || index >= numPlugins)
263 if (
auto sibling = list->objects.getLast())
265 jassert (sibling->state.isAChildOf (state));
266 treeIndex = state.
indexOf (sibling->state) + 1;
271 if (
auto sibling = list->objects[index])
273 jassert (sibling->state.isAChildOf (state));
274 treeIndex = state.
indexOf (sibling->state);
278 newPlugin->removeFromParent();
280 state.
addChild (newPlugin->state, treeIndex, getUndoManager());
281 jassert (list->objects.contains (newPlugin.get()));
289void PluginList::clear()
296void PluginList::addPluginsFrom (
const juce::ValueTree& v,
bool clearFirst,
bool atStart)
304 int index = atStart ? 0 : -1;
306 for (
int i = 0; i < v.getNumChildren(); ++i)
308 insertPlugin (v.getChild (i).createCopy(), index);
309 index += atStart ? 1 : 0;
313void PluginList::addDefaultTrackPlugins (
bool useVCA)
319 insertPlugin (VCAPlugin::create(), -1);
323 insertPlugin (VolumeAndPanPlugin::create(), -1);
324 insertPlugin (LevelMeterPlugin::create(), -1);
329 if (
auto vca = findFirstPluginOfType<VCAPlugin>())
330 vca->remapOnTempoChange =
true;
332 if (
auto vp = findFirstPluginOfType<VolumeAndPanPlugin>())
333 vp->remapOnTempoChange =
true;
bool isValid() const noexcept
bool hasType(const Identifier &typeName) const noexcept
void removeChild(const ValueTree &child, UndoManager *undoManager)
ValueTree getChild(int index) const
int getNumChildren() const noexcept
int indexOf(const ValueTree &child) const noexcept
void addChild(const ValueTree &child, int index, UndoManager *undoManager)
The Tracktion Edit class!
PluginCache & getPluginCache() noexcept
Returns the PluginCache which manages all active Plugin[s] for this Edit.
juce::UndoManager & getUndoManager() noexcept
Returns the juce::UndoManager used for this Edit.
Engine & engine
A reference to the Engine.
virtual EditLimits getEditLimits()
Should return the maximum number of elements that can be added to an Edit.
UIBehaviour & getUIBehaviour() const
Returns the UIBehaviour class.
EngineBehaviour & getEngineBehaviour() const
Returns the EngineBehaviour instance.
Holds a sequence of plugins.
virtual bool canContainPlugin(Plugin *) const =0
Returns true if this track can contain a specific Plugin.
virtual void showWarningMessage(const juce::String &message)
Should display a temporary warning message.
#define TRANS(stringLiteral)
#define CRASH_TRACER
This macro adds the current location to a stack which gets logged if a crash happens.