diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2018-11-24 12:29:25 +0100 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2018-11-24 12:29:25 +0100 |
commit | cf2311b09f788447d1c079274405477992eee9e8 (patch) | |
tree | 2e1e2621f84f525d704d822ce1382280227fcdc6 | |
parent | f7b23621bd749412407dab214083a6c4c70dfbb1 (diff) |
Make midnam threadsafe.
-rw-r--r-- | pluginlv2.cc | 22 | ||||
-rw-r--r-- | pluginlv2.h | 8 |
2 files changed, 21 insertions, 9 deletions
diff --git a/pluginlv2.cc b/pluginlv2.cc index 6474d5c..d12c0e7 100644 --- a/pluginlv2.cc +++ b/pluginlv2.cc @@ -39,6 +39,15 @@ #include <lv2/lv2plug.in/ns/ext/midi/midi.h> #include <lv2/lv2plug.in/ns/ext/instance-access/instance-access.h> +void PluginLV2::init() +{ + for(auto& m : midnamData) + { + m.first = -1; // Mark midnam slot as unsued. + m.second.reserve(64); // Reserve 64 characters for the midnam name. + } +} + bool PluginLV2::getFreeWheel() const { return free_wheel; @@ -363,10 +372,10 @@ void PluginLV2::run(LV2_Handle instance, uint32_t sample_count) plugin_lv2->pos += sample_count; #ifdef MIDNAM_INTERFACE - if(plugin_lv2->midnam && plugin_lv2->midnam_changed) + if(plugin_lv2->midnam && plugin_lv2->midnam_changed.load()) { plugin_lv2->midnam->update(plugin_lv2->midnam->handle); - plugin_lv2->midnam_changed = false; + plugin_lv2->midnam_changed.store(false); } #endif @@ -490,14 +499,17 @@ void PluginLV2::setMidnamData(const std::vector<std::pair<int, std::string>>& mi auto idx = 0u; for(const auto& m : midnam) { - this->midnamData[idx] = m; + midnamData[idx].first = m.first; + // Duplicate name making sure no reallocation is being performed. + midnamData[idx].second = + m.second.substr(0, midnamData[idx].second.capacity() - 1); idx++; } for(;idx < this->midnamData.size(); ++idx) { - this->midnamData[idx] = {-1, {}}; + midnamData[idx].first = -1; // Mark as unused } - midnam_changed = true; + midnam_changed.store(true); } #ifdef MIDNAM_INTERFACE diff --git a/pluginlv2.h b/pluginlv2.h index 43563cc..2ff2226 100644 --- a/pluginlv2.h +++ b/pluginlv2.h @@ -29,6 +29,7 @@ #include <plugin.h> #include <array> +#include <atomic> #include <lv2/lv2plug.in/ns/lv2core/lv2.h> #include <lv2/lv2plug.in/ns/ext/urid/urid.h> @@ -62,7 +63,7 @@ public: virtual ~PluginLV2() = default; //! Not used in LV2 - void init() override {} + void init() override; //! Get current free-wheel mode. bool getFreeWheel() const override; @@ -271,9 +272,8 @@ private: static char* MidnamModel (LV2_Handle instance); static void MidnamFree (char*); #endif - // TODO:: Make this list thread safe! - std::array<std::pair<int, std::string>, 127> midnamData; - volatile bool midnam_changed{false}; + std::atomic<bool> midnam_changed{false}; + std::array<std::pair<int, std::string>, 127> midnamData; // At most 127 different midinotes. bool active{false}; |