BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

commit 2e781aab5db36091ddfd3b871559125aab3367f9
parent e23ff6efcb2e863ac14a01103292317eea300b46
Author: Matt Demanett <matt@demanett.net>
Date:   Mon, 18 Jul 2022 20:15:13 -0400

ADDR-SEQ: fix crash on moving ASX around very quickly. #206

Diffstat:
Msrc/expanders.hpp | 16+++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/expanders.hpp b/src/expanders.hpp @@ -179,7 +179,7 @@ public: _bases.erase(id); } - void registerExpander(int baseID, int position, ChainableExpander& x) { + bool registerExpander(int baseID, int position, ChainableExpander& x) { std::lock_guard<std::mutex> lock(_lock); assert(position > 0); @@ -187,20 +187,23 @@ public: if (base != _bases.end()) { int i = N * position; if (i < (int)base->second.elements.size()) { - assert(!base->second.elements[i]); - std::copy(x._localElements, x._localElements + N, base->second.elements.begin() + i); + if (base->second.elements[i]) { + return false; + } } else { base->second.elements.resize(i + N, NULL); - std::copy(x._localElements, x._localElements + N, base->second.elements.begin() + i); } + std::copy(x._localElements, x._localElements + N, base->second.elements.begin() + i); + for (auto i = base->second.elements.begin(), n = base->second.elements.end(); i != n; ++i) { if (!*i) { - return; + return true; } } base->second.module.setElements(base->second.elements); } + return true; } void deregisterExpander(int baseID, int position) { @@ -277,11 +280,10 @@ struct ChainableExpanderModule _baseID = 0; _position = 0; } - else if (!_registered && position > 0) { + else if (!_registered && position > 0 && _registry.registerExpander(baseID, position, *this)) { _registered = true; _baseID = baseID; _position = position; - _registry.registerExpander(_baseID, _position, *this); } } };