DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit 3ac6338a3142475e02e2ba910ae86e57f9a9e035
parent 496b888d08fb0a08d7ec24c0378dc4a89ffe460e
Author: falkTX <falktx@gmail.com>
Date:   Thu, 21 Aug 2014 01:28:28 +0100

Need to have default state values; LV2 states proved 100% working

Diffstat:
Mdistrho/DistrhoPlugin.hpp | 4++--
Mdistrho/src/DistrhoPlugin.cpp | 5+++--
Mdistrho/src/DistrhoPluginInternal.hpp | 17++++++++++++++++-
Mdistrho/src/DistrhoPluginLV2.cpp | 22+++++++++++++++-------
Mdistrho/src/DistrhoPluginVST.cpp | 20++++++++++++--------
5 files changed, 48 insertions(+), 20 deletions(-)

diff --git a/distrho/DistrhoPlugin.hpp b/distrho/DistrhoPlugin.hpp @@ -523,11 +523,11 @@ protected: #if DISTRHO_PLUGIN_WANT_STATE /** - Set the key name of the state @a index. + Set the state key and default value of @a index. This function will be called once, shortly after the plugin is created. Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. */ - virtual void d_initStateKey(uint32_t index, d_string& stateKey) = 0; + virtual void d_initState(uint32_t index, d_string& stateKey, d_string& defaultStateValue) = 0; #endif /* -------------------------------------------------------------------------------------------------------- diff --git a/distrho/src/DistrhoPlugin.cpp b/distrho/src/DistrhoPlugin.cpp @@ -55,8 +55,9 @@ Plugin::Plugin(const uint32_t parameterCount, const uint32_t programCount, const #if DISTRHO_PLUGIN_WANT_STATE if (stateCount > 0) { - pData->stateCount = stateCount; - pData->stateKeys = new d_string[stateCount]; + pData->stateCount = stateCount; + pData->stateKeys = new d_string[stateCount]; + pData->stateDefValues = new d_string[stateCount]; } #else DISTRHO_SAFE_ASSERT(stateCount == 0); diff --git a/distrho/src/DistrhoPluginInternal.hpp b/distrho/src/DistrhoPluginInternal.hpp @@ -49,6 +49,7 @@ struct Plugin::PrivateData { #if DISTRHO_PLUGIN_WANT_STATE uint32_t stateCount; d_string* stateKeys; + d_string* stateDefValues; #endif #if DISTRHO_PLUGIN_WANT_LATENCY @@ -73,6 +74,7 @@ struct Plugin::PrivateData { #if DISTRHO_PLUGIN_WANT_STATE stateCount(0), stateKeys(nullptr), + stateDefValues(nullptr), #endif #if DISTRHO_PLUGIN_WANT_LATENCY latency(0), @@ -106,6 +108,12 @@ struct Plugin::PrivateData { delete[] stateKeys; stateKeys = nullptr; } + + if (stateDefValues != nullptr) + { + delete[] stateDefValues; + stateDefValues = nullptr; + } #endif } }; @@ -134,7 +142,7 @@ public: #if DISTRHO_PLUGIN_WANT_STATE for (uint32_t i=0, count=fData->stateCount; i < count; ++i) - fPlugin->d_initStateKey(i, fData->stateKeys[i]); + fPlugin->d_initState(i, fData->stateKeys[i], fData->stateDefValues[i]); #endif } @@ -305,6 +313,13 @@ public: return fData->stateKeys[index]; } + const d_string& getStateDefaultValue(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->stateCount, sFallbackString); + + return fData->stateDefValues[index]; + } + void setState(const char* const key, const char* const value) { DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); diff --git a/distrho/src/DistrhoPluginLV2.cpp b/distrho/src/DistrhoPluginLV2.cpp @@ -48,7 +48,7 @@ START_NAMESPACE_DISTRHO -typedef std::map<d_string,d_string> StringMap; +typedef std::map<const d_string,d_string> StringMap; // ----------------------------------------------------------------------- @@ -114,7 +114,12 @@ public: fNeededUiSends = new bool[count]; for (uint32_t i=0; i < count; ++i) + { fNeededUiSends[i] = false; + + const d_string& d_key(fPlugin.getStateKey(i)); + fStateMap[d_key] = fPlugin.getStateDefaultValue(i); + } } else { @@ -592,7 +597,10 @@ public: const d_string& key = cit->first; const d_string& value = cit->second; - store(handle, fUridMap->map(fUridMap->handle, key.buffer()), value.buffer(), value.length(), fURIDs.atomString, LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE); + const d_string urnKey("urn:distrho:" + key); + + // some hosts need +1 for the null terminator, even though the type is string + store(handle, fUridMap->map(fUridMap->handle, urnKey.buffer()), value.buffer(), value.length()+1, fURIDs.atomString, LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE); } return LV2_STATE_SUCCESS; @@ -606,11 +614,12 @@ public: for (uint32_t i=0, count=fPlugin.getStateCount(); i < count; ++i) { const d_string& key(fPlugin.getStateKey(i)); + const d_string urnKey("urn:distrho:" + key); size = 0; type = 0; flags = LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE; - const void* data = retrieve(handle, fUridMap->map(fUridMap->handle, key.buffer()), &size, &type, &flags); + const void* data = retrieve(handle, fUridMap->map(fUridMap->handle, urnKey.buffer()), &size, &type, &flags); if (data == nullptr || size == 0) continue; @@ -618,7 +627,8 @@ public: DISTRHO_SAFE_ASSERT_CONTINUE(type == fURIDs.atomString); const char* const value((const char*)data); - DISTRHO_SAFE_ASSERT_CONTINUE(std::strlen(value) == size); + const std::size_t length(std::strlen(value)); + DISTRHO_SAFE_ASSERT_CONTINUE(length == size || length+1 == size); setState(key, value); @@ -762,9 +772,7 @@ private: } } - // nope, add a new one then - d_string d_key(key); - fStateMap[d_key] = newValue; + d_stderr("Failed to find plugin state with key \"%s\"", key); } #endif diff --git a/distrho/src/DistrhoPluginVST.cpp b/distrho/src/DistrhoPluginVST.cpp @@ -65,7 +65,7 @@ struct ERect { START_NAMESPACE_DISTRHO -typedef std::map<d_string,d_string> StringMap; +typedef std::map<const d_string,d_string> StringMap; // ----------------------------------------------------------------------- @@ -311,6 +311,12 @@ public: #if DISTRHO_PLUGIN_WANT_STATE fStateChunk = nullptr; + + for (uint32_t i=0, count=fPlugin.getStateCount(); i<count; ++i) + { + const d_string& d_key(fPlugin.getStateKey(i)); + fStateMap[d_key] = fPlugin.getStateDefaultValue(i); + } #endif } @@ -745,12 +751,12 @@ private: // ------------------------------------------------------------------- // functions called from the UI side, may block - void setStateFromUi(const char* const newKey, const char* const newValue) override + void setStateFromUi(const char* const key, const char* const newValue) override { - fPlugin.setState(newKey, newValue); + fPlugin.setState(key, newValue); // check if we want to save this key - if (! fPlugin.wantStateKey(newKey)) + if (! fPlugin.wantStateKey(key)) return; // check if key already exists @@ -758,16 +764,14 @@ private: { const d_string& d_key(it->first); - if (d_key == newKey) + if (d_key == key) { it->second = newValue; return; } } - // nope, add a new one then - d_string d_key(newKey); - fStateMap[d_key] = newValue; + d_stderr("Failed to find plugin state with key \"%s\"", key); } #endif };