11namespace tracktion {
inline namespace engine
14AutomatableEditItem::AutomatableEditItem (Edit& ed,
const juce::ValueTree& v)
15 : EditItem (EditItemID::readOrCreateNewID (ed, v), ed),
18 remapOnTempoChange.referTo (elementState, IDs::remapOnTempoChange, &edit.getUndoManager(),
false);
21AutomatableEditItem::~AutomatableEditItem()
26void AutomatableEditItem::flushPluginStateToValueTree()
28 saveChangedParametersToState();
39int AutomatableEditItem::getNumAutomatableParameters()
const
41 return automatableParams.
size();
44void AutomatableEditItem::visitAllAutomatableParams (
const std::function<
void(AutomatableParameter&)>& visit)
const
46 for (
auto p : automatableParams)
50AutomatableParameter::Ptr AutomatableEditItem::getAutomatableParameterByID (
const juce::String& paramID)
const
52 for (
auto p : automatableParams)
53 if (p->paramID == paramID)
59void AutomatableEditItem::deleteParameter (AutomatableParameter* p)
61 automatableParams.removeObject (p);
62 rebuildParameterTree();
65void AutomatableEditItem::deleteAutomatableParameters()
68 auto& ech = edit.getParameterChangeHandler();
69 auto& pcm = edit.getParameterControlMappings();
71 for (
auto& ap : automatableParams)
73 if (ech.getPendingParam (
false).get() == ap)
74 ech.getPendingParam (
true);
76 if (pcm.isParameterMapped (*ap))
77 pcm.removeParameterMapping (*ap);
80 automatableParams.clear();
81 parameterTree.clear();
89 std::swap (activeParameters, nowActiveParams);
93 sendListChangeMessage();
96int AutomatableEditItem::indexOfAutomatableParameter (
const AutomatableParameter::Ptr& param)
const
98 return automatableParams.indexOf (param);
101AutomatableParameterTree& AutomatableEditItem::getParameterTree()
const
103 if (setIfDifferent (parameterTreeBuilt,
true))
105 buildParameterTree();
106 sendListChangeMessage();
110 return parameterTree;
117 for (
auto node : getParameterTree().rootNode->subNodes)
119 if (node->type == AutomatableParameterTree::Parameter)
120 params.
add (node->parameter);
121 else if (node->type == AutomatableParameterTree::Group)
122 params.
addArray (getFlattenedParameterTree (*node));
131void AutomatableEditItem::setAutomatableParamPosition (TimePosition time)
133 if (setIfDifferent (lastTime, time))
134 if (edit.getAutomationRecordManager().isReadingAutomation())
135 updateAutomatableParamPosition (time);
138bool AutomatableEditItem::isBeingActivelyPlayed()
const
143void AutomatableEditItem::updateAutomatableParamPosition (
TimePosition time)
145 for (
auto p : automatableParams)
146 if (p->isAutomationActive())
147 p->updateToFollowCurve (
time);
154 for (
auto p : activeParameters)
155 p->updateFromAutomationSources (
time);
158void AutomatableEditItem::resetRecordingStatus()
160 for (
auto p : automatableParams)
161 p->resetRecordingStatus();
165void AutomatableEditItem::buildParameterTree()
const
167 for (
auto p : automatableParams)
171void AutomatableEditItem::updateLastPlaybackTime()
176void AutomatableEditItem::clearParameterList()
178 automatableParams.clear();
179 rebuildParameterTree();
182void AutomatableEditItem::addAutomatableParameter (
const AutomatableParameter::Ptr& param)
185 automatableParams.add (param);
186 rebuildParameterTree();
189void AutomatableEditItem::rebuildParameterTree()
191 parameterTree.clear();
192 parameterTreeBuilt =
false;
199 for (
auto subNode : node.subNodes)
201 if (subNode->type == AutomatableParameterTree::Parameter)
202 params.
add (subNode->parameter);
203 else if (subNode->type == AutomatableParameterTree::Group)
204 params.
addArray (getFlattenedParameterTree (*subNode));
210void AutomatableEditItem::updateActiveParameters()
215 for (
auto ap : automatableParams)
216 if (ap->isAutomationActive())
217 nowActiveParams.
add (ap);
221 activeParameters.swapWith (nowActiveParams);
228void AutomatableEditItem::saveChangedParametersToState()
232 for (
auto ap : automatableParams)
234 if (ap->getCurrentValue() != ap->getCurrentExplicitValue())
237 stream.
writeFloat (ap->getCurrentExplicitValue());
242 auto um = &edit.getUndoManager();
245 elementState.setProperty (IDs::parameters, stream.
getMemoryBlock(), um);
247 elementState.removeProperty (IDs::parameters, um);
250void AutomatableEditItem::restoreChangedParametersFromState()
252 if (
auto mb = elementState[IDs::parameters].getBinaryData())
262 if (
auto ap = getAutomatableParameterByID (paramID))
268AutomatableEditItem::ParameterChangeListeners::ParameterChangeListeners (
AutomatableEditItem& e) : owner (e) {}
270void AutomatableEditItem::ParameterChangeListeners::handleAsyncUpdate()
272 listeners.call ([
this] (ParameterListChangeListener& l) { l.parameterListChanged (owner); });
275void AutomatableEditItem::sendListChangeMessage()
const
277 if (parameterChangeListeners !=
nullptr)
278 parameterChangeListeners->triggerAsyncUpdate();
281void AutomatableEditItem::addParameterListChangeListener (ParameterListChangeListener* l)
283 if (parameterChangeListeners ==
nullptr)
286 parameterChangeListeners->listeners.add (l);
289void AutomatableEditItem::removeParameterListChangeListener (ParameterListChangeListener* l)
291 if (parameterChangeListeners !=
nullptr)
292 parameterChangeListeners->listeners.remove (l);
void addArray(const Type *elementsToAdd, int numElementsToAdd)
int size() const noexcept
size_t getDataSize() const noexcept
MemoryBlock getMemoryBlock() const
virtual bool writeFloat(float value)
virtual bool writeString(const String &text)
bool contains(const ObjectClass *objectToLookFor) const noexcept
void addArray(const ReferenceCountedArray &arrayToAddFrom, int startIndex=0, int numElementsToAdd=-1) noexcept
ObjectClass * add(ObjectClass *newObject)
static uint32 getApproximateMillisecondCounter() noexcept
Base class for elements that have some kind of automatable parameters.
Represents a position in real-life time.
#define CRASH_TRACER
This macro adds the current location to a stack which gets logged if a crash happens.