Skip to content

Commit 14a0ba1

Browse files
committed
Fix parameter linking
1 parent dc157b8 commit 14a0ba1

5 files changed

Lines changed: 152 additions & 53 deletions

File tree

Source/Processors/FileReader/FileReader.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,21 @@ void FileReader::registerParameters()
8888
addTimeParameter (Parameter::PROCESSOR_SCOPE, "start_time", "Start Time", "Time to start playback", "00:00:00.000");
8989
addTimeParameter (Parameter::PROCESSOR_SCOPE, "end_time", "Stop Time", "Time to end playback", "00:00:04.999");
9090

91-
/* Link parameters -- start_time and end_time valid range depends on selected_file */
92-
//linkParameters (getParameter ("selected_file"), getParameter ("start_time"), getParameter ("end_time"));
91+
/* Link parameters */
92+
PathParameter* fileParam = static_cast<PathParameter*>(getParameter("selected_file"));
93+
CategoricalParameter* streamParam = static_cast<CategoricalParameter*>(getParameter("active_stream"));
94+
TimeParameter* startTimeParam = static_cast<TimeParameter*>(getParameter("start_time"));
95+
TimeParameter* endTimeParam = static_cast<TimeParameter*>(getParameter("end_time"));
96+
97+
Array<Parameter*> linkedParams = {streamParam, startTimeParam, endTimeParam};
98+
fileParam->linkParameters(linkedParams);
9399
}
94100

95101
void FileReader::parameterValueChanged (Parameter* p)
96102
{
97103
if (p->getName() == "selected_file")
98104
{
99105
setFile (p->getValue(), false);
100-
//handled by handleLinkedParameterChange
101106
}
102107
else if (p->getName() == "active_stream")
103108
{
@@ -111,19 +116,25 @@ void FileReader::parameterValueChanged (Parameter* p)
111116

112117
TimeParameter* endTime = static_cast<TimeParameter*> (getParameter ("end_time"));
113118
endTime->getTimeValue()->setMinTimeInMilliseconds (samplesToMilliseconds (startSample + 1));
119+
120+
setPlaybackStart(startSample);
114121
}
115122
else if (p->getName() == "end_time")
116123
{
117124
TimeParameter* tp = static_cast<TimeParameter*> (p);
118125
stopSample = millisecondsToSamples (tp->getTimeValue()->getTimeInMilliseconds());
126+
119127
if (input != nullptr && stopSample == startSample)
120128
{
121129
stopSample = input->getActiveNumSamples();
122130
String newTime = TimeParameter::TimeValue (1000 * stopSample / input->getActiveSampleRate()).toString();
123131
p->setNextValue (newTime, false);
124132
}
133+
125134
TimeParameter* startTime = static_cast<TimeParameter*> (getParameter ("start_time"));
126135
startTime->getTimeValue()->setMaxTimeInMilliseconds (samplesToMilliseconds (stopSample - 1));
136+
137+
setPlaybackStop(stopSample);
127138
}
128139

129140
currentNumTotalSamples = stopSample - startSample;
@@ -138,7 +149,6 @@ void FileReader::parameterValueChanged (Parameter* p)
138149
getScrubberInterface()->update();
139150
}
140151
}
141-
142152
}
143153

144154
void FileReader::handleLinkedParameterChange (Parameter* param, var newValue)
@@ -183,6 +193,9 @@ void FileReader::initialize (bool signalChainIsLoading)
183193
setPlaybackStop (input->getActiveNumSamples());
184194
setCurrentSample (0);
185195

196+
TimeParameter* startTime = static_cast<TimeParameter*> (getParameter ("start_time"));
197+
startTime->getTimeValue()->setMaxTimeInMilliseconds (samplesToMilliseconds (input->getActiveNumSamples() - 1));
198+
186199
TimeParameter* endTime = static_cast<TimeParameter*> (getParameter ("end_time"));
187200
endTime->getTimeValue()->setMaxTimeInMilliseconds (samplesToMilliseconds (input->getActiveNumSamples()));
188201
}

Source/Processors/FileReader/FileReaderActions.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ bool SelectFile::perform()
4444
TimeParameter* startTime = static_cast<TimeParameter*> (Parameter::parameterMap[startTimeKey]);
4545
TimeParameter* endTime = static_cast<TimeParameter*> (Parameter::parameterMap[endTimeKey]);
4646

47-
// Set the new path
47+
// Set the new path - this will trigger the linked parameter changes
4848
pathParam->setNextValue (newPath, false);
4949

5050
// Load the new file
@@ -66,12 +66,12 @@ bool SelectFile::perform()
6666
// Set the start time to the beginning of the file
6767
startTime->getTimeValue()->setTimeFromMilliseconds (0);
6868
startTime->setNextValue (startTime->getTimeValue()->toString(), false);
69-
processor->setPlaybackStart (originalStartTimeInMs * processor->getCurrentSampleRate() / 1000);
69+
processor->setPlaybackStart (0);
7070

