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 7294d7c361b43b7195849bd4315f2844069874fc
parent f2a9045627f43b34a82af34f55d5425e86e9ecd3
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Sat, 13 Jul 2024 15:44:37 +0200

fix patch manager didn't always restore the selected patch

Diffstat:
Mdoc/changelog.txt | 4++++
Msource/jucePluginEditorLib/patchmanager/patchmanager.cpp | 22++++++++++++----------
Msource/jucePluginEditorLib/patchmanager/patchmanager.h | 1+
Msource/jucePluginLib/patchdb/db.cpp | 24++++++++++++------------
Msource/jucePluginLib/patchdb/db.h | 3++-
5 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/doc/changelog.txt b/doc/changelog.txt @@ -2,6 +2,10 @@ Release Notes 1.3.16 +Framework: + +- [Fix] Patch Manager: Last selected patch was not always restored properly + Vavra: - [Imp] Performance improvements diff --git a/source/jucePluginEditorLib/patchmanager/patchmanager.cpp b/source/jucePluginEditorLib/patchmanager/patchmanager.cpp @@ -154,24 +154,26 @@ namespace jucePluginEditorLib::patchManager void PatchManager::timerCallback() { - pluginLib::patchDB::Dirty dirty; - uiProcess(dirty); + uiProcess(); + } - m_treeDS->processDirty(dirty); - m_treeTags->processDirty(dirty); - m_list->processDirty(dirty); + void PatchManager::processDirty(const pluginLib::patchDB::Dirty& _dirty) const + { + m_treeDS->processDirty(_dirty); + m_treeTags->processDirty(_dirty); + m_list->processDirty(_dirty); m_status->setScanning(isScanning()); - m_info->processDirty(dirty); + m_info->processDirty(_dirty); - if(!dirty.errors.empty()) + if(!_dirty.errors.empty()) { std::string msg = "Patch Manager encountered errors:\n\n"; - for(size_t i=0; i<dirty.errors.size(); ++i) + for(size_t i=0; i<_dirty.errors.size(); ++i) { - msg += dirty.errors[i]; - if(i < dirty.errors.size() - 1) + msg += _dirty.errors[i]; + if(i < _dirty.errors.size() - 1) msg += "\n"; } diff --git a/source/jucePluginEditorLib/patchmanager/patchmanager.h b/source/jucePluginEditorLib/patchmanager/patchmanager.h @@ -38,6 +38,7 @@ namespace jucePluginEditorLib::patchManager ~PatchManager() override; void timerCallback() override; + void processDirty(const pluginLib::patchDB::Dirty& _dirty) const override; void setSelectedItem(Tree* _tree, const TreeItem* _item); void addSelectedItem(Tree* _tree, const TreeItem* _item); diff --git a/source/jucePluginLib/patchdb/db.cpp b/source/jucePluginLib/patchdb/db.cpp @@ -350,18 +350,27 @@ namespace pluginLib::patchDB return true; } - void DB::uiProcess(Dirty& _dirty) + void DB::uiProcess() { std::list<std::function<void()>> uiFuncs; + + Dirty dirty; { std::scoped_lock lock(m_uiMutex); std::swap(uiFuncs, m_uiFuncs); - _dirty = m_dirty; - m_dirty = {}; + std::swap(dirty, m_dirty); } + processDirty(dirty); + for (const auto& func : uiFuncs) func(); + + if(isLoading() && !m_loader.pending()) + { + m_loading = false; + onLoadFinished(); + } } uint32_t DB::search(SearchRequest&& _request, SearchCallback&& _callback) @@ -811,15 +820,6 @@ namespace pluginLib::patchDB m_loader.add([this, f = std::move(_func)] { f(); - - if(isLoading() && !m_loader.pending()) - { - runOnUiThread([this] - { - m_loading = false; - onLoadFinished(); - }); - } }); } diff --git a/source/jucePluginLib/patchdb/db.h b/source/jucePluginLib/patchdb/db.h @@ -28,7 +28,7 @@ namespace pluginLib::patchDB DB(juce::File _dir); virtual ~DB(); - void uiProcess(Dirty& _dirty); + void uiProcess(); DataSourceNodePtr addDataSource(const DataSource& _ds, const DataSourceLoadedCallback& = [](bool, std::shared_ptr<DataSourceNode>) {}); void removeDataSource(const DataSource& _ds, bool _save = true); @@ -99,6 +99,7 @@ namespace pluginLib::patchDB virtual Data prepareSave(const PatchPtr& _patch) const = 0; virtual bool parseFileData(DataList& _results, const Data& _data); virtual bool equals(const PatchPtr& _a, const PatchPtr& _b) const = 0; + virtual void processDirty(const Dirty& _dirty) const = 0; protected: virtual void onLoadFinished() {}