gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

commit 78a5dc943310487a23d49e1ca12384c09328ce0c
parent eaf5c25db3ece56521f6cdf5b2653da1af591af6
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Thu,  7 Apr 2022 21:05:12 +0200

fix knobs modifying multiple parts in multi mode after having some parts selected

Diffstat:
Msource/jucePlugin/VirusParameterBinding.cpp | 29++++++++++++++++++++++++++++-
Msource/jucePlugin/VirusParameterBinding.h | 4++++
2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/source/jucePlugin/VirusParameterBinding.cpp b/source/jucePlugin/VirusParameterBinding.cpp @@ -12,7 +12,15 @@ VirusParameterBinding::~VirusParameterBinding() void VirusParameterBinding::clearBindings() { for (const auto b : m_bindings) + { + auto* slider = dynamic_cast<juce::Slider*>(b.component); + + if(slider != nullptr) + removeMouseListener(*slider); + b.parameter->onValueChanged = nullptr; + } + m_bindings.clear(); } @@ -67,12 +75,19 @@ void VirusParameterBinding::bind(juce::Slider &_slider, Virus::ParameterType _pa void VirusParameterBinding::bind(juce::Slider &_slider, Virus::ParameterType _param, const uint8_t _part) { const auto v = m_processor.getController().getParameter(_param, _part == CurrentPart ? m_processor.getController().getCurrentPart() : _part); + if (!v) { assert(false && "Failed to find parameter"); return; } - _slider.addMouseListener(new VirusParameterBindingMouseListener(v, _slider), false); + + removeMouseListener(_slider); + + auto* listener = new VirusParameterBindingMouseListener(v, _slider); + m_sliderMouseListeners.insert(std::make_pair(&_slider, listener)); + + _slider.addMouseListener(listener, false); const auto range = v->getNormalisableRange(); _slider.setRange(range.start, range.end, range.interval); _slider.setDoubleClickReturnValue(true, v->convertFrom0to1(v->getDefaultValue())); @@ -147,3 +162,15 @@ void VirusParameterBinding::bind(juce::Button &_btn, const Virus::ParameterType const BoundParameter p{v, &_btn, _param, CurrentPart}; m_bindings.emplace_back(p); } + +void VirusParameterBinding::removeMouseListener(juce::Slider& _slider) +{ + auto it = m_sliderMouseListeners.find(&_slider); + + if(it != m_sliderMouseListeners.end()) + { + _slider.removeMouseListener(it->second); + delete it->second; + m_sliderMouseListeners.erase(it); + } +} diff --git a/source/jucePlugin/VirusParameterBinding.h b/source/jucePlugin/VirusParameterBinding.h @@ -36,6 +36,9 @@ public: void bind(juce::ComboBox &_control, Virus::ParameterType _param, uint8_t _part); void bind(juce::Button &_control, Virus::ParameterType _param); +private: + void removeMouseListener(juce::Slider& _slider); + AudioPluginAudioProcessor& m_processor; static constexpr uint8_t CurrentPart = 0xff; @@ -49,4 +52,5 @@ public: }; std::vector<BoundParameter> m_bindings; + std::map<juce::Slider*, MouseListener*> m_sliderMouseListeners; };