7171
// Set the end time to the end of the file
7272
endTime->getTimeValue()->setTimeFromMilliseconds (int(fileDurationMs));
7373
endTime->setNextValue (endTime->getTimeValue()->toString(), false);
74-
processor->setPlaybackStop (originalEndTimeInMs * processor->getCurrentSampleRate() / 1000);
74+
processor->setPlaybackStop (fileDuration);
7575

7676
// Register the action in case the processor is deleted
7777
processor->registerUndoableAction (processor->getNodeId(), this);
@@ -81,11 +81,13 @@ bool SelectFile::perform()
8181

8282
bool SelectFile::undo()
8383
{
84+
// Get pointers to parameters
8485
PathParameter* pathParam = static_cast<PathParameter*> (Parameter::parameterMap[pathKey]);
86+
CategoricalParameter* activeStream = static_cast<CategoricalParameter*> (Parameter::parameterMap[streamKey]);
8587
TimeParameter* startTime = static_cast<TimeParameter*> (Parameter::parameterMap[startTimeKey]);
8688
TimeParameter* endTime = static_cast<TimeParameter*> (Parameter::parameterMap[endTimeKey]);
8789

88-
// Set the path to the original path
90+
// Set the path to the original path - this will trigger the linked parameter changes
8991
pathParam->setNextValue (originalPath, false);
9092

9193
// Load the original file

Source/Processors/Parameter/Parameter.cpp

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,6 @@ void Parameter::setOwner (ParameterOwner* parameterOwner_)
137137
Parameter::registerParameter (this);
138138
}
139139

140-
void Parameter::linkParameter (Parameter* child1, Parameter* child2)
141-
{
142-
linkedParameters.add (child1);
143-
linkedParameters.add (child2);
144-
}
145-
146140
void Parameter::setEnabled (bool enabled)
147141
{
148142
isEnabledFlag = enabled;
@@ -227,38 +221,48 @@ Parameter::ChangeValue::ChangeValue (std::string key_, var newValue_)
227221
: key (key_), newValue (newValue_)
228222
{
229223
Parameter* p = Parameter::parameterMap[key_];
230-
231-
originalValue = p->currentValue;
224+
if (p != nullptr)
225+
{
226+
originalValue = p->getValue();
227+
228+
// Store linked parameter states before the change
229+
if (p->isLinked())
230+
{
231+
p->storeLinkedStates();
232+
}
233+
}
232234
}
233235

234236
bool Parameter::ChangeValue::perform()
235237
{
236238
Parameter* p = Parameter::parameterMap[key];
237-
238-
if (! p->isEnabled() || p->currentValue == newValue)
239+
if (p == nullptr || !p->isEnabled() || p->getValue() == newValue)
239240
return false;
240241

241-
p->newValue = newValue;
242-
p->getOwner()->parameterChangeRequest (p);
243-
242+
p->setNextValue(newValue, false);
244243
p->valueChanged();
245244

246-
if (p->currentValue == p->previousValue)
247-
return false;
248-
else
245+
// Compare current value with new value to check if the change was effective
246+
if (p->getValue() == newValue)
249247
return true;
248+
else
249+
return false;
250250
}
251251

252252
bool Parameter::ChangeValue::undo()
253253
{
254254
Parameter* p = Parameter::parameterMap[key];
255+
if (p == nullptr)
256+
return false;
255257

256-
p->newValue = originalValue;
257-
p->getOwner()->parameterChangeRequest (p);
258-
258+
p->setNextValue(originalValue, false);
259259
p->valueChanged();
260260

261-
//p->logValueChange();
261+
// Restore linked parameter states
262+
if (p->isLinked())
263+
{
264+
p->restoreLinkedStates();
265+
}
262266

263267
return true;
264268
}
@@ -1448,6 +1452,7 @@ void TimeParameter::setNextValue (var newValue_, bool undoable)
14481452
{
14491453
currentValue = newValue;
14501454
timeValue->setTimeFromString (currentValue.toString());
1455+
getOwner()->parameterChangeRequest(this);
14511456
valueChanged();
14521457
}
14531458
}
@@ -1468,32 +1473,49 @@ TimeParameter::ChangeValue::ChangeValue (std::string key_, var newValue_)
14681473
: key (key_), newValue (newValue_)
14691474
{
14701475
Parameter* p = Parameter::parameterMap[key_];
1471-
originalValue = p->currentValue;
1476+
if (p != nullptr)
1477+
{
1478+
originalValue = p->getValue();
1479+
1480+
// Store linked parameter states before the change
1481+
if (p->isLinked())
1482+
{
1483+
p->storeLinkedStates();
1484+
}
1485+
}
14721486
}
14731487

14741488
bool TimeParameter::ChangeValue::perform()
14751489
{
1476-
TimeParameter* p = (TimeParameter*) Parameter::parameterMap[key];
1477-
p->getTimeValue()->setTimeFromString (newValue.toString());
1478-
1479-
p->newValue = newValue;
1480-
p->getOwner()->parameterChangeRequest (p);
1490+
Parameter* p = Parameter::parameterMap[key];
1491+
if (p == nullptr || !p->isEnabled() || p->getValue() == newValue)
1492+
return false;
14811493

1494+
p->setNextValue(newValue, false);
14821495
p->valueChanged();
14831496

1484-
return true;
1497+
// Compare current value with new value to check if the change was effective
1498+
if (p->getValue() == newValue)
1499+
return true;
1500+
else
1501+
return false;
14851502
}
14861503

