summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2018-11-24 12:29:25 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2018-11-24 12:29:25 +0100
commitcf2311b09f788447d1c079274405477992eee9e8 (patch)
tree2e1e2621f84f525d704d822ce1382280227fcdc6
parentf7b23621bd749412407dab214083a6c4c70dfbb1 (diff)
Make midnam threadsafe.
-rw-r--r--pluginlv2.cc22
-rw-r--r--pluginlv2.h8
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};