Skip to content

Commit 6edfd3d

Browse files
committed
Preserve sequencer step when saving plugin's global state.
1 parent a660808 commit 6edfd3d

File tree

3 files changed

+30
-13
lines changed

3 files changed

+30
-13
lines changed

Source/aeolus/division.cpp

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,11 @@ int Division::getLinksCount() const noexcept
189189
void Division::enableLink(int i, bool ena)
190190
{
191191
jassert(isPositiveAndBelow(i, _linkedDivisions.size()));
192-
_linkedDivisions[i].enabled = ena;
193-
_engine.getSequencer()->setCurrentStepDirty();
192+
193+
if (_linkedDivisions[i].enabled != ena) {
194+
_linkedDivisions[i].enabled = ena;
195+
_engine.getSequencer()->setCurrentStepDirty();
196+
}
194197
}
195198

196199
bool Division::isLinkEnabled(int i)
@@ -207,10 +210,17 @@ Division::Link& Division::getLinkByIndex(int i)
207210

208211
void Division::cancelAllLinks()
209212
{
210-
for (auto& link : _linkedDivisions)
211-
link.enabled = false;
213+
bool changed{ false };
212214

213-
_engine.getSequencer()->setCurrentStepDirty();
215+
for (auto& link : _linkedDivisions) {
216+
if (link.enabled) {
217+
changed = true;
218+
link.enabled = false;
219+
}
220+
}
221+
222+
if (changed)
223+
_engine.getSequencer()->setCurrentStepDirty();
214224
}
215225

216226
void Division::clear()
@@ -252,9 +262,11 @@ void Division::enableStop(int i, bool ena)
252262
{
253263
jassert(isPositiveAndBelow(i, _stops.size()));
254264

255-
_stops[i].setEnabled(ena);
265+
if (_stops[i].isEnabled() != ena) {
266+
_stops[i].setEnabled(ena);
256267

257-
_engine.getSequencer()->setCurrentStepDirty();
268+
_engine.getSequencer()->setCurrentStepDirty();
269+
}
258270
}
259271

260272
bool Division::isStopEnabled(int i) const
@@ -304,10 +316,12 @@ void Division::setTremulantEnabled(bool ena) noexcept
304316
if (!_hasTremulant)
305317
return;
306318

307-
_tremulantEnabled = ena;
308-
_tremulantTargetLevel = _tremulantEnabled ? _tremulantMaxLevel : 0.0f;
319+
if (_tremulantEnabled != ena) {
320+
_tremulantEnabled = ena;
321+
_tremulantTargetLevel = _tremulantEnabled ? _tremulantMaxLevel : 0.0f;
309322

310-
_engine.getSequencer()->setCurrentStepDirty();
323+
_engine.getSequencer()->setCurrentStepDirty();
324+
}
311325
}
312326

313327
float Division::getTremulantLevel(bool update)

Source/aeolus/engine.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -672,9 +672,6 @@ void Engine::setPersistentState(const var& state)
672672
// Restore the sequencer
673673
_sequencer->setPersistentState(obj->getProperty("sequencer"));
674674

675-
// The divisions state may be different from the sequencer, so we mark it dirty
676-
_sequencer->setCurrentStepDirty();
677-
678675
// Restore the divisions after the sequencer (in case we are restoring
679676
// from a state that did not have a sequencer before).
680677
if (const auto* divisions = obj->getProperty("divisions").getArray()) {

Source/aeolus/sequencer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ var Sequencer::getPersistentState() const
122122

123123
sequencerObj->setProperty("steps", stepsArr);
124124
sequencerObj->setProperty("current_step", getCurrentStep());
125+
sequencerObj->setProperty("dirty", _dirty);
125126

126127
return var{sequencerObj};
127128
}
@@ -144,6 +145,11 @@ void Sequencer::setPersistentState(const var& v)
144145
// and should not go into the sequencer.
145146
setStep(currentStep, false);
146147
}
148+
149+
setCurrentStepDirty();
150+
151+
if (auto&& v = sequencerObj->getProperty("dirty"); v.isBool())
152+
_dirty = (bool)v;
147153
}
148154
}
149155

0 commit comments

Comments
 (0)