14871504
bool TimeParameter::ChangeValue::undo()
14881505
{
1489-
TimeParameter* p = (TimeParameter*) Parameter::parameterMap[key];
1490-
p->getTimeValue()->setTimeFromString (originalValue.toString());
1491-
1492-
p->newValue = originalValue;
1493-
p->getOwner()->parameterChangeRequest (p);
1506+
Parameter* p = Parameter::parameterMap[key];
1507+
if (p == nullptr)
1508+
return false;
14941509

1510+
p->setNextValue(originalValue, false);
14951511
p->valueChanged();
14961512

1513+
// Restore linked parameter states
1514+
if (p->isLinked())
1515+
{
1516+
p->restoreLinkedStates();
1517+
}
1518+
14971519
return true;
14981520
}
14991521

Source/Processors/Parameter/Parameter.h

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -336,11 +336,68 @@ class PLUGIN_API Parameter
336336
/** Broadcasts a value change to all listeners */
337337
void valueChanged();
338338

339-
/** Links this parameter to another parameter */
340-
void linkParameter (Parameter* first, Parameter* second = nullptr);
339+
/** Class to store the state of a linked parameter */
340+
class LinkedParameterState
341+
{
342+
public:
343+
LinkedParameterState(Parameter* param, var value)
344+
: parameter(param), value(value) {}
345+
346+
Parameter* parameter;
347+
var value;
348+
};
349+
350+
/** Links this parameter to another parameter and stores its state */
351+
void linkParameter(Parameter* param)
352+
{
353+
if (param != nullptr && !linkedParameters.contains(param))
354+
{
355+
linkedParameters.add(param);
356+
}
357+
}
358+
359+
/** Links this parameter to an array of parameters */
360+
void linkParameters(const Array<Parameter*>& params)
361+
{
362+
for (auto* param : params)
363+
{
364+
if (param != nullptr)
365+
{
366+
linkParameter(param);
367+
}
368+
}
369+
}
341370

342371
/** Returns true if this parameter is linked to another parameter */
343-
bool isLinked() { return linkedParameters.size() > 0; }
372+
bool isLinked() const { return linkedParameters.size() > 0; }
373+
374+
/** Stores the current state of all linked parameters */
375+
void storeLinkedStates()
376+
{
377+
linkedParameterStates.clear();
378+
for (auto* param : linkedParameters)
379+
{
380+
if (param != nullptr)
381+
{
382+
linkedParameterStates.add(new LinkedParameterState(param, param->getValue()));
383+
}
384+
}
385+
}
386+
387+
/** Restores the stored state of all linked parameters */
388+
void restoreLinkedStates()
389+
{
390+
for (auto* state : linkedParameterStates)
391+
{
392+
if (state != nullptr && state->parameter != nullptr)
393+
{
394+
state->parameter->setNextValue(state->value, false);
395+
}
396+
}
397+
}
398+
399+
/** Returns the array of linked parameters */
400+
const Array<Parameter*>& getLinkedParameters() const { return linkedParameters; }
344401

345402
/** Makes it possible to undo value changes */
346403
class PLUGIN_API ChangeValue : public UndoableAction
@@ -363,7 +420,6 @@ class PLUGIN_API Parameter
363420

364421
private:
365422
std::string key;
366-
367423
var originalValue;
368424
var newValue;
369425
bool logChange = false;
@@ -373,27 +429,23 @@ class PLUGIN_API Parameter
373429

374430
protected:
375431
ParameterOwner* parameterOwner;
376-
377432
var newValue;
378433
var previousValue;
379-
380434
var defaultValue;
435+
Array<Listener*> parameterListeners;
436+
Array<Parameter*> linkedParameters;
437+
Array<LinkedParameterState*> linkedParameterStates;
381438

382439
private:
383440
std::string m_identifier;
384-
385441
ParameterType m_parameterType;
386442
ParameterScope m_parameterScope;
387443
ParameterEditorType m_editorType;
388444
String m_name;
389445
String m_displayName;
390446
String m_description;
391-
392447
bool m_deactivateDuringAcquisition;
393448
bool isEnabledFlag;
394-
395-
Array<Listener*> parameterListeners;
396-
Array<Parameter*> linkedParameters;
397449
};
398450

399451
/**

Source/Processors/Parameter/ParameterCollection.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,17 @@ void ParameterCollection::clear()
339339
parameterMap.clear();
340340
}
341341

342-
void ParameterCollection::linkParameters (Parameter* parent, Parameter* child1, Parameter* child2)
342+
void ParameterCollection::linkParameters(Parameter* parent, Parameter* child1, Parameter* child2)
343343
{
344-
parent->linkParameter (child1, child2);
344+
if (parent != nullptr)
345+
{
346+
if (child1 != nullptr)
347+
{
348+
parent->linkParameter(child1);
349+
}
350+
if (child2 != nullptr)
351+
{
352+
parent->linkParameter(child2);
353+
}
354+
}
345355
}

0 commit comments

Comments
 (0)